FORM get_excel_data .
DATA: lr_result_data TYPE REF TO data,
lr_data_line TYPE REF TO data.
DATA: lo_excel_export_service TYPE REF TO cl_salv_export_tool_xls,
lo_salv_export_column_conf TYPE REF TO if_salv_export_column_conf,
lo_configuration TYPE REF TO if_salv_export_configuration.
DATA: lv_content TYPE cl_salv_export_tool_xls=>y_file_content,
lv_mime_type TYPE cl_salv_export_tool_xls=>y_mime_type,
lv_filename TYPE cl_salv_export_tool_xls=>y_filename, "#EC NEEDED
lt_infos TYPE cl_salv_export_tool_xls=>yt_msg, "#EC NEEDED
lt_warnings TYPE cl_salv_export_tool_xls=>yt_msg. "#EC NEEDED
DATA: lo_table_rtti TYPE REF TO cl_abap_tabledescr,
lt_dfies TYPE ddfields,
ls_dfies TYPE dfies,
lo_field_catalog TYPE REF TO cl_abap_structdescr.
DATA: lv_fieldname TYPE string,
ls_fieldcat TYPE lvc_s_fcat,
lv_headtext TYPE string,
lv_xstring TYPE xstring,
lv_path TYPE string,
lv_bin_filesize TYPE i,
lv_c TYPE c LENGTH 1,
lv_cc TYPE c LENGTH 1,
lt_data_tab TYPE TABLE OF solisti1.
FIELD-SYMBOLS: <lt_result> TYPE STANDARD TABLE.
CREATE DATA lr_result_data LIKE gt_alv.
ASSIGN lr_result_data->* TO <lt_result>.
<lt_result> = gt_alv.
lo_excel_export_service = cl_salv_export_tool_xls=>create_for_excel( lr_result_data ).
lo_configuration = lo_excel_export_service->configuration( ).
CREATE DATA lr_data_line LIKE LINE OF <lt_result>.
lo_field_catalog ?= cl_abap_tabledescr=>describe_by_data_ref( lr_data_line ).
lt_dfies = cl_salv_data_descr=>read_structdescr( lo_field_catalog ).
**"删除不需要显示的列**
DELETE lt_dfies WHERE fieldname = 'MATKL' OR fieldname = 'CHECK' OR fieldname = 'SELXXX' OR fieldname = 'OBJNR' OR fieldname = 'DEL'.
LOOP AT lt_dfies INTO ls_dfies.
" Text
CLEAR ls_fieldcat.
READ TABLE gt_fcat INTO ls_fieldcat WITH KEY fieldname = ls_dfies-fieldname.
IF ls_fieldcat-coltext IS NOT INITIAL.
lv_headtext = ls_fieldcat-coltext.
ELSE.
lv_headtext = ls_dfies-scrtext_l.
ENDIF.
****"一些自定义的字段自动获取不到描述,需要手动增加** 也可以使用之前定义的描述,但是在这里获取到field描述是空的,所以我就自定义了**
IF ls_dfies-fieldname = 'NUM'.
lv_headtext = TEXT-003.
ELSEIF ls_dfies-fieldname = 'INACT_C'.
lv_headtext = TEXT-004.
ELSEIF ls_dfies-fieldname = 'STATUS'.
lv_headtext = TEXT-008.
ELSEIF ls_dfies-fieldname = 'BHDH_S'.
lv_headtext = TEXT-029.
ELSEIF ls_dfies-fieldname = 'ICON'.
lv_headtext = TEXT-044.
ELSEIF ls_dfies-fieldname = 'BANFN_PO'.
lv_headtext = TEXT-025.
ELSEIF ls_dfies-fieldname = 'EBELN_LP'.
lv_headtext = TEXT-026.
ELSEIF ls_dfies-fieldname = 'PO_CHECK'.
lv_headtext = TEXT-027.
ENDIF.
lv_fieldname = ls_dfies-fieldname.
lo_salv_export_column_conf = lo_configuration->add_column(
header_text = lv_headtext
field_name = lv_fieldname
display_type = if_salv_export_column_conf=>display_types-text_view
).
* LO_SALV_EXPORT_COLUMN_CONF->SET_CELL_DESIGN(
* EXPORTING
* CELL_DESIGN = '61'
* CELL_DESIGN_SRC_FIELD = LW_COMP_TAB-NAME
* ).
ENDLOOP.
lo_excel_export_service->check_configuration(
IMPORTING
t_messages_info = lt_infos
t_messages_warning = lt_warnings
).
TRY.
lo_excel_export_service->read_result(
IMPORTING
content = lv_content
mime_type = lv_mime_type
filename = lv_filename
t_messages_info = lt_infos
t_messages_warning = lt_warnings
).
CATCH cx_salv_export_error. "#EC NO_HANDLER
ENDTRY.
lv_xstring = lv_content.
CALL FUNCTION 'SCMS_XSTRING_TO_BINARY'
EXPORTING
buffer = lv_xstring
append_to_table = ''
IMPORTING
output_length = lv_bin_filesize
TABLES
binary_tab = lt_data_tab.
"获取桌面路径
CALL METHOD cl_gui_frontend_services=>get_desktop_directory( CHANGING desktop_directory = lv_path ).
CALL METHOD cl_gui_cfw=>update_view.
cl_gui_frontend_services=>directory_browse(
EXPORTING
initial_folder = lv_path
CHANGING
selected_folder = lv_path ).
"这里有一点坑的是保存到桌面的地址没有\,且这个字符在SAP显示为¥,所以只能用动态显示的方式获取\。其他地址都是可以的。
lv_c = reverse( lv_path ).
lv_cc = lv_path+2(1).
IF lv_c <> lv_cc.
lv_filename = lv_path && lv_cc && TEXT-002 && '.xlsx '.
ELSE.
lv_filename = lv_path && TEXT-002 && '.xlsx '.
ENDIF.
CALL METHOD cl_gui_frontend_services=>gui_download
EXPORTING
bin_filesize = lv_bin_filesize
filename = lv_filename
filetype = 'BIN'
* append = SPACE
* write_field_separator = SPACE
* header = '00'
* trunc_trailing_blanks = SPACE
* write_lf = 'X'
* col_select = SPACE
* col_select_mask = SPACE
* dat_mode = SPACE
* confirm_overwrite = SPACE
* no_auth_check = SPACE
codepage = '4103'
* ignore_cerr = ABAP_TRUE
* replacement = '#'
* write_bom = SPACE
* trunc_trailing_blanks_eol = 'X'
* wk1_n_format = SPACE
* wk1_n_size = SPACE
* wk1_t_format = SPACE
* wk1_t_size = SPACE
* show_transfer_status = 'X'
* fieldnames =
* write_lf_after_last_line = 'X'
* virus_scan_profile = '/SCET/GUI_DOWNLOAD'
* IMPORTING
* filelength =
CHANGING
data_tab = lt_data_tab
EXCEPTIONS
file_write_error = 1
no_batch = 2
gui_refuse_filetransfer = 3
invalid_type = 4
no_authority = 5
unknown_error = 6
header_not_allowed = 7
separator_not_allowed = 8
filesize_not_allowed = 9
header_too_long = 10
dp_error_create = 11
dp_error_send = 12
dp_error_write = 13
unknown_dp_error = 14
access_denied = 15
dp_out_of_memory = 16
disk_full = 17
dp_timeout = 18
file_not_found = 19
dataprovider_exception = 20
control_flush_error = 21
not_supported_by_gui = 22
error_no_gui = 23
OTHERS = 24.
IF sy-subrc <> 0.
ENDIF.
ENDFORM.
ABAP2XLSX
需要用到一个工具(ABAPGIT)所以 首先我们需要了解一下ABAPGIT的用法
abap2xlsx 项目安装和配置指南
SAP ABAP导入开源项目abap2xlsx到系统
延伸的功能示例:
Using ABAP2XLSX to send ALV table output as Excel spreadsheet via internet email
XLSX Workbench
XLSX Workbench for SAP(ABAP) - tool for exporting data to Excel