ABAP XML 发送邮件

本文详细描述了如何在SAPABAP环境中利用IF_IXML接口创建XML文档,构建Excel工作簿,填充数据,并通过SMTP发送带有附件的电子邮件。
摘要由CSDN通过智能技术生成

前言

XML 发送邮件

代码


DATA: GT_SPFLI TYPE TABLE OF SPFLI WITH HEADER LINE.

TYPES: BEGIN OF XML_LINE,
        DATA(255) TYPE X,
     END OF XML_LINE.
DATA:L_IXML TYPE REF TO IF_IXML,
     L_STREAMFACTORY TYPE REF TO IF_IXML_STREAM_FACTORY,
     L_OSTREAM       TYPE REF TO IF_IXML_OSTREAM,
     L_RENDERER      TYPE REF TO IF_IXML_RENDERER,
     L_DOCUMENT      TYPE REF TO IF_IXML_DOCUMENT,
     L_XML_TABLE_FORECAST  TYPE TABLE OF XML_LINE,

     WA_XML                TYPE XML_LINE,
     GS_SOLIX              TYPE SOLIX,

     L_RC            TYPE I,
     L_XML_SIZE      TYPE I,

     R_WORKSHEET     TYPE REF TO IF_IXML_ELEMENT,
     R_TABLE         TYPE REF TO IF_IXML_ELEMENT,
     R_COLUMN        TYPE REF TO IF_IXML_ELEMENT,
     R_ROW           TYPE REF TO IF_IXML_ELEMENT,
     R_CELL          TYPE REF TO IF_IXML_ELEMENT,
     R_DATA          TYPE REF TO IF_IXML_ELEMENT,
     L_VALUE         TYPE STRING.

DATA BINARY_CONTENT_FORECAST TYPE SOLIX_TAB.
DATA SEND_REQUEST   TYPE REF TO CL_BCS.
DATA BCS_EXCEPTION  TYPE REF TO CX_BCS.
DATA DOCUMENT       TYPE REF TO CL_DOCUMENT_BCS.
DATA RECIPIENT      TYPE REF TO IF_RECIPIENT_BCS.
DATA MAIN_TEXT      TYPE BCSY_TEXT.
DATA LC_XLS_TYPE TYPE SO_OBJ_TP VALUE 'XLS'.
DATA TITLE1(50) TYPE C.
DATA MAILTO TYPE AD_SMTPADR.
DATA SENT_TO_ALL    TYPE OS_BOOLEAN.


  CLEAR GT_SPFLI.REFRESH GT_SPFLI.
  SELECT * INTO CORRESPONDING FIELDS OF TABLE GT_SPFLI FROM SPFLI.

  L_IXML = CL_IXML=>CREATE( ).
  L_DOCUMENT = L_IXML->CREATE_DOCUMENT( ).

  PERFORM CREATE_WORKBOOK USING L_DOCUMENT
                                R_WORKSHEET
                                R_TABLE.
  PERFORM FRM_FORECAST_COLUMN_FORMAT USING L_DOCUMENT R_TABLE.
  LOOP AT GT_SPFLI.
    R_ROW = L_DOCUMENT->CREATE_SIMPLE_ELEMENT( NAME = 'Row' PARENT = R_TABLE ).
    PERFORM FRM_VALUE_DATA USING GT_SPFLI-CARRID."赋值
    PERFORM FRM_VALUE_DATA USING GT_SPFLI-CITYFROM."赋值
  ENDLOOP.

  L_STREAMFACTORY = L_IXML->CREATE_STREAM_FACTORY( ).
  L_OSTREAM = L_STREAMFACTORY->CREATE_OSTREAM_ITABLE( TABLE = L_XML_TABLE_FORECAST ).
  L_RENDERER = L_IXML->CREATE_RENDERER( OSTREAM = L_OSTREAM DOCUMENT = L_DOCUMENT ).
  L_RC = L_RENDERER->RENDER( ).
  L_XML_SIZE = L_OSTREAM->GET_NUM_WRITTEN_RAW( ).

  LOOP AT L_XML_TABLE_FORECAST INTO WA_XML.
    CLEAR GS_SOLIX.
    GS_SOLIX-LINE = WA_XML-DATA.
    APPEND GS_SOLIX TO BINARY_CONTENT_FORECAST.
  ENDLOOP.

  TRY.
      SEND_REQUEST = CL_BCS=>CREATE_PERSISTENT( ).
      TITLE1 = '测试数据'.
      APPEND '测试数据' TO MAIN_TEXT.
      APPEND '     谢谢!' TO MAIN_TEXT.
      APPEND  '' TO MAIN_TEXT.

      DOCUMENT = CL_DOCUMENT_BCS=>CREATE_DOCUMENT(
       I_TYPE    = 'RAW'
       I_TEXT    = MAIN_TEXT
       I_SUBJECT = TITLE1 ).      " 邮件主题名

      DOCUMENT->ADD_ATTACHMENT(
      I_ATTACHMENT_TYPE = LC_XLS_TYPE
      I_ATTACHMENT_SUBJECT = 'SpreadSheet'
      I_ATT_CONTENT_HEX = BINARY_CONTENT_FORECAST ).

      SEND_REQUEST->SET_DOCUMENT( DOCUMENT ).

      MAILTO = 'XXX'."收件人
      RECIPIENT = CL_CAM_ADDRESS_BCS=>CREATE_INTERNET_ADDRESS( MAILTO ).
      SEND_REQUEST->ADD_RECIPIENT( RECIPIENT ).
      SENT_TO_ALL = SEND_REQUEST->SEND( I_WITH_ERROR_SCREEN = 'X' ).

      COMMIT WORK.
      WAIT UP TO 10 SECONDS.
      SUBMIT RSCONN01 WITH MODE = 'INT'
                    WITH OUTPUT = 'X'
                    AND RETURN.
      IF SENT_TO_ALL IS INITIAL.
        MESSAGE I500(SBCOMS) WITH MAILTO.
      ELSE.
        MESSAGE S022(SO).
      ENDIF.

    CATCH CX_BCS INTO BCS_EXCEPTION.
      MESSAGE I865(SO) WITH BCS_EXCEPTION->ERROR_TYPE.
  ENDTRY.
