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.mzph.cn/news/711358.shtml

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

相关文章

.Net利用Microsoft.Extensions.DependencyInjection配置依赖注入

一、概述 为了让接口程序更加模块化和可测试,采用依赖注入的方式调用接口方法。 二、安装Microsoft.Extensions.DependencyInjection 在NuGet里面搜索Microsoft.Extensions.DependencyInjection,并进行安装。 三、代码编写 3.1 创建Service 实现类 /*****************…

Doccano 修复 spacy.gold 的bug

引言 最初只是想把Doccano标注的数据集转换成BIO(类似conll2003数据集)的标注格式&#xff1b; 摘要 可先阅读一下教程&#xff1a;【已解决】关于如何将Doccano标注的文本转换成NER模型可以直接处理的CoNLL 2003格式 装包:pip install doccano-transformer 报错信息 运行…

【前端素材】推荐优质后台管理系统DAdmin平台模板(附源码)

一、需求分析 1、系统定义 后台管理系统是一种用于管理网站、应用程序或系统的管理界面&#xff0c;通常由管理员和工作人员使用。它提供了访问和控制网站或应用程序后台功能的工具和界面&#xff0c;使其能够管理用户、内容、数据和其他各种功能。 2、功能需求 后台管理系…

记录 关于navicat连接数据库报错1045的问题

重装数据库之后就连接不上了 报错1045 而网上的解决方案大都是更改数据库密码&#xff0c;但是我在第一步就被卡住无法更改密码&#xff0c;输入指令也报错&#xff0c;检查的环境变量也没错&#xff0c;经过长时间的试错终于找到解决了办法 解决办法 删除data文件夹 如果无法…

Python:练习:输出int值a占b的百分之几。例如:输入1和4,输出:25%。

案例&#xff1a; 输出int值a占b的百分之几。例如&#xff1a;输入1和4&#xff0c;输出&#xff1a;25%。 思考&#xff1a; 所有的一步步思考&#xff0c;最后综合起来。 首先&#xff0c;确定 输出&#xff0c;那么就用input&#xff0c;而且是int值&#xff0c;所以肯定…

C++设计模式_创建型模式_工厂方法模式

目录 C设计模式_创建型模式_工厂方法模式 一、简单工厂模式 1.1 简单工厂模式引入 1.2 简单工厂模式 1.3 简单工厂模式利弊分析 1.4 简单工厂模式的UML图 二、工厂方法模式 2.1 工厂模式和简单工厂模式比较 2.2 工厂模式代码实现 2.3 工厂模式UML 三、抽象工厂模式 3.1 战斗场景…

MDS300-16-ASEMI整流模块MDS300-16参数、封装、尺寸

编辑&#xff1a;ll MDS300-16-ASEMI整流模块MDS300-16参数、封装、尺寸 型号&#xff1a;MDS300-16 品牌&#xff1a;ASEMI 封装&#xff1a;M25 最大重复峰值反向电压&#xff1a;1600V 最大正向平均整流电流(Vdss)&#xff1a;300A 功率(Pd)&#xff1a;大功率 芯片…

Flink——芒果TV的实时数仓建设实践

目录 一、芒果TV实时数仓建设历程 1.1 阶段一&#xff1a;Storm/Flink JavaSpark SQL 1.2 阶段二&#xff1a;Flink SQLSpark SQL 1.3 阶段三&#xff1a;Flink SQLStarRocks 二、自研Flink实时计算调度平台介绍 2.1 现有痛点 2.2 平台架构设计 三、Flink SQL实时数仓分…

面试笔记系列三之spring基础知识点整理及常见面试题

目录 如何实现一个IOC容器? 说说你对Spring 的理解&#xff1f; 你觉得Spring的核心是什么&#xff1f; 说一下使用spring的优势&#xff1f; Spring是如何简化开发的&#xff1f; IOC 运行时序 prepareRefresh() 初始化上下文环境 obtainFreshBeanFactory() 创建并…

Linux系统加固:如何有效管理系统账号

Linux系统加固&#xff1a;如何有效管理系统账号 1.1 口令重复次数限制1.2 避免系统存在uid相同的账号1.3 空密码的帐户1.4 口令复杂度1.5 口令生存期1.6 登录失败次数锁定策略 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 在Linux系统中…

为什么软考报名人数越来越多?

2020年软考报名人数404666人&#xff0c;广东省报考人数超过14万人。 ●2021年软考通信考试报名人数突破100万人&#xff0c;估计软考有90多万。 ●2022年软考通信考试共129万人&#xff0c;估计软考占了120多万人。 ●2023年软考具体报名人数没有公布&#xff0c;但工业和信…

【AI+应用】aliyun的EMO图生视频模型引起的思考如何做AI数字人

昨天2 月 29 日消息&#xff0c;2 月 28 日&#xff0c;阿里巴巴集团智能计算研究院日前上线了一款新的 AI 图片 - 音频 - 视频模型技术 EMO&#xff0c;官方称其为 " 一种富有表现力的音频驱动的肖像视频生成框架 "。据悉&#xff0c;用户只需要提供一张照片和一段任…

springboot235基于SpringBoot的房屋交易平台的设计与实现

房屋交易平台设计与实现 摘 要 信息数据从传统到当代&#xff0c;是一直在变革当中&#xff0c;突如其来的互联网让传统的信息管理看到了革命性的曙光&#xff0c;因为传统信息管理从时效性&#xff0c;还是安全性&#xff0c;还是可操作性等各个方面来讲&#xff0c;遇到了互…

死记硬背spring bean 的生命周期

1.bean的生命周期 我们平常经常使用类似于new Object()的方式去创建对象&#xff0c;在这个对象没有任何引用的时候&#xff0c;会被gc给回收掉。而对于spring而言&#xff0c;它本身存在一个Ioc容器&#xff0c;就是用来管理对象的&#xff0c;而对象的生命周期也完全由这个容…

性能测试-反编译jar

方法一&#xff0c;使用jd-gui 1、官网下载&#xff1a;Java Decompiler 2、下载mac版本后&#xff0c;解压&#xff0c;如下所示&#xff1a; 双击 JD_GUI&#xff0c;提示错误&#xff0c;如下所示&#xff1a; 已经安装了java 17&#xff0c;是java 1.8以上版本&#xff0…

Unity中URP下实现水体(水面高光)

文章目录 前言一、实现高光反射原理1、原理&#xff1a;2、公式&#xff1a; 二、实现1、定义 _SpecularColor 作为高光反射的颜色2、定义 _SpecularIntensity 作为反射系数&#xff0c;控制高光反射的强度3、定义 _Smoothness 作为高光指数&#xff0c;用于模型高光范围4、模拟…

深入理解c指针(四)

目录 六、assert断言 七、指针的使用和传址调用 1、strlen的模拟实现 2、传值调用和传址调用 3、练习-字符串逆序 在深入理解c指针&#xff08;三&#xff09;提到&#xff0c;在实际使用指针前可以检测其是否指到有效空间&#xff1a; #include<stdio.h> int mai…

度量与评估客户体验:以客户为中心的方法和工具

在当今的市场环境中&#xff0c;客户体验已经成为企业成功的关键因素。一个优秀的客户体验不仅能够提升客户满意度&#xff0c;增强客户忠诚度&#xff0c;还能够吸引新的潜在客户。然而&#xff0c;要实现这一目标&#xff0c;企业首先需要了解如何度量和评估客户体验。本文将…

day08_分类品牌管理商品规格管理商品管理

文章目录 1 分类品牌管理1.1 菜单添加1.2 表结构介绍1.3 页面制作1.4 品牌列表加载1.4.1 后端接口BrandControllerBrandServiceBrandMapperBrandMapper.xml 1.4.2 前端对接brand.jscategoryBrand.vue 1.5 分类数据加载1.6 列表查询1.6.1 需求说明1.6.2 后端接口需求分析Categor…

linux nasm汇编中调用printf不报错,但调用scanf报错。抛出了分段错误(核心转储)

当我写了如下汇编时 ; nasm -f elf64 -g -F dwarf charsin.asm ; gcc charsin.o -no-pie -o charsin ; ld -o eatclib eatclib.o ; gdb eatclib[SECTION .data]SPrompt db Enter string data, followed by Enter: ,0IPrompt db Enter an integer value, followed by Enter: ,1…