ABAP——发送Excel报表邮件

程序运行效果:

 

Tcode SOST:

 

代码:

************************************************************************
* Program Name      :
* Descriptions      :
* T-Code            :
* Updates Tables    :
* Input  Parameters :
* Output Parameters :
* Return Codes      :
* Special Logic     :
* Includes          :
************************************************************************
* Modification Log
************************************************************************
*   Date   Ver. Programmer   Descriptions
* -------- ---- ------------ -------------------------------------------
* 2019 1.16  XXX Create
*
************************************************************************
REPORT zpprtest.
***********************************************************************
* Tables Definitions
************************************************************************
TABLES: mara.
************************************************************************
* Data Definitions
************************************************************************
TYPES: BEGIN OF ty_mara,
         matnr TYPE mara-matnr,
         maktx TYPE makt-maktx,
       END OF ty_mara,
       BEGIN OF ty_mard,
         matnr TYPE mard-matnr,
         meins TYPE mara-meins,
         lgort TYPE mard-lgort,
         labst TYPE mard-labst,
       END OF ty_mard.

DATA: gt_mara TYPE TABLE OF ty_mara,
      gt_mard TYPE TABLE OF ty_mard.

DATA: gv_mail_address TYPE ad_smtpadr,
      gv_mat         TYPE string,
      gv_stock       TYPE string.

DATA: gs_layout   TYPE slis_layout_alv,
      gt_fieldcat TYPE slis_t_fieldcat_alv.

************************************************************************
* Includes Module
************************************************************************

************************************************************************
* Selection Screen
************************************************************************
SELECTION-SCREEN BEGIN OF  BLOCK b1 WITH FRAME TITLE TEXT-b01.
PARAMETERS: p_werks LIKE mard-werks OBLIGATORY DEFAULT '2000'.
SELECT-OPTIONS: s_matnr FOR mara-matnr.
SELECTION-SCREEN END OF BLOCK b1.

SELECTION-SCREEN BEGIN OF BLOCK b2 WITH FRAME TITLE TEXT-b02.
PARAMETERS: c_m1 AS CHECKBOX,
            p_t1 TYPE so_obj_des.
SELECT-OPTIONS: s_m1 FOR gv_mail_address NO INTERVALS.
SELECTION-SCREEN END OF BLOCK b2.


************************************************************************
* Initialization
************************************************************************
INITIALIZATION.

************************************************************************
* At Selection Screen
************************************************************************
AT SELECTION-SCREEN.

************************************************************************
* At Selection Screen Output
************************************************************************
AT SELECTION-SCREEN OUTPUT.

************************************************************************
* Report Format
************************************************************************
TOP-OF-PAGE.

END-OF-PAGE.
************************************************************************
* Main Process
************************************************************************
START-OF-SELECTION.
  PERFORM frm_get_data.

  IF c_m1 = 'X'.
    PERFORM frm_send_mail TABLES s_m1.
  ENDIF.

  PERFORM frm_display_data.

END-OF-SELECTION.
*&---------------------------------------------------------------------*
*& Form FRM_GET_DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_get_data .

*-->物料基本资料
  SELECT mara~matnr makt~maktx INTO TABLE gt_mara
         FROM mara
         INNER JOIN makt ON mara~matnr = makt~matnr
         WHERE mara~matnr IN s_matnr
  AND makt~spras = sy-langu.

*-->物料库存
  SELECT mara~matnr mara~meins mard~lgort mard~labst
         INTO TABLE gt_mard
         FROM mard
         INNER JOIN mara ON mard~matnr = mara~matnr
         WHERE werks = p_werks
         AND mard~labst > 0
  AND mara~matnr IN s_matnr.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_SEND_MAIL
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_send_mail TABLES lt_mail_addr STRUCTURE s_m1.


  DATA: lo_send_request  TYPE REF TO cl_bcs,          "请求
        lo_document      TYPE REF TO cl_document_bcs, "文档
        lo_recipient     TYPE REF TO if_recipient_bcs,"接收者
        lo_bcs_exception TYPE REF TO cx_bcs.          "异常

  DATA: lt_main_text       TYPE bcsy_text, "主要内容
        lt_binary_content  TYPE solix_tab, "二进制内容
        lv_size            TYPE so_obj_len,"文件內容大小
        lt_binary_content2 TYPE solix_tab, "二进制内容
        lv_size2           TYPE so_obj_len,"文件內容大小
        lv_sent_to_all     TYPE os_boolean.

  "整理附件数据
  PERFORM frm_process_mail_data.

* --------------------------------------------------------------
* convert the text string into UTF-16LE binary data including
* byte-order-mark. Mircosoft Excel prefers these settings
* all this is done by new class cl_bcs_convert (see note 1151257)

* 物料
  TRY.
      cl_bcs_convert=>string_to_solix(
        EXPORTING
          iv_string   = gv_mat
          iv_codepage = '4103'  "suitable for MS Excel, leave empty
          iv_add_bom  = 'X'     "for other doc types
        IMPORTING
          et_solix  = lt_binary_content
          ev_size   = lv_size ).
    CATCH cx_bcs.
      MESSAGE e445(so).
  ENDTRY.

* 库存
  TRY.
      cl_bcs_convert=>string_to_solix(
        EXPORTING
          iv_string   = gv_stock
          iv_codepage = '4103'  "suitable for MS Excel, leave empty
          iv_add_bom  = 'X'     "for other doc types
        IMPORTING
          et_solix  = lt_binary_content2
          ev_size   = lv_size2 ).
    CATCH cx_bcs.
      MESSAGE e445(so).
  ENDTRY.

  TRY.

