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.