abap 发送附件 excel 解决 打开附件提示格式不一致问题

算法揽霄使
• 阅读 2711

旧语法版本

*&---------------------------------------------------------------------*
*& Report  ZTEST_EMAIL_XLSX
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

REPORT ztest_email_xlsx.

DATA:lt_spfli TYPE TABLE OF spfli.

SELECT * UP TO 100 ROWS
  FROM spfli
  INTO TABLE lt_spfli.

DATA lr_table TYPE REF TO cl_salv_table.
cl_salv_table=>factory( IMPORTING r_salv_table = lr_table
                        CHANGING t_table = lt_spfli ).

DATA: lr_xldimension TYPE REF TO if_ixml_node,
      lr_xlworksheet TYPE REF TO if_ixml_element.

DATA:lv_xlsx TYPE xstring.


lv_xlsx  = lr_table->to_xml( if_salv_bs_xml=>c_type_xlsx ).

DATA:lr_zip TYPE REF TO cl_abap_zip.
CREATE OBJECT lr_zip.

lr_zip->load( lv_xlsx ).
DATA:lv_file TYPE xstring.

lr_zip->get( EXPORTING name = 'xl/worksheets/sheet1.xml' IMPORTING content = lv_file ).

DATA:lr_file TYPE REF TO cl_xml_document.
CREATE OBJECT lr_file.
lr_file->parse_xstring( lv_file ).

DATA:lr_xlnode TYPE REF TO if_ixml_node.
lr_xlnode = lr_file->find_node( 'sheetData' ).

DATA:lr_xlrows TYPE REF TO if_ixml_node_list.

lr_xlrows = lr_xlnode->get_children( ).

lr_xlworksheet ?= lr_file->find_node( 'worksheet' ).

DATA:lr_xlsheetpr TYPE REF TO if_ixml_element.

lr_xlsheetpr   = cl_ixml=>create( )->create_document( )->create_element( name = 'sheetPr' ).

DATA:lr_xloutlinepr TYPE REF TO if_ixml_element.
lr_xloutlinepr = cl_ixml=>create( )->create_document( )->create_element( name = 'outlinePr' ).

lr_xlsheetpr->if_ixml_node~append_child( lr_xloutlinepr ).
lr_xloutlinepr->set_attribute( name = 'summaryBelow' value = 'false' ).
lr_xldimension ?= lr_file->find_node( 'dimension' ).
lr_xlworksheet->if_ixml_node~insert_child( new_child = lr_xlsheetpr ref_child = lr_xldimension ).


lr_file->render_2_xstring( IMPORTING stream = lv_file ).
lr_zip->delete( EXPORTING name = 'xl/worksheets/sheet1.xml' ).
lr_zip->add( EXPORTING name = 'xl/worksheets/sheet1.xml' content = lv_file ).
lv_xlsx = lr_zip->save( ).

DATA lv_size     TYPE i.
DATA lt_bintab TYPE solix_tab.

* Convert to binary
CALL FUNCTION 'SCMS_XSTRING_TO_BINARY'
  EXPORTING
    buffer        = lv_xlsx
  IMPORTING
    output_length = lv_size
  TABLES
    binary_tab    = lt_bintab.

DATA main_text      TYPE bcsy_text.

DATA:send_request TYPE REF TO cl_bcs.
send_request = cl_bcs=>create_persistent( ).

DATA:document TYPE REF TO cl_document_bcs.
APPEND 'Valid Excel file' TO main_text.
document = cl_document_bcs=>create_document( i_type = 'RAW' i_text = main_text i_subject = 'Test Created for stella' ).
DATA:lv_objlen TYPE so_obj_len.



DATA lt_att_head TYPE soli_tab.
APPEND '<(>&< )>SO_FILENAME=MySheet.xlsx' TO lt_att_head.

lv_objlen = lv_size.
CONDENSE lv_objlen NO-GAPS.

* add the spread sheet as attachment to document object
document->add_attachment(
  i_attachment_type    = 'xls'
  i_attachment_subject = 'MySheet'
  i_attachment_size    =  lv_objlen
  i_attachment_header  = lt_att_head
  i_att_content_hex    = lt_bintab ).

send_request->set_document( document ).

DATA:recipient TYPE REF TO cl_cam_address_bcs.
recipient = cl_cam_address_bcs=>create_internet_address( '383981024@qq.com' ).

send_request->add_recipient( recipient ).

DATA:sent_to_all TYPE  os_boolean.
sent_to_all = send_request->send( i_with_error_screen = 'X' ).


COMMIT WORK.

新语法版本

*&---------------------------------------------------------------------*
*& Report ZTEST_EMAIL2
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ztest_email2.
SELECT * UP TO 100 ROWS
  FROM spfli
  INTO TABLE @DATA(lt_spfli).

cl_salv_table=>factory( IMPORTING r_salv_table = DATA(lr_table)
                        CHANGING t_table = lt_spfli ).

DATA: lr_xldimension TYPE REF TO if_ixml_node,
      lr_xlworksheet TYPE REF TO if_ixml_element.

DATA(lv_xlsx) = lr_table->to_xml( if_salv_bs_xml=>c_type_xlsx ).
DATA(lr_zip) = NEW cl_abap_zip( ).
lr_zip->load( lv_xlsx ).
lr_zip->get( EXPORTING name = 'xl/worksheets/sheet1.xml' IMPORTING content = DATA(lv_file) ).

