ALV TAB 转 excel 二进制文件

复制代码
1 . SE24:

CLASS ZCL_ALV_EXCEL DEFINITION
PUBLIC
final
CREATE PUBLIC .

  PUBLIC SECTION.

  METHODS CREATE_XLS_FROM_ITAB
  IMPORTING
    !IT_FIELDCAT TYPE LVC_T_FCAT OPTIONAL
    !IT_SORT TYPE LVC_T_SORT OPTIONAL
    !IT_FILT TYPE LVC_T_FILT OPTIONAL
    !IS_LAYOUT TYPE LVC_S_LAYO OPTIONAL
    !IV_XLSX TYPE FLAG OPTIONAL
  EXPORTING
    !EV_XSTRING TYPE XSTRING
  CHANGING
    !CT_DATA TYPE STANDARD TABLE .
  PROTECTED SECTION.
  PRIVATE SECTION.
ENDCLASS.



CLASS ZCL_ALV_EXCEL IMPLEMENTATION.


* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Public Method ZCL_ALV_EXCEL->CREATE_XLS_FROM_ITAB
* +-------------------------------------------------------------------------------------------------+
* | [--->] IT_FIELDCAT                    TYPE        LVC_T_FCAT(optional)
* | [--->] IT_SORT                        TYPE        LVC_T_SORT(optional)
* | [--->] IT_FILT                        TYPE        LVC_T_FILT(optional)
* | [--->] IS_LAYOUT                      TYPE        LVC_S_LAYO(optional)
* | [--->] IV_XLSX                        TYPE        FLAG(optional)
* | [<---] EV_XSTRING                     TYPE        XSTRING
* | [<-->] CT_DATA                        TYPE        STANDARD TABLE
* +--------------------------------------------------------------------------------------</SIGNATURE>
  METHOD CREATE_XLS_FROM_ITAB.
    DATA: LR_DATA        TYPE REF TO DATA,
          LR_SALV_TABLE  TYPE REF TO CL_SALV_TABLE,
          LR_COLUMNS     TYPE REF TO CL_SALV_COLUMNS_TABLE,
          LR_AGGREG      TYPE REF TO CL_SALV_AGGREGATIONS,
          LT_FCAT        TYPE        LVC_T_FCAT,
          LR_RESULT_DATA TYPE REF TO CL_SALV_EX_RESULT_DATA_TABLE,
          LV_VERSION     TYPE        STRING,
          LV_FILE_TYPE   TYPE        SALV_BS_CONSTANT,
          LV_FLAVOUR     TYPE        STRING.

    FIELD-SYMBOLS <LT_TAB> TYPE ANY TABLE.

    GET REFERENCE OF CT_DATA INTO LR_DATA.  " 指定引用

    " 如果没传入 fieldcatalog 需要创建
    IF IT_FIELDCAT[] IS INITIAL.
      ASSIGN LR_DATA->* TO <LT_TAB>.
      TRY.
        CL_SALV_TABLE=>FACTORY(
        EXPORTING
          LIST_DISPLAY = ABAP_FALSE
        IMPORTING
          R_SALV_TABLE = LR_SALV_TABLE
        CHANGING
          T_TABLE = <LT_TAB>
          ).
      CATCH CX_SALV_MSG.

      ENDTRY.

      LR_COLUMNS = LR_SALV_TABLE->GET_COLUMNS( ).
      LR_AGGREG  = LR_SALV_TABLE->GET_AGGREGATIONS( ).
      LT_FCAT    = CL_SALV_CONTROLLER_METADATA=>GET_LVC_FIELDCATALOG(
      R_COLUMNS      =  LR_COLUMNS
      R_AGGREGATIONS = LR_AGGREG
      ).
    ELSE.
      LT_FCAT[] = IT_FIELDCAT[].
    ENDIF.

    IF CL_SALV_BS_A_XML_BASE=>GET_VERSION( ) = IF_SALV_BS_XML=>VERSION_25 OR
    CL_SALV_BS_A_XML_BASE=>GET_VERSION( ) = IF_SALV_BS_XML=>VERSION_26.

      LR_RESULT_DATA = CL_SALV_EX_UTIL=>FACTORY_RESULT_DATA_TABLE(
      R_DATA         =       LR_DATA
      S_LAYOUT       =       IS_LAYOUT
      T_FIELDCATALOG = LT_FCAT
      T_SORT         = IT_SORT
      T_FILTER       = IT_FILT

      ).
      CASE CL_SALV_BS_A_XML_BASE=>GET_VERSION( ).
      WHEN IF_SALV_BS_XML=>VERSION_25.
        LV_VERSION = IF_SALV_BS_XML=>VERSION_25.
      WHEN IF_SALV_BS_XML=>VERSION_26.
        LV_VERSION = IF_SALV_BS_XML=>VERSION_26.
      ENDCASE.

      " 如果我们标记i_XLSX那么我们将创建XLSX,如果不是那么MHTML excel文件
      IF IV_XLSX IS NOT INITIAL.
        LV_FILE_TYPE = IF_SALV_BS_XML=>C_TYPE_XLSX.
      ELSE.
        LV_FILE_TYPE = IF_SALV_BS_XML=>C_TYPE_MHTML.
      ENDIF.


      LV_FLAVOUR = IF_SALV_BS_C_TT=>C_TT_XML_FLAVOUR_EXPORT.
      "transformation of data to excel
      CALL METHOD CL_SALV_BS_TT_UTIL=>IF_SALV_BS_TT_UTIL~TRANSFORM
      EXPORTING
        XML_TYPE      = LV_FILE_TYPE
        XML_VERSION   = LV_VERSION
        R_RESULT_DATA = LR_RESULT_DATA
        XML_FLAVOUR   = LV_FLAVOUR
        GUI_TYPE      = IF_SALV_BS_XML=>C_GUI_TYPE_GUI
      IMPORTING
        XML           = EV_XSTRING.
    ENDIF.
  ENDMETHOD.
