行业知识
ABAP 发送带EXCEL邮件
2026-10-28 13:55:00
来源:互联网转载
前言
���啥特殊需求,就是有个库龄报表用户想整邮件发送
实现
用的最简单的XLS文件作为excel附件发送出去
观察XLS文件的纯文本格式,每列之间用TAB制表符分隔,每行之间用回车符分隔
思路也比较明确,在SAP中实现这种格式,再转二进制流就好了
下面的代码替换掉lt_data就可以直接使用,用的动态内表自动将内表转成纯文本
*&---------------------------------------------------------------------**& Form frm_2023122702*&---------------------------------------------------------------------**& text*&---------------------------------------------------------------------**& --> p1 text*& * TO . " EXCEL表头* LOOP AT gt_fieldcat_alv INTO DATA(ls_fieldcat_alv).* " 单元格 + TAB符* lv_str = lv_str && ls_fieldcat_alv-seltext_l && cl_abap_char_utilities=>horizontal_tab.* ENDLOOP.* " 最后使用回车符换行* lv_str = lv_str && cl_abap_char_utilities=>cr_lf.*&--获取内表列字段 CALL METHOD cl_abap_structdescr=>describe_by_data EXPORTING p_data = RECEIVING p_descr_ref = lo_descr. lo_str_descr_in ?= lo_descr.*&--EXCEL表体 LOOP AT ASSIGNING .* CLEAR: lv_str,lv_start,lv_end. " 循环每行的每个单元格 LOOP AT lo_str_descr_in->components INTO ls_abap_comp_descr. " 根据字段名找到字段 ASSIGN COMPONENT ls_abap_comp_descr-name OF STRUCTURE TO . " 去除首尾引号,否则xls文件中tab符会有问题 lv_cell = . REPLACE ALL OCCURRENCES OF REGEX '^"*|"*$' IN lv_cell WITH ''. " 单元格 + TAB符 lv_str = lv_str && lv_cell && cl_abap_char_utilities=>horizontal_tab. ENDLOOP. " 最后使用回车符换行 lv_str = lv_str && cl_abap_char_utilities=>cr_lf. ENDLOOP. "string类型-> XSTRING CALL FUNCTION 'SCMS_STRING_TO_XSTRING' EXPORTING text = lv_str* mimetype = 'XLS' encoding = '8404' "防止中文乱码 IMPORTING buffer = lv_benfile EXCEPTIONS failed = 1 OTHERS = 2. IF lv_benfile IS NOT INITIAL. CALL FUNCTION 'SCMS_XSTRING_TO_BINARY' EXPORTING buffer = lv_benfile IMPORTING output_length = lv_size TABLES binary_tab = lt_record. ENDIF. "将转换后的文件添加到邮件附件 APPEND LINES OF lt_record TO lt_objbin.* &---邮件处理 " 获取收件人 SELECT DISTINCT smtp_addr FROM zmmt045 INTO TABLE @DATA(lt_receiver). lv_size = lines( lt_objbin ) * 255. "添加邮件正文 ls_objtxt = 'ZMMR011报表已导出,请查看附件'. " APPEND ls_objtxt TO lt_objtxt. "邮件正文行数 lv_lines_txt = lines( lt_objtxt ). lv_object = 'ZMMR011导出'. " 标题:ZMMR011报表 lv_filename = 'ZMMR011.XLS'. " 附件XLS命名 ls_doc_chng-obj_langu = sy-langu. ls_doc_chng-obj_name = 'Email'. " Email* ls_doc_chng-expiry_dat = sy-datum + 10. " 邮件过期日,在此日期后邮件将无法被查看 ls_doc_chng-obj_descr = lv_object. "邮件标题* ls_doc_chng-sensitivty = 'F'. " 邮件保密等级 ls_doc_chng-doc_size = lv_lines_txt * 255 + lv_size. ls_doc_chng-priority = '3'. " 1:低优先级 3:普通优先级 5:高优先级 CLEAR ls_objpack-transf_bin. ls_objpack-head_start = 1. ls_objpack-head_num = 0. ls_objpack-body_start = 1. ls_objpack-body_num = lv_lines_txt. ls_objpack-doc_type = 'RAW'. APPEND ls_objpack TO lt_objpack. CLEAR:lv_lines_bin. ls_objpack-transf_bin = 'X'. ls_objpack-head_start = 1. ls_objpack-head_num = 1. ls_objpack-body_start = 1. lv_lines_bin = lines( lt_objbin ). ls_objpack-doc_size = lv_size . ls_objpack-body_num = lv_lines_bin. ls_objpack-doc_type = 'XLS'. ls_objpack-obj_descr = lv_filename. APPEND ls_objpack TO lt_objpack. lt_reclist = VALUE #( FOR lw_receiver IN lt_receiver ( receiver = lw_receiver " 收件人邮箱 rec_type = 'U' ) ). CALL FUNCTION 'SO_NEW_DOCUMENT_ATT_SEND_API1' EXPORTING document_data = ls_doc_chng " 邮件属性 put_in_outbox = '' commit_work = 'X' TABLES packing_list = lt_objpack " 邮件内容 contents_bin = lt_objbin " 附件内容(二进制) contents_txt = lt_objtxt " 邮件内容(直接填入) receivers = lt_reclist " 收件箱地址 EXCEPTIONS too_many_receivers = 1 document_not_sent = 2 document_type_not_exist = 3 operation_no_authorization = 4 parameter_error = 5 x_error = 6 enqueue_error = 7 OTHERS = 8. IF sy-subrc = 0.* es_return-type = 'S'.* es_return-message = es_return-message && TEXT-m19. " 邮件发送成功 WAIT UP TO 1 SECONDS. " 立即发送邮件 SUBMIT rsconn01 "#EC CI_SUBMIT WITH mode = 'INT' WITH output = '' AND RETURN. ". ELSE.* es_return-type = 'S'.* es_return-message = es_return-message && TEXT-m20. " 邮件发送失败 ENDIF.ENDFORM.
上一篇:怎have怎么读?
下一篇:模拟城服务器怎么开启?