ABAP CL_ABAP_ZIP压缩文件名不支持中文增强

2026-04-01 21:09:35

1、如果是发送邮件的话,可以用create_ostream_xstring将构造的XLS/XML转换为XSTRING

DATA: lr_ixml         TYPE REF TO if_ixml, 

lr_document     TYPE REF TO if_ixml_document,        lr_streamfactory TYPE REF TO if_ixml_stream_factory,        lr_ostream       TYPE REF TO if_ixml_ostream,        lr_renderer      TYPE REF TO if_ixml_renderer,        lr_element_root  TYPE REF TO if_ixml_element,        lr_element       TYPE REF TO if_ixml_element,        lr_worksheet     TYPE REF TO if_ixml_element,        lr_table         TYPE REF TO if_ixml_element,        lr_column        TYPE REF TO if_ixml_element,        lr_row           TYPE REF TO if_ixml_element,        lr_cell          TYPE REF TO if_ixml_element,        lr_data          TYPE REF TO if_ixml_element,

 lr_ostream       TYPE REF TO if_ixml_ostream, 

lv_xstring TYPE xstring, 

...(构造XML)

lr_ostream = lr_ixml->create_stream_factory( )->create_ostream_xstring( string = lv_xstring ) 

lr_ixml->create_renderer( ostream = lr_ostream document = lr_document )->render( ). 

ABAP CL_ABAP_ZIP压缩文件名不支持中文增强

2、或者直接使用FM将内表转换成XSTRING

DATA: izip       TYPE REF TO cl_abap_zip,         cont       TYPE xstring.

...

*  DO 10000 TIMES.*    APPEND 'ABAP开发' TO itab.*  ENDDO. 

*  CALL FUNCTION 'SCMS_TEXT_TO_XSTRING'*    EXPORTING*      mimetype = 'text/html;charset=gb2312'*    IMPORTING*      buffer   = cont*    TABLES*      text_tab = itab

*    EXCEPTIONS*      failed   = 1*      OTHERS   = 2. 

1、DATA:BEGIN OF gw_element,  filename TYPE string,  tcode    TYPE string,  prog     TYPE programm,  selscreen TYPE TABLE OF rsparams,  structure TYPE lvc_t_fcat,  emailaddr TYPE TABLE OF string,  xml LIKE TABLE OF lw_xml2,  data TYPE TABLE OF xstring,  conent TYPE solix_tab,END OF gw_element. 

