ABAP CL_ABAP_ZIP压缩文件名不支持中文增强
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( ).

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.

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

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、查看邮件效果