*     -------- create persistent send request ------------------------
      lo_send_request = cl_bcs=>create_persistent( ).

*     -------- create and set document with attachment ---------------
*     create document object from internal table with text
*     append 'Hello world!' to main_text.                  "#EC NOTEXT

*     邮件内容
      APPEND 'Dear Mr and Miss:' TO lt_main_text.
      APPEND '' TO lt_main_text.
      APPEND '     This Email is sent by systme, Do not Return the Email.' TO lt_main_text.
      APPEND '' TO lt_main_text.
      APPEND 'Thanks.' TO lt_main_text.

      lo_document = cl_document_bcs=>create_document(
        i_type    = 'RAW'
        i_text    = lt_main_text
        i_subject = p_t1 ).

*     add the spread sheet as attachment to document object

*     物料
      lo_document->add_attachment(
        i_attachment_type    = 'xls'                        "#EC NOTEXT
        i_attachment_subject = '物料'
        i_attachment_size    = lv_size
        i_att_content_hex    = lt_binary_content ).

*     库存
      lo_document->add_attachment(
        i_attachment_type    = 'xls'                        "#EC NOTEXT
        i_attachment_subject = '库存'
        i_attachment_size    = lv_size2
        i_att_content_hex    = lt_binary_content2 ).

*     add document object to send request
      lo_send_request->set_document( lo_document ).

*     --------- add recipient (e-mail address) -----------------------
      LOOP AT lt_mail_addr.
*     create recipient object
        lo_recipient =
        cl_cam_address_bcs=>create_internet_address( lt_mail_addr-low ).
*     add recipient object to send request
        lo_send_request->add_recipient( lo_recipient ).
      ENDLOOP.

*     ---------- send document ---------------------------------------
      lv_sent_to_all = lo_send_request->send( i_with_error_screen = 'X' ).

      IF lv_sent_to_all IS INITIAL.
        MESSAGE i500(sbcoms).
      ELSE.
        COMMIT WORK.
        MESSAGE s022(so).
      ENDIF.

*   ------------ exception handling ----------------------------------
*   replace this rudimentary exception handling with your own one !!!
    CATCH cx_bcs INTO lo_bcs_exception.
      MESSAGE i865(so) WITH lo_bcs_exception->error_type.
  ENDTRY.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_DISPLAY_DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_display_data .

  gs_layout-colwidth_optimize = 'X'.

  PERFORM frm_create_field.

  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
      i_callback_program = sy-repid
      is_layout          = gs_layout
      it_fieldcat        = gt_fieldcat[]
      i_save             = 'A'
    TABLES
      t_outtab           = gt_mard
    EXCEPTIONS
      program_error      = 1
      OTHERS             = 2.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_CREATE_FIELD
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_create_field .

  DATA: ls_fieldcat TYPE slis_fieldcat_alv,
        lv_count    TYPE i.

  DEFINE fieldcat.
    ADD 1 TO lv_count.
    ls_fieldcat-col_pos    = lv_count.
    ls_fieldcat-fieldname  = &1.
    ls_fieldcat-ref_fieldname = &2.
    ls_fieldcat-ref_tabname = &3.
    ls_fieldcat-qfieldname = &4.
    ls_fieldcat-seltext_m = ls_fieldcat-seltext_l =
    ls_fieldcat-seltext_s = &5.
    ls_fieldcat-ddictxt = &6.

    APPEND ls_fieldcat TO gt_fieldcat.
    CLEAR ls_fieldcat.
  END-OF-DEFINITION.

  fieldcat 'MATNR' 'MATNR' 'MARA' '' '' ''.
  fieldcat 'MEINS' 'MEINS' 'MARA' '' '' ''.
  fieldcat 'LGORT' 'LGORT' 'MARD' '' '' ''.
  fieldcat 'LABST' 'LABST' 'MARD' 'MEINS' '库存' 'L'.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_PROCESS_MAIL_DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_process_mail_data .

  CONSTANTS: lc_tab  TYPE c VALUE cl_bcs_convert=>gc_tab,
             lc_crlf TYPE c VALUE cl_bcs_convert=>gc_crlf.

  DATA: ls_mara TYPE ty_mara,
        ls_mard TYPE ty_mard.

  DATA: lv_line      TYPE string,
        lv_labst(13) TYPE c.

  "标题
  CONCATENATE '物料'
              '说明' INTO lv_line SEPARATED BY lc_tab.

  "换行
  CONCATENATE gv_mat lv_line lc_crlf INTO gv_mat.

  LOOP AT gt_mara INTO ls_mara.

    CONCATENATE ls_mara-matnr
                ls_mara-maktx
                INTO lv_line SEPARATED BY lc_tab.

    "换行
    CONCATENATE gv_mat lv_line lc_crlf INTO gv_mat.
  ENDLOOP.

  CLEAR lv_line.

  "标题
  CONCATENATE '物料'
              '单位'
              '仓库'
              '库存' INTO lv_line SEPARATED BY lc_tab.

  "换行
  CONCATENATE gv_stock lv_line lc_crlf INTO gv_stock.

  LOOP AT gt_mard INTO ls_mard.
    CLEAR lv_labst.

    lv_labst = ls_mard-labst.

    CONCATENATE ls_mard-matnr
                ls_mard-meins
                ls_mard-lgort
                lv_labst
                INTO lv_line SEPARATED BY lc_tab.
    "换行
    CONCATENATE gv_stock lv_line lc_crlf INTO gv_stock.
  ENDLOOP.

ENDFORM.

 

 

其他博主的好文——SAP压缩excel并发送mail案例

posted @ 2019-01-16 17:41  鲸与海  阅读(2672)  评论(0编辑  收藏  举报