ABAP-文件压缩包下载
`* 定义示例内表结构
TYPES: BEGIN OF ty_table1,
id TYPE i,
name TYPE string,
value TYPE f,
END OF ty_table1,
BEGIN OF ty_table2,
code TYPE char10,
desc TYPE string,
date TYPE dats,
END OF ty_table2.
DATA: lt_table1 TYPE TABLE OF ty_table1,
lt_table2 TYPE TABLE OF ty_table2.
- 填充测试数据
lt_table1 = VALUE #(
( id = 1 name = ‘Object A’ value = ‘123.45’ )
( id = 2 name = ‘Object B’ value = ‘678.90’ ) ).
lt_table2 = VALUE #(
( code = ‘X100’ desc = ‘Description 1’ date = ‘20240101’ )
( code = ‘X200’ desc = ‘Description 2’ date = ‘20241231’ ) ).
START-OF-SELECTION.
PERFORM export_tables_to_zip.
&---------------------------------------------------------------------
*& Form EXPORT_TABLES_TO_ZIP
&---------------------------------------------------------------------
FORM export_tables_to_zip.
DATA: lv_csv1 TYPE string,
lv_csv2 TYPE string,
lv_xstr1 TYPE xstring,
lv_xstr2 TYPE xstring,
lo_zip TYPE REF TO cl_abap_zip,
lv_zip_raw TYPE xstring,
lv_filename TYPE string.
" 1. 将内表转为CSV字符串
PERFORM build_csv USING lt_table1 CHANGING lv_csv1.
PERFORM build_csv USING lt_table2 CHANGING lv_csv2.
" 2. 字符串转二进制格式
lv_xstr1 = cl_bcs_convert=>string_to_xstring( lv_csv1 ).
lv_xstr2 = cl_bcs_convert=>string_to_xstring( lv_csv2 ).
" 3. 创建ZIP对象并添加文件
CREATE OBJECT lo_zip.
lo_zip->add( name = ‘table1.csv’ " ZIP内文件名
content = lv_xstr1 ).
lo_zip->add( name = ‘table2.csv’
content = lv_xstr2 ).
" 4. 生成ZIP二进制数据
lv_zip_raw = lo_zip->save( ).
" 5. 提供下载(前端操作)
lv_filename = ‘D:\combined_tables.zip’.
PERFORM download_zip USING lv_zip_raw lv_filename.
ENDFORM.
&---------------------------------------------------------------------
*& Form BUILD_CSV
&---------------------------------------------------------------------
FORM build_csv USING it_data TYPE STANDARD TABLE
CHANGING cv_csv TYPE string.
DATA: lt_csv TYPE TABLE OF string,
lv_line TYPE string,
lo_struct TYPE REF TO cl_abap_structdescr,
lt_comp TYPE abap_component_tab.
" 获取内表结构信息
lo_struct ?= cl_abap_typedescr=>describe_by_data_ref( REF #( it_data[ 1 ] ) ).
lt_comp = lo_struct->get_components( ).
" 添加表头
CLEAR lv_line.
LOOP AT lt_comp INTO DATA(ls_comp).
lv_line = COND #( WHEN lv_line IS INITIAL THEN ls_comp-name
ELSE |{ lv_line },{ ls_comp-name }| ).
ENDLOOP.
APPEND lv_line TO lt_csv.
" 添加数据行
LOOP AT it_data ASSIGNING FIELD-SYMBOL(<ls_row>).
CLEAR lv_line.
LOOP AT lt_comp INTO ls_comp.
ASSIGN COMPONENT ls_comp-name OF STRUCTURE <ls_row> TO FIELD-SYMBOL(<lv_val>).
DATA(lv_str) = COND string( WHEN <lv_val> IS ASSIGNED THEN |“{ <lv_val> }”| ELSE ‘’ ).
lv_line = COND #( WHEN lv_line IS INITIAL THEN lv_str
ELSE |{ lv_line },{ lv_str }| ).
ENDLOOP.
APPEND lv_line TO lt_csv.
ENDLOOP.
" 合并为完整CSV字符串
cv_csv = concat_lines_of( table = lt_csv sep = cl_abap_char_utilities=>cr_lf ).
ENDFORM.
&---------------------------------------------------------------------
*& Form DOWNLOAD_ZIP
&---------------------------------------------------------------------
FORM download_zip USING iv_zip_data TYPE xstring
iv_filename TYPE string.
DATA: lt_bin_data TYPE TABLE OF solix.
" 转换XSTRING为二进制表
lt_bin_data = cl_bcs_convert=>xstring_to_solix( iv_zip_data ).
" 调用下载对话框
cl_gui_frontend_services=>gui_download(
EXPORTING
bin_filesize = xstrlen( iv_zip_data )
filename = iv_filename
filetype = ‘BIN’
CHANGING
data_tab = lt_bin_data
EXCEPTIONS
file_write_error = 1
OTHERS = 2 ).
IF sy-subrc <> 0.
MESSAGE ‘下载失败’ TYPE ‘E’.
ENDIF.
ENDFORM.`
- 点赞
- 收藏
- 关注作者
评论(0)