[ABAP] Daten einer internen Tabelle als Excel-Datei speichern (xco_cp_xlsx)

TYPES: BEGIN OF ty_xl_sheet,
         col1 TYPE string,
         col2 TYPE string,
         col3 TYPE string,
       END OF ty_xl_sheet.

TYPES: ty_it_users TYPE STANDARD TABLE OF ty_xl_sheet WITH DEFAULT KEY.

TRY.
* leeres Excel-Dokument
    DATA(o_xl) = xco_cp_xlsx=>document->empty( )->write_access( ).

* 1. Sheet holen
    DATA(o_sheet) = o_xl->get_workbook( )->worksheet->at_position( 1 ).

    IF abap_true = o_sheet->exists( ).

* neuen Namen für Sheet setzen
      o_sheet->set_name( 'Test1' ).

* Daten
      DATA(it_sheet_data) = VALUE ty_it_users( ( col1 = 'Name' col2 = 'Adr.' col3 = 'Age' )
                                               ( col1 = 'Ulf'  col2 = 'Str. 1' col3 = '22' )
                                               ( col1 = 'Ida'  col2 = 'Str. 2' col3 = '21' ) ).

* komplette Sheet auswählen
      DATA(o_sel_pattern) = xco_cp_xlsx_selection=>pattern_builder->simple_from_to( )->get_pattern( ).

* Daten einfügen
      DATA(o_result) = o_sheet->select( o_sel_pattern
                                      )->row_stream(
                                      )->operation->write_from( REF #( it_sheet_data )
                                      )->execute( ).

      IF abap_true = o_result->succeeded.
* Daten als XSTRING (Excel-Datei holen)
        DATA(lv_xl_xtsr) = o_xl->get_file_content( ).

* xstring -> itab (bytes)
        DATA: lv_size TYPE i.
        DATA: it_raw_data TYPE xml_rawdata.

* xstring (Bytes) -> RAW (iTab)
        cl_scp_change_db=>xstr_to_xtab( EXPORTING im_xstring = lv_xl_xtsr
                                        IMPORTING ex_size    = lv_size
                                                  ex_xtab    = it_raw_data ).

        IF lines( it_raw_data ) > 0.
          DATA: lv_action TYPE i.
          DATA: lv_filename TYPE string.
          DATA: lv_fullpath TYPE string.
          DATA: lv_path TYPE string.

* SaveDialog aufrufen
          cl_gui_frontend_services=>file_save_dialog( EXPORTING default_extension   = 'xlsx'
                                                                default_file_name   = 'export.xlsx'
                                                                file_filter         = |Excel-Datei (*.xlsx)\|*.xlsx\|{ cl_gui_frontend_services=>filetype_all }|
                                                                prompt_on_overwrite = abap_true
                                                      CHANGING  filename            = lv_filename
                                                                path                = lv_path
                                                                fullpath            = lv_fullpath
                                                                user_action         = lv_action ).

          IF lv_action EQ cl_gui_frontend_services=>action_ok.
* iTab (bytes) -> lokale Datei
            cl_gui_frontend_services=>gui_download( EXPORTING filename     = lv_fullpath
                                                              filetype     = 'BIN'
                                                              bin_filesize = lv_size " Size ist wichtig für das korrekte Schreiben der Excel-Datei
                                                    CHANGING  data_tab     = it_raw_data ).
* lokale Datei im Excel aufrufen
* parameter muss wegen möglicher Leerzeichen im Pfad mit "" quotiert werden
            cl_gui_frontend_services=>execute( application = 'excel.exe'
                                               parameter   = |"{ lv_fullpath }"| ).
          ENDIF.

        ELSE.

* Fehlerbehandlung
          LOOP AT o_result->messages INTO DATA(o_msg).
            WRITE: / o_msg->get_text( ).
          ENDLOOP.

        ENDIF.
      ENDIF.
    ENDIF.

  CATCH cx_root INTO DATA(e_text).
    MESSAGE e_text->get_text( ) TYPE 'S' DISPLAY LIKE 'E'.
ENDTRY.

Links

[ABAP] xstring nach RAW (binary) wandeln

Variante 1 (cl_bcs_convert)

DATA: lv_xstr TYPE xstring VALUE 'A0B0C0'.

DATA(it_raw_data) = cl_bcs_convert=>xstring_to_solix( EXPORTING iv_xstring = lv_xstr ).

Variante 2 (SCMS_XSTRING_TO_BINARY)

DATA: lv_xstr TYPE xstring VALUE 'A0B0C0'.
DATA: it_bin_data TYPE STANDARD TABLE OF raw255.

* xstring -> RAW (binary)
CALL FUNCTION 'SCMS_XSTRING_TO_BINARY'
  EXPORTING
    buffer     = lv_xstr
  TABLES
    binary_tab = it_bin_data.

