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.pswp.cn/news/711358.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/711358.shtml
英文地址,請注明出處:http://en.pswp.cn/news/711358.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

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

一、概述 為了讓接口程序更加模塊化和可測試,采用依賴注入的方式調用接口方法。 二、安裝Microsoft.Extensions.DependencyInjection 在NuGet里面搜索Microsoft.Extensions.DependencyInjection,并進行安裝。 三、代碼編寫 3.1 創建Service 實現類 /*****************…

【跨境電商須知】FP獨立站的特點和痛點有哪些?

無論是做獨立站&#xff0c;還是做亞馬遜&#xff0c;都有各自的難點。自己做獨立站若要在跨境行業長足發展&#xff0c;既要知道FP獨立站有什么特點&#xff0c;要清楚FP獨立站的痛點并一一克服。 一、FP獨立站的特點 與依賴第三方平臺相比&#xff0c;擁有自己的域名、服務器…

Doccano 修復 spacy.gold 的bug

引言 最初只是想把Doccano標注的數據集轉換成BIO(類似conll2003數據集)的標注格式&#xff1b; 摘要 可先閱讀一下教程&#xff1a;【已解決】關于如何將Doccano標注的文本轉換成NER模型可以直接處理的CoNLL 2003格式 裝包:pip install doccano-transformer 報錯信息 運行…

Adam優化算法

Adam算法&#xff08;Adaptive Moment Estimation&#xff09;是一種用于深度學習模型優化的算法&#xff0c;它結合了動量&#xff08;Momentum&#xff09;和RMSprop&#xff08;Root Mean Square Propagation&#xff09;的概念。Adam算法自2015年提出以來&#xff0c;因其高…

【前端素材】推薦優質后臺管理系統DAdmin平臺模板(附源碼)

一、需求分析 1、系統定義 后臺管理系統是一種用于管理網站、應用程序或系統的管理界面&#xff0c;通常由管理員和工作人員使用。它提供了訪問和控制網站或應用程序后臺功能的工具和界面&#xff0c;使其能夠管理用戶、內容、數據和其他各種功能。 2、功能需求 后臺管理系…

FreeCAD|讀取STEP、創建平面、相交、瓶子

FreeCAD是一個基于OpenCASCADE的開源CAD/CAE工具。OpenCASCADE是一套開源的CAD/CAM/CAE幾何模型核心&#xff0c;來自法國Matra Datavision公司&#xff0c;是著名的CAD軟件EUCLID的開發平臺。FreeCAD可運行于Windows以及Linux系統環境下&#xff0c;是一種通用的3D CAD建模工具…

記錄 關于navicat連接數據庫報錯1045的問題

重裝數據庫之后就連接不上了 報錯1045 而網上的解決方案大都是更改數據庫密碼&#xff0c;但是我在第一步就被卡住無法更改密碼&#xff0c;輸入指令也報錯&#xff0c;檢查的環境變量也沒錯&#xff0c;經過長時間的試錯終于找到解決了辦法 解決辦法 刪除data文件夾 如果無法…

積累:Qt 多種數據類型之間的轉換方法

前言 開發時經常涉及到數據類型的轉換&#xff0c;為方便溫故知新、提升開發效率&#xff0c;現將 Qt 開發部分常用的數據類型轉換方式形成工具文檔供查詢、參考。 1. int 轉 QString 1&#xff09;函數&#xff1a;QString::number 2&#xff09;函數原型 //將數字&#xff0…

LD: 利用Plink軟件進行連鎖不平衡計算和繪圖

輸入文件詳解 PLINK主要使用以下三種文件格式: .ped文件:文本文件,列出所有樣本的基因型數據。每行代表一個樣本,包含個體和家系信息,以及其對應的基因型數據。.map文件:文本文件,與.ped文件配合使用,列出了基因型數據中所有SNP的位置信息。每行代表一個SNP,包含染色…

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;所以肯定…

springboot2.6.5 下配置ForkJoinPool線程池大小

從java1.7開始&#xff0c;引入了parallelStream的方式使用ForkJoinPool多線程處理數據的方式&#xff0c;ForkJoinPool默認線程池大小是cpu內核數-1&#xff0c;并且可以通過以下方式配置線程池大小&#xff1a; System.setProperty("java.util.concurrent.ForkJoinPool…

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;大功率 芯片…

centos 安裝 glibc2.25

在 CentOS 7 系統上安裝 glibc 2.25 需要非常謹慎&#xff0c;因為 glibc 是系統核心庫之一&#xff0c;升級它可能導致與系統其他組件的兼容性問題。CentOS 7 自帶的 glibc 版本較低&#xff0c;直接替換為高版本可能會導致依賴于舊版 glibc 的系統軟件崩潰。 以下是一般情況…

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;遇到了互…