ABAP 发送带EXCEL邮件

news2024/9/29 17:38:43

前言

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

实现

用的最简单的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.

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

golang学习4,glang的web接口

1.代码 package mainimport (/*"net/http"*/"github.com/gin-gonic/gin" )func main() {r : gin.Default()r.GET("/get", func(ctx *gin.Context) {ctx.String(200/*http.StatusOK*/, "hello word golang-web!")})r.POST("/use…

【Excel PDF 系列】POI + iText 库实现 Excel 转换 PDF

你知道的越多&#xff0c;你不知道的越多 点赞再看&#xff0c;养成习惯 如果您有疑问或者见解&#xff0c;欢迎指教&#xff1a; 企鹅&#xff1a;869192208 文章目录 前言转换前后效果引入 pom 配置代码实现 前言 最近遇到生成 Excel 并转 pdf 的需求&#xff0c;磕磕碰碰总…

大语言模型推理加速技术:计算加速篇

原文&#xff1a;大语言模型推理加速技术&#xff1a;计算加速篇 - 知乎 目录 简介 Transformer和Attention 瓶颈 优化目标 计算加速 计算侧优化 KVCache Kernel优化和算子融合 分布式推理 内存IO优化 Flash Attention Flash Decoding Continuous Batching Page…

STM32--低功耗模式详解

一、PWR简介 正常模式与睡眠模式耗电是mA级&#xff0c;停机模式与待机模式是uA级。 二、电源框图 供电区域有三处&#xff0c;分别是模拟部分供电&#xff08;VDDA&#xff09;&#xff0c;数字部分供电&#xff0c;包括VDD供电区域和1.8V供电区域&#xff0c;后备供电&…

WinForms中的Timer探究:Form Timer与Thread Timer的差异

WinForms中的Timer探究&#xff1a;Form Timer与Thread Timer的差异 在Windows Forms&#xff08;WinForms&#xff09;应用程序开发中&#xff0c;定时器&#xff08;Timer&#xff09;是一个常用的组件&#xff0c;它允许我们执行定时任务&#xff0c;如界面更新、周期性数据…

喜报|迪捷软件入选工信部“2023年信息技术应用创新解决方案”

为进一步推进信创生态建设&#xff0c;激发产业自主创新活力&#xff0c;高效促进供需协同发展&#xff0c;加强区域联动和资源整合&#xff0c;国家工业和信息化部网络安全产业发展中心&#xff08;工业和信息化部信息中心&#xff09;联合相关单位&#xff0c;遴选了一批可复…

【电子书】研发管理

资料 wx&#xff1a;1945423050 整理了一些互联网电子书&#xff0c;推荐给大家 研发管理 ABAQUS 6.14中文版有限元分析与实例详解.epubAkka入门与实践.epubAltium Designer 16电路设计与仿真从入门到精通.epubAltium Designer17电子设计速成实战宝典.epubApache Kafka源码剖…

git push 总是需要输入密码或者个人访问令牌personal access token解决方案

文章目录 遇到问题解决方法 遇到问题 git push的时候总是需要输入密码或者个人访问令牌personal access token 解决方法 ChatGPT给出的解决方案&#xff0c;解决了我的问题。 如果在使用 git push 命令时总是需要输入个人访问令牌&#xff0c;这可能是因为您的 GitHub 账号…

Git 突破 文件尺寸限制

前言 当Git本地存储里右超过50MB&#xff0c;却又确实需要上传的时候&#xff0c;就需要用到了不是 解决 本代码就是把大文件进行拆解成小文件&#xff0c;然后上传。 等到拉取下来的时候&#xff0c;可以直接再进行合并&#xff0c;合并成原文件 代码如下&#xff0c;仅供…

MySQL集群 双主架构(配置命令)

CSDN 成就一亿技术人&#xff01; 今天刚开学第一天给大家分享一期&#xff1a;MySQL集群双主的配置需求和命令 CSDN 成就一亿技术人&#xff01; 神秘泣男子主页&#xff1a;作者首页 <———— MySQL专栏 &#xff1a;MySQL数据库专栏<———— MySQL双主是一…

AutoSAR(基础入门篇)11.5-服务映射(自顶向下)

目录 一、配置Service Needs 二、配置Cfg同步 我们在下一节的实验课中讲解这里的具体配置流程,本节主要讲一下这些配置的大致流程和配置项的作用。NvBlockSwComponents是一个可选项, 我们这里开始不使用NvBlockSwComponents,将我们的Application SWC直接和NvM通过C/S连接起…

RC4算法

RC4 RC4是Ron Rivest为RSA设计的序列密码,RC4算法简单、速度快、容易用软硬件实现,因此应用广泛。比如WEP、WPA、SSL/TLS应用了RC4;Windows、Lotus notes、Apple APCE等软件系统也应用了RC4。 1. RC4算法 RC4具体算法如下: 第一步:密钥调度算法(The Key-Scheduling Alg…

数据结构与算法|线性结构

数据结构与算法|线性结构 第二章 线性结构2.1 多项式表示2.2 什么是线性表2.3 线性表的实现方式2.3.1 线性表的顺序存储实现2.3.2 线性表的链式存储实现1. 单链表实现2. 双链表实现 上篇&#xff1a;第一章、绪论 第二章 线性结构 线性结构是数据结构中最基础的&#xff0c;也…

【HarmonyOS】鸿蒙开发之Stage模型-基本概念——第4.1章

Stage模型-基本概念 名词解释 AbilityStage:应用组件的“舞台“ UIAbility:包含UI界面的应用组件&#xff0c;是系统调度的基本单元 WindowStage:组件内窗口的“舞台“ Window&#xff1a;用来绘制UI页面的窗口 HAP:Harmony Ability Package(鸿蒙能力类型的包) HSP:Harmony Sh…

ZYNQ:串口-CAN协议转换

前言 目前已经实现zynq的PS-CAN和PL-CAN功能。串口-CAN协议转换是实现以太网-CAN功能的过渡&#xff0c;通过这个流程能够减少后期以太网工程出现问题的频率。阶段性功能目标如下&#xff1a; 实现数据在CAN调试助手和串口调试助手之间的来回转换&#xff0c;从而了解中断机制…

B站项目-基于Pytorch的ResNet垃圾图片分类

基于Pytorch的ResNet垃圾图片分类 数据集预处理 画图片的宽高分布散点图 import osimport matplotlib.pyplot as plt import PIL.Image as Imagedef plot_resolution(dataset_root_path):image_size_list []#存放图片尺寸for root, dirs, files in os.walk(dataset_root_pa…

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

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

用C#开发Excel插件的强大开源工具

推荐一个开源项目&#xff0c;方便我们使用C#为Excel开发插件。 01 项目简介 Excel-DNA是一个.Net开源项目&#xff0c;为开发者提供了一种便利的方法&#xff0c;可以将.Net代码与Excel集成&#xff0c;能够轻松的为Excel创建自定义函数、图表、表单等&#xff0c;一方面不仅…

html5盒子模型

1.边框的常用属性 border-color 属性 说明 示例 border-top-color 上边框颜色 border-top-color:#369; border-right-color 右边框颜色 border-right-color:#369; border-bottom-color 下边框颜色 border-bottom-color:#fae45b; border-left-color 左边框颜色…

请求包的大小会影响Redis每秒处理请求数量

文章目录 &#x1f50a;博主介绍&#x1f964;本文内容压测规划客户端长连接数量对性能的影响请求包大小的影响Pipleline模式对Redis的影响 &#x1f4e2;文章总结&#x1f4e5;博主目标 &#x1f50a;博主介绍 &#x1f31f;我是廖志伟&#xff0c;一名Java开发工程师、Java领…