DATA(lr_file) = NEW cl_xml_document( ).
lr_file->parse_xstring( lv_file ).
* Row elements are under SheetData
DATA(lr_xlnode) = lr_file->find_node( 'sheetData' ).
DATA(lr_xlrows) = lr_xlnode->get_children( ).
* Create new element in the XML file
lr_xlworksheet ?= lr_file->find_node( 'worksheet' ).
DATA(lr_xlsheetpr)   = cl_ixml=>create( )->create_document( )->create_element( name = 'sheetPr' ).
DATA(lr_xloutlinepr) = cl_ixml=>create( )->create_document( )->create_element( name = 'outlinePr' ).
lr_xlsheetpr->if_ixml_node~append_child( lr_xloutlinepr ).
lr_xloutlinepr->set_attribute( name = 'summaryBelow' value = 'false' ).
lr_xldimension ?= lr_file->find_node( 'dimension' ).
lr_xlworksheet->if_ixml_node~insert_child( new_child = lr_xlsheetpr ref_child = lr_xldimension ).
* Create xstring and move it to XLSX
lr_file->render_2_xstring( IMPORTING stream = lv_file ).
lr_zip->delete( EXPORTING name = 'xl/worksheets/sheet1.xml' ).
lr_zip->add( EXPORTING name = 'xl/worksheets/sheet1.xml' content = lv_file ).
lv_xlsx = lr_zip->save( ).

DATA lv_size     TYPE i.
DATA lt_bintab TYPE solix_tab.

* Convert to binary
CALL FUNCTION 'SCMS_XSTRING_TO_BINARY'
  EXPORTING
    buffer        = lv_xlsx
  IMPORTING
    output_length = lv_size
  TABLES
    binary_tab    = lt_bintab.

DATA main_text      TYPE bcsy_text.
* create persistent send request
DATA(send_request) = cl_bcs=>create_persistent( ).
* create document object from internal table with text
APPEND 'Valid Excel file' TO main_text.
DATA(document) = cl_document_bcs=>create_document( i_type = 'RAW' i_text = main_text i_subject = 'Test Created for stella' ).

DATA lt_att_head TYPE soli_tab.
APPEND '<(>&< )>SO_FILENAME=MySheet.xlsx' TO lt_att_head.
* add the spread sheet as attachment to document object
document->add_attachment(
  i_attachment_type    = 'xls'
  i_attachment_subject = 'MySheet'
  i_attachment_size    = CONV so_obj_len( lv_size )
  i_attachment_header  = lt_att_head
  i_att_content_hex    = lt_bintab ).

send_request->set_document( document ).
DATA(recipient) = cl_cam_address_bcs=>create_internet_address( 'some_recipient@mail.com' ).
send_request->add_recipient( recipient ).
DATA(sent_to_all) = send_request->send( i_with_error_screen = 'X' ).

COMMIT WORK.

把新语法还原到旧版本是一个苦逼的活。

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
美凌格栋栋酱 美凌格栋栋酱
6个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Stella981 Stella981
3年前
ABAP学习(16):ABAP2XLSX,操作excel
ABAP2XLSX   ABAP2XLS是一个操作EXCEL的开源项目,相比较OLE2和DOI方式操作excel更加方便。   ABAP中搜索ZDEMO\_EXCEL\搜索Program可以查看SAP提供的示例程序,实现多种Excel。1.创建excel   Excel类:zcl\_excel类
Stella981 Stella981
3年前
ClickHouse在字节跳动广告DMP&CDP的应用
展开function\_typeof(e){returne&amp;&amp;"undefined"!typeofSymbol&amp;&amp;e.constructorSymbol?"symbol":typeofe;}!function(e){if("object"("undefined"typeofmodule?
Stella981 Stella981
3年前
ASMSupport教程4.8 生成逻辑运算操作
<p在java中有以下逻辑运算符:</p<ul<li&amp;&amp;:条件与</li<li||:条件或</li<li&amp;:布尔型的逻辑与</li<li|:布尔型的逻辑或</li<li^:布尔型的逻辑异或</li<li!:非操作</li</ul<p那么接下来我们将些段例子
Stella981 Stella981
3年前
Flutter中动态显示组件之“坑”,我来教你怎样爬上来
展开function\_typeof(e){returne&amp;&amp;"undefined"!typeofSymbol&amp;&amp;e.constructorSymbol?"symbol":typeofe;}!function(e){if("object"("undefined"typeofmodule?
Stella981 Stella981
3年前
Python怎样查询MySQL数据库?
ShowMorefunction\_typeof(e){returne&amp;&amp;"undefined"!typeofSymbol&amp;&amp;e.constructorSymbol?"symbol":typeofe;}!function(e){if("object"("undefined"typeof
Stella981 Stella981
3年前
Gson之实例五
前面四篇博客基本上可以满足我们处理的绝大多数需求,但有时项目中对json有特殊的格式规定.比如下面的json串解析:{"tableName":"students","tableData":{"id":1,"name":"李坤","birthDay":"Jun 22, 2012 9:54:49 PM"},{"id":2,"name":"曹贵生"
Stella981 Stella981
3年前
Python竟然能画这么漂亮的折线图运营妹子看到直接哭了
ShowMorefunction\_typeof(e){returne&amp;&amp;"undefined"!typeofSymbol&amp;&amp;e.constructorSymbol?"symbol":typeofe;}!function(e){if("object"("undefined"typeof
Stella981 Stella981
3年前
SeleniumConf
展开function\_typeof(e){returne&amp;&amp;"undefined"!typeofSymbol&amp;&amp;e.constructorSymbol?"symbol":typeofe;}!function(e){if("object"("undefined"typeofmodule?
Python进阶者 Python进阶者
1年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这