FORM CREATE_WORKBOOK  USING    L_DOCUMENT TYPE REF TO IF_IXML_DOCUMENT
                               R_WORKSHEET TYPE REF TO IF_IXML_ELEMENT
                               R_TABLE TYPE REF TO IF_IXML_ELEMENT.

  DATA: L_ELEMENT_ROOT        TYPE REF TO IF_IXML_ELEMENT,
        NS_ATTRIBUTE          TYPE REF TO IF_IXML_ATTRIBUTE,
        R_ELEMENT_PROPERTIES  TYPE REF TO IF_IXML_ELEMENT,
        L_VALUE               TYPE STRING.

  L_ELEMENT_ROOT = L_DOCUMENT->CREATE_SIMPLE_ELEMENT( NAME = 'Workbook' PARENT = L_DOCUMENT ).
  L_ELEMENT_ROOT->SET_ATTRIBUTE( NAME = 'xmlns' VALUE = 'urn:schemas-microsoft-com:office:spreadsheet' ).

  NS_ATTRIBUTE = L_DOCUMENT->CREATE_NAMESPACE_DECL( NAME = 'ss' PREFIX = 'xmlns'
                                        URI = 'urn:schemas-microsoft-com:office:spreadsheet' ).
  L_ELEMENT_ROOT->SET_ATTRIBUTE_NODE( NS_ATTRIBUTE ).

  NS_ATTRIBUTE = L_DOCUMENT->CREATE_NAMESPACE_DECL( NAME = 'x' PREFIX = 'xmlns'
                                        URI = 'urn:schemas-microsoft-com:office:excel' ).
  L_ELEMENT_ROOT->SET_ATTRIBUTE_NODE( NS_ATTRIBUTE ).

*  create node for document properties
  R_ELEMENT_PROPERTIES = L_DOCUMENT->CREATE_SIMPLE_ELEMENT( NAME = 'TEST_REPORT' PARENT = L_ELEMENT_ROOT ).
  L_VALUE = SY-UNAME.
  L_DOCUMENT->CREATE_SIMPLE_ELEMENT( NAME = 'Author' VALUE = L_VALUE PARENT = R_ELEMENT_PROPERTIES ).

