Download Data Into XLSX/MHTML File/Format - Reusable FM.
Most of the times, we are able to upload to upload XLSX file to internal table but to download data in XLSX format we struggle most of the time. Here we are presenting a simple solution to download data in XLSX/MHTML/XML format.
This function module gives you an option to select a specific filetype to be chosen. If no filetype is chosen among XLSX/MHTML/XML, then a pop up window will appear as shown below to select required filetype.
Create a simple function module as described below:
IMPORT:
EXPORT:
CHANGING:
Function Module Code:
FUNCTION zdownload_file.
*"----------------------------------------------------------------------
*"*"Local Interface:
*" IMPORTING
*" REFERENCE(I_FIELDCAT) TYPE LVC_T_FCAT OPTIONAL
*" REFERENCE(I_SORT) TYPE LVC_T_SORT OPTIONAL
*" REFERENCE(I_FILT) TYPE LVC_T_FILT OPTIONAL
*" REFERENCE(I_LAYOUT) TYPE LVC_S_LAYO OPTIONAL
*" REFERENCE(I_XLSX) TYPE FLAG OPTIONAL
*" REFERENCE(I_MHTML) TYPE FLAG OPTIONAL
*" REFERENCE(I_XML) TYPE FLAG OPTIONAL
*" EXPORTING
*" REFERENCE(E_XSTRING) TYPE XSTRING
*" CHANGING
*" REFERENCE(C_DATA) TYPE STANDARD TABLE
*"----------------------------------------------------------------------
DATA: lt_fcat TYPE lvc_t_fcat,
lt_data TYPE REF TO data,
lv_flavour TYPE string,
lv_version TYPE string,
lv_xmltype TYPE salv_bs_constant.
DATA: lt_choice TYPE if_salv_bs_xml=>t_type_xml_choice,
lwa_choice TYPE if_salv_bs_xml=>s_type_xml_choice.
DATA: lr_result TYPE REF TO cl_salv_ex_result_data_table,
lr_columns TYPE REF TO cl_salv_columns_table,
lr_aggreg TYPE REF TO cl_salv_aggregations,
lr_table TYPE REF TO cl_salv_table.
FIELD-SYMBOLS:
GET REFERENCE OF c_data INTO lt_data.
IF i_fieldcat[] IS INITIAL.
ASSIGN lt_data->* TO
TRY .
cl_salv_table=>factory(
EXPORTING
list_display = abap_false
IMPORTING
r_salv_table = lr_table
CHANGING
t_table =
CATCH cx_salv_msg.
ENDTRY.
lr_columns = lr_table->get_columns( ).
lr_aggreg = lr_table->get_aggregations( ).
lt_fcat = cl_salv_controller_metadata=>get_lvc_fieldcatalog(
r_columns = lr_columns
r_aggregations = lr_aggreg ).
ELSE.
lt_fcat[] = i_fieldcat[].
ENDIF.
lr_result = cl_salv_ex_util=>factory_result_data_table(
r_data = lt_data
s_layout = i_layout
t_fieldcatalog = lt_fcat
t_sort = i_sort
t_filter = i_filt ).
lv_version = cl_salv_bs_a_xml_base=>get_version( ).
lv_flavour = if_salv_bs_c_tt=>c_tt_xml_flavour_export.
lt_choice = cl_salv_export_xml_dialog=>get_gui_spreadsheet_formats( ).
IF i_xlsx EQ 'X'.
lv_xmltype = if_salv_bs_xml=>c_type_xlsx.
ELSEIF i_mhtml EQ 'X'.
lv_xmltype = if_salv_bs_xml=>c_type_mhtml.
ELSEIF i_xml EQ 'X'.
lv_xmltype = if_salv_bs_xml=>c_type_excel_xml.
ENDIF.
IF lv_xmltype NE 0.
READ TABLE lt_choice INTO lwa_choice WITH KEY xml_type = lv_xmltype.
ELSE.
CLEAR: lt_choice.
CALL METHOD cl_salv_export_xml_dialog=>execute
RECEIVING
value = lt_choice.
READ TABLE lt_choice INTO lwa_choice INDEX 1.
IF sy-subrc EQ 0.
lv_xmltype = lwa_choice-xml_type.
ENDIF.
ENDIF.
CALL METHOD cl_salv_bs_tt_util=>if_salv_bs_tt_util~transform
EXPORTING
xml_type = lv_xmltype
xml_version = lv_version
r_result_data = lr_result
xml_flavour = lv_flavour
gui_type = lwa_choice-gui_type
IMPORTING
xml = e_xstring.
cl_salv_export_xml_dialog=>download( s_xml_choice = lwa_choice
xml = e_xstring ).
ENDFUNCTION.
If you face any issue, refer below notes:
- 2517992 - Export to excel creates corrupt file.
- 2616421 - How to determine and correct illegal XML character error?