FORM frm_trans_zip.  DATA:lr_zip       TYPE REF TO cl_abap_zip  DATA: itab TYPE STANDARD TABLE OF sdokcntasc .  CREATE OBJECT lr_zip.*  lr_zip->support_unicode_names = abap_true.  LOOP AT lt_xstring INTO lv_xstring.    lv_string = gw_element-filename && sy-tabix && '.xls'    lr_zip->add(      EXPORTING        name    =  lv_string   " Name (Case-Sensitive)        content = lv_xstring    ).  ENDLOOP.  CLEAR lv_xstring.  lv_xstring = lr_zip->save( ).  CALL FUNCTION 'SCMS_XSTRING_TO_BINARY'    EXPORTING      buffer     = lv_xstring    TABLES      binary_tab = gw_element-conent.*  CALL FUNCTION 'GUI_DOWNLOAD'*    EXPORTING*      filename = 'E:\users\chenps\Desktop\sf.zip'*      filetype = 'BIN'*    TABLES*      data_tab = gw_element-conent.ENDFORM. 

2、压缩文件不支持中文

文件名包含中文会显示成##

1、添加隐式增强

ENHANCEMENT 1  ZMME001.    "active version* 隐式增强实施,解决压缩文件名不支持中文问题  ADD BY 陈鹏CALL FUNCTION 'SCMS_STRING_TO_XSTRING'  EXPORTING    text     = name    mimetype = 'text/html;charset=gb2312'*    encoding =  IMPORTING    buffer   = <ext>-filename  EXCEPTIONS    failed   = 1    others   = 2  . <ext>-filename_len = XSTRLEN( <ext>-filename ).ENDENHANCEMENT. 

ABAP CL_ABAP_ZIP压缩文件名不支持中文增强

2、这样就完美支持中文了

ABAP CL_ABAP_ZIP压缩文件名不支持中文增强

1、FORM frm_send_email_with_excel .  DATA: lc_xls_type TYPE so_obj_tp VALUE 'XLS',        lc_codepage TYPE abap_encod VALUE '4103',        lv_string   TYPE string,        lv_size     TYPE so_obj_len,        lc_add_attc TYPE so_obj_des VALUE 'popup',        lt_binary_content TYPE solix_tab.  DATA:        lw_solix      TYPE solix,        lt_solix      TYPE solix_tab,        sent_to_all   TYPE os_boolean,        main_text     TYPE bcsy_text,        lr_send_request  TYPE REF TO cl_bcs,        lr_email      TYPE REF TO cl_document_bcs,        recipient     TYPE REF TO if_recipient_bcs,        bcs_exception TYPE REF TO cx_bcs,        lv_mailto     TYPE ad_smtpadr.  DATA lv_body TYPE string.  DATA lt_htmltext TYPE soli_tab.  TRY .*    -------------create persistent sent request----------------      lr_send_request = cl_bcs=>create_persistent( ).*    -------------create and set document with attachment-------*    create document object from internal table with text      CONCATENATE lv_body '<html><body><table>' INTO lv_body.      "here add table content within rows (<tr>) and cells (<td>)      CONCATENATE lv_body '<tr>'                          '<td>' '亲:' '</td>'                          '<td>' '' '</td>'                          '</tr>' INTO lv_body.      lv_string =  lines( <gt_out> ).      CONCATENATE lv_body '<tr>'                          '<td>' ' ' '</td>'                          '<td>' '本次运行获取的附件数据条目数为' lv_string '</td>'                          '<td>' '详细信息请查看附件《' gw_element-filename '》' '</td>'                          '</tr>' INTO lv_body.      "close table      CONCATENATE lv_body '</table>' INTO lv_body.      CONCATENATE lv_body `<style type="text/css">`      `.gridtable {`      `  font-family: verdana,arial,sans-serif;`      `  font-size:11px;`      `  color:#333333;`      `  border-width: 1px;`      `  border-color: #666666;`      `  border-collapse: collapse;`      `}`      `.gridtable th {`      `  border-width: 1px;`      `  padding: 8px;`      `  border-style: solid;`      `  border-color: #666666;`      `  background-color: #dedede;`      `}`      `.gridtable td {`      `  border-width: 1px;`      `  padding: 8px;`      `  border-style: solid;`      `  border-color: #666666;`      `  background-color: #ffffff;`      `}`      `</style>`      `<table class="gridtable">`      `<tr>`      `  <th>屏幕字段</th><th>筛选类型</th><th>选择选项</th><th>标识(包含I/排除E)</th><th>最小值</th><th>最大值</th>`      `</tr>`      INTO lv_body.      LOOP AT gw_element-selscreen INTO gw_selscreen.        CONCATENATE lv_body                    `<tr><td>` gw_selscreen-selname                    `</td><td>` gw_selscreen-kind                    `</td><td>` gw_selscreen-option                    `</td><td>` gw_selscreen-sign                    `</td><td>` gw_selscreen-low                    `</td><td>` gw_selscreen-high                    `</td>`         INTO lv_body.      ENDLOOP.      "now close html format      CONCATENATE lv_body '</table></body></html>' INTO lv_body.      "transfer to table type      CALL FUNCTION 'SCMS_STRING_TO_FTEXT'        EXPORTING          text      = lv_body        TABLES          ftext_tab = lt_htmltext.      "Set your document to accept html body      lr_email = cl_document_bcs=>create_document( i_type = 'HTM'                                           i_text = lt_htmltext                                           i_subject = gw_element-filename && '每日邮件'  ).*    add the spread sheet as attachment to document object      lv_filename = gw_element-filename.      lr_email->add_attachment( i_attachment_type = 'ZIP' "lc_xls_type                                i_attachment_subject = lv_filename*                                  i_attachment_size    = lw_xml2-size                                i_att_content_hex = gw_element-conent ).*    send document object to send request      lr_send_request->set_document( lr_email ).*    --------------add recipient (e-mail address)--------------      LOOP AT gw_element-emailaddr INTO lv_string.*        CALL FUNCTION 'SX_INTERNET_ADDRESS_TO_NORMAL'*          EXPORTING*            address_unstruct    = lv_string*          EXCEPTIONS*            error_address_type  = 1*            error_address       = 2*            error_group_address = 3*            OTHERS              = 4.*        IF sy-subrc <> 0.*          WRITE: '收件人邮件格式不正确'.*          STOP.*        ENDIF.        lv_mailto = lv_string.*    create recipient object*    add recipient object to send request        lr_send_request->add_recipient( cl_cam_address_bcs=>create_internet_address( lv_mailto ) ).      ENDLOOP.*    --------------send document ------------------------------*      send_request->set_send_immediately( 'X' ).      sent_to_all = lr_send_request->send( i_with_error_screen = 'X' ).      COMMIT WORK AND WAIT.      IF sent_to_all IS INITIAL.        MESSAGE i500(sbcoms) WITH lv_string.      ELSE.        MESSAGE s022(so).      ENDIF.*    ---------------exception handling ------------------------    CATCH cx_bcs INTO bcs_exception.      MESSAGE i865(so) WITH bcs_exception->error_type.  ENDTRY.ENDFORM.                    " FRM_SEND_EMAIL_WITH_EXCEL 

2、查看邮件效果

ABAP CL_ABAP_ZIP压缩文件名不支持中文增强

猜你喜欢