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:  TYPE ANY TABLE.

  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: