ABAP-文件压缩包下载

举报
Mr_blank 发表于 2025/08/06 14:22:22 2025/08/06
【摘要】 告别忙碌低效!本文提供示例,帮助您用更少时间完成更多高质量工作,重获工作与生活平衡。

`* 定义示例内表结构
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.`

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。