ENDCLASS.

2 . 使用案列:(核心代码 )

FORM frm_data_to_excel .
  DATA: lr_xls TYPE REF TO zcl_alv_excel.
  DATA: lr_xml TYPE REF TO cl_xml_document.

  DATA: lv_xtring TYPE xstring.

  DATA:lv_filepath  TYPE string,
       lv_bytecount TYPE i,
       lt_file_tab  TYPE solix_tab.

  TYPES: BEGIN OF ty_bin,
           bin_data(1024) TYPE x,
         END OF ty_bin.

  DATA: bin_tab TYPE TABLE OF ty_bin.
  DATA: lv_title TYPE string.
  DATA: lv_path  TYPE ibipparms-path.


  CLEAR lv_xtring.
  CREATE OBJECT lr_xls.
  CALL METHOD lr_xls->create_xls_from_itab
    EXPORTING
      it_fieldcat = gt_fieldcat
*     it_sort     =
*     it_filt     =
      is_layout   = gs_layout
      iv_xlsx     = 'X'
    IMPORTING
      ev_xstring  = lv_xtring
    CHANGING
      ct_data     = gt_alv[].
  lv_title = |{ s_bukrs-low }客户账龄分析报表.XLS|.

  PERFORM frm_set_path USING lv_title CHANGING lv_path.

  " Convert to binary
  CALL FUNCTION 'SCMS_XSTRING_TO_BINARY'
    EXPORTING
      buffer        = lv_xtring
    IMPORTING
      output_length = lv_bytecount
    TABLES
      binary_tab    = lt_file_tab.

  lv_filepath = lv_path.
  " Save the file
  cl_gui_frontend_services=>gui_download( EXPORTING bin_filesize = lv_bytecount
                                                    filename     = lv_filepath
                                                    filetype     = 'BIN'
                                          CHANGING  data_tab     = lt_file_tab ).

  IF sy-subrc = 0.
    MESSAGE s000(oo) WITH 'EXCEL导出成功'.
  ELSE.
    MESSAGE e000(oo) WITH 'EXCEL导出失败'.
  ENDIF.

ENDFORM.


FORM frm_set_path  USING    pv_title
                   CHANGING cv_path.

  " 获取文件下载路径
  CALL FUNCTION 'WS_FILENAME_GET'
    EXPORTING
      def_filename     = pv_title     " 默认文件名
      def_path         = 'C:'             " 默认文件路径
      mask             = ',Excel Files,*.xls;*.xlsx,All Files,*.*.'
      mode             = 'S'
      title            = TEXT-001  " '请选择保存文件路径!'
    IMPORTING
      filename         = cv_path
    EXCEPTIONS
      inv_winsys       = 1
      no_batch         = 2
      selection_cancel = 3
      selection_error  = 4
      OTHERS           = 5.
  IF sy-subrc <> 3 AND sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
    WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.

ENDFORM.
复制代码

 

posted @   .我是谁  阅读(87)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏
· Manus爆火,是硬核还是营销?
点击右上角即可分享
微信分享提示