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_data
    EXPORTING
      p_data      = <fs_data>
    RECEIVING
      p_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类型-> 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.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/412164.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

第 1 章 微信小程序与云开发从入门到实践从零开始做小程序——开发认识微信小程序

小北的参考工具书 小程序开发的图书并不少&#xff0c;这本书仍然值得你拥有&#xff01; 首先&#xff0c;这是一本全栈小程序开发教程&#xff0c;循序渐进&#xff0c;由浅入深&#xff0c;介绍了小程序开发你想了解的方方面面&#xff0c;包括近其小程序开发的各种新技术应…

golang gin单独部署vue3.0前后端分离应用

概述 因为公司最近的项目前端使用vue 3.0&#xff0c;后端api使用golang gin框架。测试通过后&#xff0c;博文记录&#xff0c;用于备忘。 步骤 npm run build&#xff0c;构建出前端项目的dist目录&#xff0c;dist目录的结构具体如下图 将dist目录复制到后端程序同级目录…

汽车电子笔记:BootLoader升级过程疑难问题解决方式(Bootloader响应10 02 + 刷死拯救机制)

目录 1、概述 2、如何在BootLoader响应10 02 2.1、实现流程图 2.2、实现方式&#xff08;代码思路&#xff09; 3、刷死拯救机制(100%能救活&#xff0c;适配各类控制器的方法) 3.1、强留Boot流程图 3.2、实现方式&#xff08;代码思路&#xff09; 1、概述 BootLoader作…

Ansible script 模块 该模块用于将本机的脚本在被管理端的机器上运行。Ansible服务执行本机脚本

目录 过程首先&#xff0c;我们写一个脚本&#xff0c;并给其加上执行权限直接运行命令来实现在被管理端执行该脚本验证错误演示 过程 该模块直接指定脚本的路径即可 首先&#xff0c;我们写一个脚本&#xff0c;并给其加上执行权限 vim /tmp/df.sh编辑脚本内容 这个脚本内容…

React_使用es5和es6语法渲染和添加class

React入门 //react的核心库 <script src"https://cdn.jsdelivr.net/npm/react17/umd/react.development.js"></script> //react操作dom的核心库&#xff0c;类似于jquery <script src"https://cdn.jsdelivr.net/npm/react-dom17/umd/react-dom.…

备考2024年高考全国甲卷文科数学:历年选择题真题练一练

距离2024年高考还有三个多月的时间&#xff0c;最后这个时间&#xff0c;同学们基本上是以刷题为主。刷题的时候最重要的是把往年的真题吃透&#xff0c;因为真题是严格按照考纲出的&#xff0c;掌握了真题后面的知识点&#xff0c;并能举一反三地运用&#xff0c;那么高考的高…

安装淘宝镜像cnpm报错

npm 安装淘宝镜像报错 npm install -g cnpm --registryhttps://registry.npm.taobao.org 安装报 The operation was rejected by your operating system. npm ERR! Its possible that the file was already in use (by a text editor or antivirus), npm ERR! or that you la…

Spark集群搭建的三种方式详解

国科大学习生活&#xff08;期末复习资料、课程大作业解析、学习文档等&#xff09;: 文章专栏&#xff08;点击跳转&#xff09; 大数据开发学习文档&#xff08;分布式文件系统的实现&#xff0c;大数据生态圈学习文档等&#xff09;: 文章专栏&#xff08;点击跳转&#xff…

面试redis篇-10Redis集群方案-主从复制

在Redis中提供的集群方案总共有三种: 主从复制哨兵模式分片集群主从复制 单节点Redis的并发能力是有上限的,要进一步提高Redis的并发能力,就需要搭建主从集群,实现读写分离。 主从数据同步原理 Replication Id:简称replid,是数据集的标记,id一致则说明是同一数据集。每…

java高级——反射

目录 反射概述反射的使用获取class对象的三种方式反射获取类的构造器1. 获取类中所有的构造器2. 获取单个构造器 反射获取构造器的作用反射获取成员变量反射变量赋值、取值获取类的成员方法反射对象类方法执行 反射简易框架案例案例需求实现步骤代码如下 反射概述 什么是反射 反…

【深入理解设计模式】装饰者设计模式

