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案例
落霞与孤鹜齐飞,秋水共长天一色