电子邮件中的Excel附件已损坏

2020-09-09 16:50发布

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


大家好,

我正在开发一个报告,其中我会向同一用户发送多封带有附件的电子邮件。

我的问题是某些excel附件可以正确打开而没有任何错误,而其他excel附件在下面遇到错误。

请帮助我。 任何帮助将不胜感激。

谢谢。

此致

Katherine Darunday

(9.6 kB)

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


大家好,

我正在开发一个报告,其中我会向同一用户发送多封带有附件的电子邮件。

我的问题是某些excel附件可以正确打开而没有任何错误,而其他excel附件在下面遇到错误。

请帮助我。 任何帮助将不胜感激。

谢谢。

此致

Katherine Darunday

(9.6 kB)
付费偷看设置
发送
6条回答
Nan4612
1楼 · 2020-09-09 17:21.采纳回答

此问题已解决。

在用于建立excel文件的内部表中,存在通配符,因此excel文件已损坏。

使用功能模块删除通配符,我解决了我的问题。

谢谢大家。

能不能别闹
2楼-- · 2020-09-09 17:18

也许可以共享您的代码来创建excel,这是让人们知道发生了什么事情的理想选择...

小c菟菟
3楼-- · 2020-09-09 17:29

嗨,

尝试以下代码

数据lo_send_request类型参考cl_bcs。
   数据lv_date(10)。
   数据lv_text TYPE char255。 文字
   数据lv_subject TYPE so_obj_des。
   数据lo_document类型参考cl_document_bcs。
   数据lv_binary_content TYPE solix_tab。
   数据lv_size TYPE so_obj_len。
   DATA lv_string TYPE字符串。
   数据lt_main_text类型bcsy_text。
   数据lo_recipient类型参考if_recipient_bcs。
   数据lv_sent_to_all TYPE os_boolean。
   数据lo_bcs_exception类型参考cx_bcs。
   数据:lv_email TYPE ad_smtpadr,
         lv_lines类型i。


 *电子表格附件的分隔符
   CLASS:cl_abap_char_utilities定义加载。
   常量:gc_tab类型c值cl_bcs_convert => gc_tab,
            gc_crlf类型c值cl_bcs_convert => gc_crlf。




   数据:gv_tab类型c值cl_abap_char_utilities => horizo​​ntal_tab,
         gv_newline TYPE c VALUE cl_abap_char_utilities =>换行符,
         gv_line_feed类型c值cl_abap_char_utilities => cr_lf。


   将sy-datum写入lv_date DD/MM/YYYY。




   lv_lines = LINES(gt_up_file)。
   如果lv_lines GT 65000。
     讯息i000(zmm)与
     '报告有65,000多行。 电子邮件不能为'
     "已发送-报告只能显示。"
     "为了通过电子邮件发送报告"
     "请更改您的选择标准。"。
     出口。
   万一。


   循环至gt_up_file。


     CONCATENATE lv_string gt_up_file gc_crlf gv_newline
            INTO lv_string。


   结局。
 * -------------------------------------------------  -------------
 *将文本字符串转换为UTF-16LE二进制数据,包括
 *字节顺序标记。  Mircosoft Excel更喜欢这些设置
 *所有这些都是由新类cl_bcs_convert完成的(请参阅注释1151257)


   尝试。
       cl_bcs_convert => string_to_solix(
         出口
           iv_string = lv_string
           iv_codepage ='4103'"适用于MS Excel,请留空
           iv_add_bom ='X'"用于其他文档类型
         输入
           et_solix = lv_binary_content
           ev_size = lv_size)。
     捕捉cx_bcs。
       讯息e445(如此)。
   ENDTRY。


   尝试。


 * --------创建持久发送请求------------------------
       lo_send_request = cl_bcs => create_persistent()。


 * --------创建并设置带有附件的文档---------------
 *使用文本从内部表创建文档对象
       lv_text = lv_date。
       附加lv_text至lt_main_text。
       在lt_main_text后面添加初始行。


       lv_text ='附加了PO错误文件'。
       附加lv_text至lt_main_text。


       CONCATENATE'PO错误文件'''
                              INTO lv_subject。
       lo_document = cl_document_bcs => create_document(
         i_type ='RAW'
         i_text = lt_main_text
         i_subject = lv_subject)。


 *将电子表格作为附件添加到文档对象
       lo_document-> add_attachment(
       i_attachment_type ='XLS'
       i_attachment_subject = lv_subject
       i_attachment_size = lv_size
       i_att_content_hex = lv_binary_content)。


 *添加文档对象以发送请求
       lo_send_request-> set_document(lo_document)。


 * ---------添加收件人(电子邮件地址)-----------------------
 *创建收件人对象


       环回s_ercpt。
         lv_email = s_ercpt-low。


         lo_recipient = cl_cam_address_bcs => create_internet_address(
         lv_email)。
 *添加收件人对象以发送请求
         lo_send_request-> add_recipient(lo_recipient)。


       结局。
 * ----------发送文件-------------------------------------  -
       lv_sent_to_all = lo_send_request-> send(i_with_error_screen ='X')。


       提交工作。


       如果lv_sent_to_all是INITIAL。
         使用''的消息s500(sbcoms)。
       其他。
         讯息s022(so)。
       万一。


 *    -  -  -  -  -  -  异常处理  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
     捕获cx_bcs INTO lo_bcs_exception。
       使用lo_bcs_exception-> error_type的消息i865(so)。
   ENDTRY。
 