装饰者设计模式 装饰者设计模式&#xff08;Decorator Design Pattern&#xff09;是一种结构型设计模式&#xff0c;它允许向现有对象添加新功能而不改变其结构。这种模式通常用于需要动态地为对象添加功能或行为的情况&#xff0c;而且这些功能可以独立于对象本身来进行扩展…

Doris实战——结合Flink构建极速易用的实时数仓

目录 一、实时数仓的需求与挑战 二、构建极速易用的实时数仓架构 三、解决方案 3.1 如何实现数据的增量与全量同步 3.1.1 增量及全量数据同步 3.1.2 数据一致性保证 3.1.3 DDL 和 DML 同步 Light Schema Change Flink CDC DML 和DDL同步 3.2 如何基于Flink实现多种数…

小程序应用、页面、组件生命周期

引言 微信小程序生命周期是指在小程序运行过程中&#xff0c;不同阶段触发的一系列事件和函数。这一概念对于理解小程序的整体架构和开发流程非常重要。本文将介绍小程序生命周期的概念以及在不同阶段触发的关键事件&#xff0c;帮助开发者更好地理解和利用小程序的生命周期。 …

2024程序员容器化上云之旅-第4集-Ubuntu-WSL2-Windows11版:夺取宝剑

故事梗概 Java程序员马意浓在互联网公司维护老旧电商后台系统。 渴望学习新技术的他在工作中无缘Docker和K8s。 他开始自学Vue3并使用SpringBoot3完成了一个前后端分离的Web应用系统&#xff0c;并打算将其用Docker容器化后用K8s上云。 6 夺取宝剑 &#x1f525;阅读Nigel…

Coursera吴恩达机器学习专项课程02:Advanced Learning Algorithms 笔记 Week01

Advanced Learning Algorithms Week 01 笔者在2022年7月份取得这门课的证书&#xff0c;现在&#xff08;2024年2月25日&#xff09;才想起来将笔记发布到博客上。 Website: https://www.coursera.org/learn/advanced-learning-algorithms?specializationmachine-learning-in…

3. Java中的锁

文章目录 乐观锁与悲观锁乐观锁(无锁编程,版本号机制)悲观锁两种锁的伪代码比较 通过 8 种锁运行案例,了解锁锁相关的 8 种案例演示场景一场景二场景三场景四场景五场景六场景七场景八 synchronized 有三种应用方式8 种锁的案例实际体现在 3 个地方 从字节码角度分析 synchroni…

亿道推出重磅加固平板!为行业发展注入新动力

随着科技生产力的不断发展&#xff0c;各行各业都得到质的飞跃。产品的迭代速度也大大加快&#xff0c;作为全球领先的加固行移动终端一站式提供商&#xff0c;亿道信息跟紧时代潮流&#xff0c;推出EM-I10J、EM-I20J两款均衡型加固平板&#xff0c;为行业发展注入新动力。 接地…

.[hudsonL@cock.li].mkp勒索加密数据库完美恢复---惜分飞

有朋友oracle数据库所在机器被加密,扩展名为&#xff1a;.[hudsonLcock.li].mkp,数据文件类似&#xff1a; 通过专业工具分析,确认这次运气非常好,每个文件就加密破坏前面31个block 通过研发的Oracle数据文件勒索恢复工具进行恢复 顺利数据库并且导出数据 mkp勒索病毒预…

【大厂AI课学习笔记NO.55】2.3深度学习开发任务实例(8)模型训练

作者简介&#xff1a;giszz&#xff0c;腾讯云人工智能从业者TCA认证&#xff0c;信息系统项目管理师。 博客地址&#xff1a;https://giszz.blog.csdn.net 声明&#xff1a;本学习笔记来自腾讯云人工智能课程&#xff0c;叠加作者查阅的背景资料、延伸阅读信息&#xff0c;及学…

CDQ分治详解,一维、二维、三维偏序

文章目录 零、偏序关系一、一维偏序二、二维偏序三、三维偏序(CDQ)3.1CDQ分治3.2CDQ分治解决三维偏序的流程 四、OJ练习4.1三维偏序模板题4.1.1原题链接4.1.2AC代码 4.2老C的任务4.2.1原题链接4.2.2解题思路4.2.3AC代码 4.3动态逆序对4.3.1原题链接4.3.2解题思路4.3.3AC代码 零…