Variante 3 (cl_swf_utl_convert_xstring)

DATA: lv_xstr TYPE xstring VALUE 'A0B0C0'.
DATA: it_bin_data TYPE STANDARD TABLE OF raw255.

* xstring -> RAW (binary)
cl_swf_utl_convert_xstring=>xstring_to_table( EXPORTING
                                                i_stream = lv_xstr
                                              IMPORTING
                                                e_table  = it_bin_data ).

Variante 4 (cl_scp_change_db)

DATA: lv_size TYPE i.
DATA: lv_xstr TYPE xstring VALUE 'A0B0C0'.
DATA: it_bin_data TYPE STANDARD TABLE OF raw255.

* XString (Bytes) -> RAW (iTab)
cl_scp_change_db=>xstr_to_xtab( EXPORTING
                                  im_xstring = lv_xstr
                                IMPORTING
                                  ex_size    = lv_size
                                  ex_xtab    = it_bin_data ).

[ABAP] RAW (binary) nach xstring wandeln

Variante 1 (SCMS_BINARY_TO_XSTRING)

DATA: it_bin_data TYPE STANDARD TABLE OF raw255. " iTab mit Binärdaten
DATA: lv_bytes TYPE i.                           " reale Länge der Daten in Bytes
DATA: lv_xstr_result TYPE xstring.

...

CALL FUNCTION 'SCMS_BINARY_TO_XSTRING'
  EXPORTING
    input_length = lv_bytes
  IMPORTING
    buffer       = lv_xstr_result
  TABLES
    binary_tab   = it_bin_data
  EXCEPTIONS
    failed       = 1
    OTHERS       = 2.

IF sy-subrc NE 0.
  MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.

Variante 2 (cl_swf_utl_convert_xstring)

DATA: lv_size TYPE i.
DATA: it_raw_data TYPE STANDARD TABLE OF raw255.

cl_gui_frontend_services=>gui_upload( EXPORTING
                                        filename     = 'c:\temp\binaryfile.dat'
                                        filetype     = 'BIN'
                                        read_by_line = space
                                      IMPORTING
                                        filelength   = lv_size
                                      CHANGING
                                        data_tab     = it_raw_data ).

DATA(lv_xlsx_str) = cl_swf_utl_convert_xstring=>table_to_xstring( i_table = it_raw_data
                                                                  i_size  = lv_size ).

Variante 3 (cl_scp_change_db)

DATA: lv_size TYPE i.
DATA: it_raw_data TYPE STANDARD TABLE OF raw255.
DATA: lv_xstr_result TYPE xstring.

cl_gui_frontend_services=>gui_upload( EXPORTING
                                        filename     = 'c:\temp\binaryfile.dat'
                                        filetype     = 'BIN'
                                        read_by_line = space
                                      IMPORTING
                                        filelength   = lv_size
                                      CHANGING
                                        data_tab     = it_raw_data ).
                                        
cl_scp_change_db=>xtab_to_xstr( EXPORTING
                                  im_xtab    = it_raw_data
                                  im_size    = lv_size
                                IMPORTING
                                  ex_xstring = lv_xstr_result ).

Variante 4 (cl_bcs_convert)

* solix -> xstring
DATA: lv_size TYPE i.
DATA: it_raw_data TYPE solix_tab.

cl_gui_frontend_services=>gui_upload( EXPORTING
                                        filename     = 'c:\temp\binaryfile.dat'
                                        filetype     = 'BIN'
                                        read_by_line = space
                                      IMPORTING
                                        filelength   = lv_size
                                      CHANGING
                                        data_tab     = it_raw_data ).

DATA(lv_xstr_result) = cl_bcs_convert=>solix_to_xstring( it_solix = it_raw_data ).

Variante 5 (cl_abap_conv_obj)

DATA: it_bin_data TYPE raw255. " iTab mit Binärdaten
DATA: lv_bytes TYPE i.         " reale Länge der Daten in Bytes

...

DATA: lv_xstr_line TYPE xstring.
DATA: lv_xstr_result TYPE xstring.

* RAW (binary) -> xstring
DATA(o_conv) = NEW cl_abap_conv_obj( ).

LOOP AT it_bin_data ASSIGNING FIELD-SYMBOL(<l>).
* Zeile konvertieren
  o_conv->convert( EXPORTING
                     inbuff = <l>
                     outbufflg = 65535 " max. Zeilenlänge in it_bin_data
                   IMPORTING
                     outbuff = lv_xstr_line ).

* Zeilen zusammenbauen
  CONCATENATE lv_xstr_result lv_xstr_line INTO lv_xstr_result IN BYTE MODE.
ENDLOOP.

* evtl. Rest von xstring abschneiden, für reale Länge der Daten
lv_xstr_result = lv_xstr_result(lv_bytes).