通过XML转换下载.xlsx格式的excel文件

Posted datie

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了通过XML转换下载.xlsx格式的excel文件相关的知识,希望对你有一定的参考价值。

在SAP系统中,通过SE11显示一个table的内容,可以发现ALV grid的显示界面上有个spread sheet的标准按钮,点击这个按钮可以将显示的内容下载成excel文件,其中也包括扩展名.xlsx的文件。

技术图片

这个功能很方便,因为下载的结果和ALV中看到的是一样的。

技术图片

debug研究了一下标准代码,发现是将需要下载的内表先转换成XML stream,然后再通过gui_download的BIN模式将xml stream下载成.xlsx文件。

技术图片

写了一个简单的程序供大家参考

REPORT ztest_alv_download.

DATA:git_vbap TYPE STANDARD TABLE OF vbap.
DATA:git_fcat   TYPE lvc_t_fcat,
     gwa_layout TYPE lvc_s_layo.
DATA: l_path     TYPE string,
      l_filename TYPE string.

START-OF-SELECTION.

  SELECT *
    INTO TABLE git_vbap
    FROM vbap
    UP TO 100 ROWS.

  CALL FUNCTION LVC_FIELDCATALOG_MERGE
    EXPORTING
      i_structure_name       = VBAP
    CHANGING
      ct_fieldcat            = git_fcat "生成下载excel文件的头--reptext字段
    EXCEPTIONS
      inconsistent_interface = 1
      program_error          = 2
      OTHERS                 = 3.
  gwa_layout-zebra = X.
  gwa_layout-sel_mode = A.
  gwa_layout-cwidth_opt = X.

  CALL FUNCTION REUSE_ALV_GRID_DISPLAY_LVC
    EXPORTING
      i_callback_program       = sy-repid
      i_callback_pf_status_set = FRM_STATUS_SET
      i_callback_user_command  = FRM_USER_COMMAND
      is_layout_lvc            = gwa_layout
      it_fieldcat_lvc          = git_fcat
    TABLES
      t_outtab                 = git_vbap[]
    EXCEPTIONS
      program_error            = 1
      OTHERS                   = 2.
  IF sy-subrc <> 0.
* Implement suitable error handling here
  ENDIF.

FORM frm_status_set  USING rt_extab  TYPE slis_t_extab.
  SET PF-STATUS S0001.
ENDFORM.                    "frm_status_set
FORM frm_user_command USING r_ucomm TYPE sy-ucomm
                            rs_selfield TYPE slis_selfield.
* Local Variable Declare
  DATA: l_filename TYPE string.

  IF r_ucomm = DOWN.
*   get file name
    PERFORM frm_get_directory CHANGING l_filename.
*   download
    PERFORM export_to_excel USING l_filename.
  ENDIF.

ENDFORM.
FORM frm_get_directory  CHANGING c_filename TYPE string.

  DATA : l_title    TYPE string,
         l_filename TYPE string,                         "file name
         l_path     TYPE string VALUE C:\TEMP,         "path
         l_fullpath TYPE string,                         "full path
         l_result   TYPE i.                              "result return

  l_title = Save as....

  CALL METHOD cl_gui_frontend_services=>file_save_dialog
    EXPORTING
      window_title         = l_title
      default_extension    = XLSX
      default_file_name    = Download.XLSX
*     with_encoding        =
*     file_filter          =
      initial_directory    = l_path
      prompt_on_overwrite  = X
    CHANGING
      filename             = l_filename
      path                 = l_path
      fullpath             = l_fullpath
      user_action          = l_result