Nir深蓝
4楼-- · 2020-09-09 17:19

嗨奎恩·杜安,

我已在下面附加了我的代码以创建excel文件。

谢谢。

clasier
5楼-- · 2020-09-09 17:14

我看到您的代码使用XML,所以我猜它是Excel 2003的XML。如果很小的Excel文件也有bug,可以共享吗? 请? (如果需要,可以将其匿名+压缩)

DafaDDDa
6楼-- · 2020-09-09 17:28

嗨,

我正在使用该代码发送电子邮件。

     方法send_email。



       数据:

         lt_body TYPE bcsy_text,

         lv_subject TYPE so_obj_des,

         lv_filename TYPE so_obj_des。



       明确:

         lt_body [],

         lv_subject,

         lv_filename。



 *- 发电子邮件

       环聊s_email

         INTO DATA(ls_email)。



         尝试。

 * –创建持久发送请求

           go_send_request = cl_bcs => create_persistent()。



 * –创建并设置带有附件的文档

 *使用文本从内部表创建文档对象

           如果sy-subrc EQ 0。



             go_pgrp_mrp-> build_email_body(

               输入

                 ex_t_text = lt_body)。



             合并sy-datum + 4(2)c_slash

                         sy-datum + 6(2)c_斜杠

                         sy-datum + 0(4)放入数据(lv_date)。



             CONCATENATE text-005

                         lv_date

                         gv_system

               INTO lv_subject

               按空格分隔。



             合并sy-datum + 4(2)c_period

                         sy-datum + 6(2)c_period

                         sy-datum + 0(4)插入数据(lv_date_2)。



             CONCATENATE文字006

                         lv_date_2

               INTO lv_文件名

               按空格分隔。



             自由:

               lv_date,

               lv_date_2。



           万一。



           go_document = cl_document_bcs => create_document(

             i_type = c_obj_tp_htm

             i_text = lt_body

             i_subject = lv_subject)。



 * –将电子表格作为附件添加到文档对象

           go_document-> add_attachment(

             i_attachment_type = c_file_ext

             i_attachment_subject = lv_filename

             i_attachment_size = gv_size

             i_att_content_hex = gs_binary_content)。



 * –添加文档对象以发送请求

           go_send_request-> set_document(go_document)。



 * –添加收件人(电子邮件地址)

 *创建收件人对象

           gv_mailto = ls_email-low。

           go_recipient = cl_cam_address_bcs => create_internet_address(gv_mailto)。



 * –添加收件人对象以发送请求

           go_send_request-> add_recipient(go_recipient)。



 * –设置立即发送标志

           go_send_request-> set_send_immediately(abap_true)。



 * –发送文件

           gv_sent_to_all = go_send_request-> send(i_with_error_screen = abap_true)。

           提交工作。



           如果gv_sent_to_all是INITIAL。

             使用gv_mailto发送i500(sbcoms)消息。

           其他。

             MESSAGE text-014 TYPE c_success。

           万一。

 *- 异常处理

           捕捉cx_bcs INTO go_bcs_exception。

             使用go_bcs_exception-> error_type的消息i865(so)。

         ENDTRY。

         明确:

           ls_email。

       结局。



       自由:

         lt_body [],

         lv_subject,

         lv_filename。



     终结法。  "发电子邮件
 

一周热门 更多>