*  worksheet
  R_WORKSHEET = L_DOCUMENT->CREATE_SIMPLE_ELEMENT( NAME = 'Worksheet' PARENT = L_ELEMENT_ROOT ).
  R_WORKSHEET->SET_ATTRIBUTE_NS( NAME = 'Name' PREFIX = 'ss' VALUE = 'Sheet1' ).

*  table
  R_TABLE = L_DOCUMENT->CREATE_SIMPLE_ELEMENT( NAME = 'Table' PARENT = R_WORKSHEET ).
  R_TABLE->SET_ATTRIBUTE_NS( NAME = 'FullColumns' PREFIX = 'x' VALUE = '1' ).
  R_TABLE->SET_ATTRIBUTE_NS( NAME = 'FullRows'    PREFIX = 'x' VALUE = '1' ).
ENDFORM.                    "CREATE_WORKBOOK

FORM FRM_FORECAST_COLUMN_FORMAT  USING    L_DOCUMENT TYPE REF TO IF_IXML_DOCUMENT
                                          R_TABLE TYPE REF TO IF_IXML_ELEMENT.
  DATA: R_COLUMN       TYPE REF TO IF_IXML_ELEMENT,
        R_ROW          TYPE REF TO IF_IXML_ELEMENT,
        R_CELL         TYPE REF TO IF_IXML_ELEMENT,
        R_DATA         TYPE REF TO IF_IXML_ELEMENT.

  R_COLUMN = L_DOCUMENT->CREATE_SIMPLE_ELEMENT( NAME = 'Column' PARENT = R_TABLE ).
  R_COLUMN->SET_ATTRIBUTE_NS( NAME = 'Width' PREFIX = 'ss' VALUE = '60' )."设定第一列宽度

  R_COLUMN = L_DOCUMENT->CREATE_SIMPLE_ELEMENT( NAME = 'Column' PARENT = R_TABLE ).
  R_COLUMN->SET_ATTRIBUTE_NS( NAME = 'Width' PREFIX = 'ss' VALUE = '120' )."设定第二列宽度

  R_ROW = L_DOCUMENT->CREATE_SIMPLE_ELEMENT( NAME = 'Row' PARENT = R_TABLE ).
  R_ROW->SET_ATTRIBUTE_NS( NAME = 'AutoFitHeight' PREFIX = 'ss' VALUE = '1' ).

  R_CELL = L_DOCUMENT->CREATE_SIMPLE_ELEMENT( NAME = 'Cell' PARENT = R_ROW ).
  R_DATA = L_DOCUMENT->CREATE_SIMPLE_ELEMENT( NAME = 'Data' VALUE = '' PARENT = R_CELL )."栏位1
  R_DATA->SET_ATTRIBUTE_NS( NAME = 'Type' PREFIX = 'ss' VALUE = 'String' ).

  R_CELL = L_DOCUMENT->CREATE_SIMPLE_ELEMENT( NAME = 'Cell' PARENT = R_ROW ).
  R_DATA = L_DOCUMENT->CREATE_SIMPLE_ELEMENT( NAME = 'Data' VALUE = 'Depart.city' PARENT = R_CELL )."栏位2
  R_DATA->SET_ATTRIBUTE_NS( NAME = 'Type' PREFIX = 'ss' VALUE = 'String' ).

ENDFORM.  
FORM FRM_VALUE_DATA USING SVALUE.
  L_VALUE = SVALUE.

  R_CELL = L_DOCUMENT->CREATE_SIMPLE_ELEMENT( NAME = 'Cell' PARENT = R_ROW ).
  R_DATA = L_DOCUMENT->CREATE_SIMPLE_ELEMENT( NAME = 'Data' VALUE = L_VALUE PARENT = R_CELL ).
  R_DATA->SET_ATTRIBUTE_NS( NAME = 'Type' PREFIX = 'ss' VALUE = 'String' ).
ENDFORM.  

结果

  • 31
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

指尖溯光

创作不易您的鼓励是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值