* Mit Hilfe der Klasse cl_fdt_xl_spreadsheet können über XML-Transformationen
* Daten aus SAP in XLSX-Dateien geschrieben werden
TRY.
* Testdaten lesen
SELECT * FROM t001 INTO TABLE @DATA(it_t001).
IF sy-subrc = 0.
* Header erzeugen
DATA: it_columns TYPE if_fdt_doc_spreadsheet=>t_column.
DATA: lv_head TYPE t001.
DATA(o_desc) = CAST cl_abap_structdescr( cl_abap_structdescr=>describe_by_data( lv_head ) ).
LOOP AT o_desc->get_components( ) ASSIGNING FIELD-SYMBOL(<c>).
IF <c> IS ASSIGNED.
IF <c>-type->kind = cl_abap_typedescr=>kind_elem.
APPEND VALUE #( id = sy-tabix
name = <c>-name
display_name = <c>-name
is_result = abap_true
type = <c>-type ) TO it_columns.
ENDIF.
ENDIF.
ENDLOOP.
* itab + header -> XML -> xstring
* Achtung: Speicherintensiv und rel. langsam! Es sollten keine großen Datenmengen verarbeitet werden.
DATA(lv_bin_data) = cl_fdt_xl_spreadsheet=>if_fdt_doc_spreadsheet~create_document( columns = it_columns " optional
itab = REF #( it_t001 )
iv_call_type = if_fdt_doc_spreadsheet=>gc_call_dec_table ).
IF xstrlen( lv_bin_data ) > 0.
DATA: lv_action TYPE i.
DATA: lv_filename TYPE string.
DATA: lv_fullpath TYPE string.
DATA: lv_path TYPE string.
* Save-Dialog
cl_gui_frontend_services=>file_save_dialog( EXPORTING
default_file_name = 'Excel.xlsx'
default_extension = 'xlsx'
file_filter = |Excel-Datei (*.xlsx)\|*.xlsx\|{ cl_gui_frontend_services=>filetype_all }|
CHANGING
filename = lv_filename
path = lv_path
fullpath = lv_fullpath
user_action = lv_action ).
IF lv_action EQ cl_gui_frontend_services=>action_ok.
* XSTRING -> SOLIX (RAW)
DATA(it_raw_data) = cl_bcs_convert=>xstring_to_solix( EXPORTING iv_xstring = lv_bin_data ).
* Datei lokal speichern
cl_gui_frontend_services=>gui_download( EXPORTING
filename = lv_fullpath
filetype = 'BIN'
bin_filesize = xstrlen( lv_bin_data )
CHANGING
data_tab = it_raw_data ).
ENDIF.
ENDIF.
ENDIF.
CATCH cx_root INTO DATA(e_text).
MESSAGE e_text->get_text( ) TYPE 'I'.
ENDTRY.