当前位置: 首页 > news >正文

ABAP 发送带EXCEL邮件

前言

没啥特殊需求,就是有个库龄报表用户想整邮件发送

实现

用的最简单的XLS文件作为excel附件发送出去
观察XLS文件的纯文本格式,每列之间用TAB制表符分隔,每行之间用回车符分隔
在这里插入图片描述
思路也比较明确,在SAP中实现这种格式,再转二进制流就好了
下面的代码替换掉lt_data就可以直接使用,用的动态内表自动将内表转成纯文本

*&---------------------------------------------------------------------*
*& Form frm_2023122702
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_2023122702 .TYPES: BEGIN OF ty_mrtab,matnr TYPE mara-matnr,maktx TYPE makt-maktx,mtart TYPE mara-mtart,END OF ty_mrtab.FIELD-SYMBOLS: <gt_table> TYPE table.         "DYNAMIC TABLE INDICATE" 容器字段FIELD-SYMBOLS: <fs_data>      TYPE any,<fs_cell_data> TYPE any.DATA: lr_data            TYPE REF TO data,lo_descr           TYPE REF TO cl_abap_typedescr,lo_str_descr_in    TYPE REF TO cl_abap_structdescr,ls_abap_comp_descr TYPE abap_compdescr."附件参数DATA: lt_otf    TYPE TABLE OF itcoo,lt_tline  TYPE TABLE OF tline,lt_record TYPE TABLE OF solisti1,ls_otf    TYPE itcoo,ls_tline  TYPE tline,ls_record TYPE solisti1."邮件参数DATA: lv_size      TYPE i, "邮件附件大小lv_lines_txt TYPE i, "邮件文本行数lv_lines_bin TYPE i, "邮件附件行数lv_benfile   TYPE xstring,lv_object    TYPE char50, "邮件主题lv_filename  TYPE char50,lt_objpack   TYPE TABLE OF sopcklsti1 , "邮件内容 正文+附件lt_objtxt    TYPE TABLE OF solisti1   , "正文内容lt_objbin    TYPE TABLE OF solisti1   , "附件内容lt_reclist   TYPE TABLE OF somlreci1  , "收件人ls_doc_chng  TYPE sodocchgi1, "邮件属性ls_objpack   TYPE sopcklsti1,ls_objtxt    TYPE solisti1,ls_objbin    TYPE solisti1,ls_reclist   TYPE somlreci1.DATA: lv_str  TYPE string,lv_cell TYPE string.* 需要转excel的内表DATA: lt_data TYPE TABLE OF ty_mrtab.lt_data = VALUE #( ( matnr = '100' maktx = '硅粉621,纯度≥99.1%,P<80ppm;B<50ppm' mtart = '1000' )( matnr = '200' maktx = '硅粉621,纯度≥99.1%,P<80ppm;B<50ppm' mtart = '1000' ) )." 转动态内表以符合各种场景ASSIGN lt_data TO <gt_table>.*&--获取lt_data的表结构CREATE DATA lr_data LIKE LINE OF <gt_table>.ASSIGN lr_data->* TO <fs_data>." 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_dataEXPORTINGp_data      = <fs_data>RECEIVINGp_descr_ref = lo_descr.lo_str_descr_in ?= lo_descr.*&--EXCEL表体LOOP AT <gt_table> ASSIGNING <fs_data>.
*    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 <fs_data> TO <fs_cell_data>." 去除首尾引号,否则xls文件中tab符会有问题lv_cell = <fs_cell_data>.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类型-> XSTRINGCALL FUNCTION 'SCMS_STRING_TO_XSTRING'EXPORTINGtext     = lv_str
*     mimetype = 'XLS'encoding = '8404' "防止中文乱码IMPORTINGbuffer   = lv_benfileEXCEPTIONSfailed   = 1OTHERS   = 2.IF lv_benfile IS NOT INITIAL.CALL FUNCTION 'SCMS_XSTRING_TO_BINARY'EXPORTINGbuffer        = lv_benfileIMPORTINGoutput_length = lv_sizeTABLESbinary_tab    = lt_record.ENDIF."将转换后的文件添加到邮件附件APPEND LINES OF lt_record TO lt_objbin.*  &---邮件处理" 获取收件人SELECT DISTINCTsmtp_addrFROM zmmt045INTO 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'EXPORTINGdocument_data              = ls_doc_chng  " 邮件属性put_in_outbox              = ''commit_work                = 'X'TABLESpacking_list               = lt_objpack  " 邮件内容contents_bin               = lt_objbin   " 附件内容(二进制)contents_txt               = lt_objtxt   " 邮件内容(直接填入)receivers                  = lt_reclist  " 收件箱地址EXCEPTIONStoo_many_receivers         = 1document_not_sent          = 2document_type_not_exist    = 3operation_no_authorization = 4parameter_error            = 5x_error                    = 6enqueue_error              = 7OTHERS                     = 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_SUBMITWITH mode = 'INT' WITH output = '' AND RETURN. ".ELSE.
*    es_return-type = 'S'.
*    es_return-message = es_return-message && TEXT-m20. " 邮件发送失败ENDIF.ENDFORM.
http://www.lryc.cn/news/306704.html

相关文章:

  • Linux Nginx SSL 证书配置正确,扔展示不安全
  • 算法沉淀——动态规划之子数组、子串系列(上)(leetcode真题剖析)
  • Flutter GetX 之 暗黑模式
  • SQLlabs46关
  • 【Android移动开发】Windows10平台安装Android Studio与人工智能算法模型部署案例
  • 【IDEA】java 项目启动偶现Kotlin 版本问题 error:Kotlin:module was
  • Jmeter系列(2)目录介绍
  • vue基础操作(vue基础)
  • EEA架构
  • 【物联网应用案例】牧场牛棚环境管理项目
  • 【Vue】组件通信组件通信
  • 瑞_Redis_Redis客户端
  • 在Ubuntu系统下搭建TDengine集群
  • Easy-Jmeter: 性能测试平台
  • Unity3D Lua与C#的相互调用与性能剖析详解
  • 鸿蒙开发路由跳转踩坑
  • SpringBoot 3 新特性
  • Day02:Web架构前后端分离站Docker容器站集成软件站建站分配
  • 链表和顺序表的优劣分析及其时间、空间复杂度分析
  • QQ防红跳转短网址生成网站完整源码
  • 面试redis篇-10Redis集群方案-主从复制
  • 【BUG 记录】史诗级 BUG - MYSQL 删库删表却没有备份如何恢复数据
  • 天翼云登录参数JavaSrcipt逆向
  • AI与大数据:智慧城市安全的护航者与变革引擎
  • adb pull 使用
  • 算法【线性表的查找-顺序查找】
  • 力扣1143. 最长公共子序列(动态规划)
  • 如何使用群晖NAS中FTP服务开启与使用固定地址远程上传下载本地文件?
  • C语言文件知识点
  • C语言:数组指针 函数指针