*     file_encoding        =
    EXCEPTIONS
      cntl_error           = 1
      error_no_gui         = 2
      not_supported_by_gui = 3
      OTHERS               = 4.
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
               WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ELSE.
    c_filename     = l_filename.  "l_path.
  ENDIF.

ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  EXPORT_TO_EXCEL
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_L_FILENAME  text
*----------------------------------------------------------------------*
FORM export_to_excel  USING i_filename.

  DATA: l_length     TYPE i,
        l_xml_stream TYPE xml_rawdata,
        l_flavour    TYPE string,
        l_version    TYPE string.

  DATA: lr_alv_new_data TYPE REF TO data,
        lr_result_data  TYPE REF TO cl_salv_ex_result_data_table.

  DATA: ls_xml_choice TYPE if_salv_bs_xml=>s_type_xml_choice,
        xml           TYPE xstring.

  GET REFERENCE OF git_vbap INTO lr_alv_new_data.

  lr_result_data = cl_salv_ex_util=>factory_result_data_table(
*        t_selected_rows             = lt_lvc_row
*        t_selected_columns          = lt_sel_cols
*        t_selected_cells            = lt_sel_cells
      r_data                      = lr_alv_new_data
*      s_layout                    = lr_grid->m_cl_variant->ms_layout
      t_fieldcatalog              = git_fcat
*      t_sort                      = lr_grid->m_cl_variant->mt_sort
*      t_filter                    = lr_grid->m_cl_variant->mt_filter
*      t_hyperlinks                = lr_grid->mt_hyperlinks
*        s_current_cell              = ls_cur_cell
*        hyperlink_entry_column      = ls_hyper_entry
*        dropdown_entry_column       = ls_dropdown_entry
*        r_top_of_list               = lr_top_of_list
*        r_end_of_list               = lr_end_of_list
*        t_dropdown_values           = lt_drdn
       ).

  CASE cl_salv_bs_a_xml_base=>get_version( ).
    WHEN if_salv_bs_xml=>version_25.
      l_version = if_salv_bs_xml=>version_25.
    WHEN if_salv_bs_xml=>version_26.
      l_version = if_salv_bs_xml=>version_26. " = 2.6
  ENDCASE.

  l_flavour = if_salv_bs_c_tt=>c_tt_xml_flavour_export. "Flavor for Complete ALV XML

  CALL METHOD cl_salv_bs_tt_util=>if_salv_bs_tt_util~transform
    EXPORTING
      xml_type      = if_salv_bs_xml=>c_type_xlsx  "XLSX
      xml_version   = l_version
      r_result_data = lr_result_data
      xml_flavour   = l_flavour
      gui_type      = if_salv_bs_xml=>c_gui_type_gui  "Y6DK066330
    IMPORTING
      xml           = xml.

  IF NOT i_filename IS INITIAL.
    CALL FUNCTION SCMS_XSTRING_TO_BINARY
      EXPORTING
        buffer        = xml
      IMPORTING
        output_length = l_length
      TABLES
        binary_tab    = l_xml_stream.

    CALL METHOD cl_gui_frontend_services=>gui_download
      EXPORTING
        bin_filesize = l_length
        filetype     = BIN
        filename     = i_filename
      CHANGING
        data_tab     = l_xml_stream
      EXCEPTIONS
        OTHERS       = 1.
    IF sy-subrc <> 0.
*       MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*                  WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
    ENDIF.
  ENDIF.

ENDFORM.

在status上加了两个按钮,一个是标准的spreadsheet按钮(&XXL),一个是自定义的按钮(DOWN),供下载结果对比使用。

技术图片

代码简单说明:

1) cl_salv_bs_tt_util=>if_salv_bs_tt_util~transform是用来指定下载的excel格式的,也就是模拟了标准按钮的那个format选择步骤,这个类方法中用到了接口if_salv_bs_xml中的一些属性,10就标识是下载成.xlsx格式的文件。

技术图片

2) SCMS_XSTRING_TO_BINARY可以将Xtring转化成二进制格式并保存到内表中

以上。

以上是关于通过XML转换下载.xlsx格式的excel文件的主要内容,如果未能解决你的问题,请参考以下文章

excel表格xlsx格式文件打开后自动变成xlsm文件怎么回事?

怎样在Android中解析doc,docx,xls,xlsx格式文

怎么把xls文件转换成excel文件格式

xml格式转换为excel

将 Excel XML 电子表格转换为 xlsx

生成的 Excel 文件以 XML 格式下载