1 *&---------------------------------------------------------------------*
  2 *& Report Z3426EXCELDOWNLOAD
  3 *&---------------------------------------------------------------------*
  4 *&
  5 *&---------------------------------------------------------------------*
  6 REPORT z3426exceldownload.
  7 DATA:xtab     TYPE solix_tab,
  8      length   TYPE so_att_len,
  9      lv_count TYPE i,
 10      filename TYPE string VALUE 'C:\Users\XXXX\Desktop\TEST\aa.xls'.
 11 PERFORM frm_tabconvxtr TABLES xtab CHANGING length.
 12 
 13 lv_count = length.
 14 CALL METHOD cl_gui_frontend_services=>gui_download
 15   EXPORTING
 16     bin_filesize = lv_count
 17     filename     = filename
 18     filetype     = 'BIN'
 19   CHANGING
 20     data_tab     = xtab.
 21 
 22 
 23 FORM frm_tabconvxtr TABLES pv_xtab CHANGING length.
 24   DATA:gt_sflight TYPE TABLE OF sflight.
 25   DATA:gt_t001l TYPE TABLE OF t001l.
 26   DATA: l_binary_tab LIKE TABLE OF solix.
 27   SELECT * FROM sflight INTO TABLE gt_sflight.
 28   SELECT * FROM t001l INTO TABLE gt_t001l UP TO 10 ROWS.
 29   DO 9999 TIMES.
 30     READ TABLE gt_t001l INTO DATA(ls_t001) INDEX 1.
 31     APPEND ls_t001 TO gt_t001l.
 32   ENDDO.
 33   DATA(l_ixml) = cl_ixml=>create( ).
 34 * Creating the dom object model   创建dom对象模型
 35   DATA(l_document) = l_ixml->create_document( ).
 36 * Create root node 'Workbook'  创建根节点
 37   DATA(l_element_root) = l_document->create_simple_element(
 38         name = 'Workbook'
 39 *                                  uri  = 'urn:schemas-microsoft-com:office:spreadsheet'
 40         parent = l_document ).
 41   l_element_root->set_attribute( name = 'xmlns' value = 'urn:schemas-microsoft-com:office:spreadsheet' ).
 42   DATA(ns_attribute) = l_document->create_namespace_decl(
 43         name = 'ss'
 44         prefix = 'xmlns'
 45         uri = 'urn:schemas-microsoft-com:office:spreadsheet' ).
 46   l_element_root->set_attribute_node( ns_attribute ).
 47   ns_attribute = l_document->create_namespace_decl(
 48   name = 'x'
 49   prefix = 'xmlns'
 50   uri = 'urn:schemas-microsoft-com:office:excel' ).
 51   l_element_root->set_attribute_node( ns_attribute ).
 52 * Create node for document properties. 为文档属性创建节点
 53   DATA(r_element_properties) = l_document->create_simple_element(
 54         name = 'DocumentProperties'
 55         parent = l_element_root ).
 56   DATA:l_value TYPE string VALUE '陈辉'.
 57   DATA:lv_sheetname TYPE string VALUE 'Sheet1'.
 58   l_value = sy-uname.
 59   l_document->create_simple_element(
 60   name = 'Author'
 61   value = l_value
 62   parent = r_element_properties  ).
 63 
 64   FIELD-SYMBOLS:
 65   <lft_dyntab> TYPE ANY TABLE.
 66   "2.创建excel表名和sheet数据
 67 
 68   ASSIGN gt_sflight TO <lft_dyntab>.
 69   lv_sheetname = '自定义sheet1'.
 70 
 71   PERFORM frm_create_sheetdata USING <lft_dyntab>
 72                                      l_document
 73                                      l_element_root
 74                                      lv_sheetname.
 75 
 76   lv_sheetname = '自定义sheet2'.
 77   ASSIGN gt_t001l TO <lft_dyntab>.
 78   PERFORM frm_create_sheetdata USING <lft_dyntab>
 79         l_document
 80         l_element_root
 81         lv_sheetname.
 82 
 83   "xml生成输出
 84   DATA(l_streamfactory) = l_ixml->create_stream_factory( ).
 85 *   Connect internal XML table to stream factory
 86   DATA(l_ostream) = l_streamfactory->create_ostream_itable( table = l_binary_tab ).
 87 *   rendering the document
 88   DATA(l_renderer) = l_ixml->create_renderer( ostream  = l_ostream document = l_document ).
 89   DATA(l_rc) = l_renderer->render( ).
 90 *   saving the xml document
 91   DATA(l_length) = l_ostream->get_num_written_raw( ).
 92 
 93   pv_xtab[] = l_binary_tab[].
 94   length = l_length.
 95 ENDFORM.
 96 
 97 FORM frm_create_sheetdata USING lt_dyntab      TYPE ANY TABLE
 98       l_document     TYPE REF TO if_ixml_document
 99       l_element_root TYPE REF TO if_ixml_element
100       lv_sheetname       TYPE string.
101   DATA:l_value TYPE string.
102   DATA(r_worksheet) = l_document->create_simple_element(
103         name = 'Worksheet '
104         parent = l_element_root ).
105   r_worksheet->set_attribute_ns( name = 'Name' prefix = 'ss' value = lv_sheetname ).
106 * table
107 * <Table ss:ExpandedColumnCount="3" ss:ExpandedRowCount="1" x:FullColumns="1" x:FullRows="1">
108   DATA(r_table) = l_document->create_simple_element( name = 'Table' parent = r_worksheet ).
109 
110   "3.创建column
111   "因为xml格式的excel为先column,然后再每个row下存在cell,所以先循环输出column。
112   DATA(r_column) = l_document->create_simple_element( name = 'Column' parent = r_table ).
113 
114   "4.row和内容类型
115   DATA:l_row  TYPE REF TO if_ixml_element,
116        l_cell TYPE REF TO if_ixml_element,
117        l_data TYPE REF TO if_ixml_element.
118 
119   "将内表填写到excel表格内
120   DATA:i_index TYPE sy-index.
121   DATA:l_index TYPE string.
122   DATA:l_text  TYPE char10.
123   DATA:l_type  TYPE string.
124   DATA:desc_struc TYPE REF TO cl_abap_structdescr.
125   FIELD-SYMBOLS:<lv_field> TYPE any.
126   LOOP AT lt_dyntab ASSIGNING FIELD-SYMBOL(<data_line>).
127     desc_struc ?= cl_abap_structdescr=>describe_by_data( <data_line> )."因为内表的每列数据要填写到excel的每行内。所以使用该方法将内表转换。
128     DATA(lt_fields) = desc_struc->get_ddic_field_list( ).
129 
130     AT FIRST.
131       l_row = l_document->create_simple_element( name = 'Row' parent = r_table ).
132       "l_row->set_attribute_ns( name = 'AutoFitHeight' prefix = 'ss' value = '1' )."设置表头自适应宽高
133       "l_row->set_attribute_ns( name = 'Color' prefix = 'ss' value = '#00FF00' )."设置表头颜色
134       LOOP AT lt_fields ASSIGNING FIELD-SYMBOL(<data_fields>).
135 *        ASSIGN COMPONENT <data_fields>-fieldname OF STRUCTURE <data_line> TO <lv_field>."动态绑定表格内容。
136         CHECK sy-subrc IS INITIAL.
137         l_cell = l_document->create_simple_element( name = 'Cell' parent = l_row ).
138         l_value = <data_fields>-scrtext_l.
139         l_data = l_document->create_simple_element( name = 'Data' value = l_value parent = l_cell ).
140         l_data->set_attribute_ns( name = 'Type' prefix = 'ss' value = 'String' ).
141       ENDLOOP.
142     ENDAT.
143     l_row = l_document->create_simple_element( name = 'Row' parent = r_table ).
144 
145     LOOP AT lt_fields ASSIGNING <data_fields>.
146       ASSIGN COMPONENT <data_fields>-fieldname OF STRUCTURE <data_line> TO <lv_field>."动态绑定表格内容。
147       CHECK sy-subrc IS INITIAL.
148       l_cell = l_document->create_simple_element( name = 'Cell' parent = l_row ).
149       l_value = <lv_field>.
150       l_type  = <data_fields>-inttype.    "fieldname, scrtext_m etc.
151       CASE l_type.
152         WHEN 'I' OR 'P' OR 'F' OR 'N'.
153           l_type = 'String'.
154           l_value = <lv_field>.
155           CONDENSE l_value NO-GAPS.
156         WHEN 'D' OR 'T'.
157           l_type = 'String'.
158           WRITE <lv_field> TO l_text.
159           l_value = l_text.
160         WHEN OTHERS.
161 *          l_value = <field>.    "Without conversion exit
162           WRITE <lv_field> TO l_text.
163           SHIFT l_text LEFT DELETING LEADING space.
164           l_value = l_text.
165           l_type = 'String'.
166       ENDCASE.
167       l_data = l_document->create_simple_element( name = 'Data' value = l_value parent = l_cell ).
168       l_data->set_attribute_ns( name = 'Type' prefix = 'ss' value = l_type ).
169     ENDLOOP.
170   ENDLOOP.
171 ENDFORM.

以上代码未封装,各位自己看看即可

 

封装后的发送邮件代码

SE24 class:ZCL_SEND_EMAIL

  1 class ZCL_SEND_EMAIL definition
  2   public
  3   final
  4   create public .
  5 
  6 public section.
  7 
  8   types:
  9     BEGIN OF ty_attach,
 10         type     TYPE soodk-objtp,
 11         xstr     TYPE xstring,
 12         filename TYPE string,
 13       END OF ty_attach .
 14   types:
 15     tt_attach  TYPE STANDARD TABLE OF ty_attach .
 16   types TY_ADDRESS type AD_SMTPADR .
 17   types:
 18     tt_address TYPE STANDARD TABLE OF ty_address .
 19   types TT_BODY type SOLI_TAB .
 20   types:
 21     BEGIN OF ty_return,
 22         type    TYPE char1,
 23         message TYPE string,
 24       END OF ty_return .
 25 
 26   data ATTACH type TT_ATTACH .
 27   data SUBJECT type SO_OBJ_DES .
 28   data TEXT type SOLI_TAB .
 29   data SENDER type ref to IF_SENDER_BCS .
 30   data TO type TT_ADDRESS .
 31   data BC type TT_ADDRESS .
 32   data CC type TT_ADDRESS .
 33 
 34   methods SEND
 35     returning
 36       value(RETURN) type TY_RETURN
 37     raising
 38       ZCX_EMAIL .
 39   methods TAB_CONV_XSTR
 40     importing
 41       value(DATA) type ANY TABLE
 42       value(FIELD) type DDFIELDS optional
 43     returning
 44       value(XSTR) type XSTRING
 45     raising
 46       resumable(ZCX_EMAIL) .
 47   methods ADD_ATTACH
 48     importing
 49       value(ATTACH) type TY_ATTACH optional
 50     raising
 51       resumable(ZCX_EMAIL) .
 52   methods SET_SUBJECT
 53     importing
 54       value(SUBJECT) type SO_OBJ_DES optional .
 55   methods SET_CONTENT
 56     importing
 57       value(TAB) type SOLI_TAB optional
 58       value(TEXT) type STRING optional .
 59   methods SET_FROM
 60     importing
 61       value(FROM) type AD_SMTPADR optional
 62     raising
 63       resumable(ZCX_EMAIL) .
 64   methods SET_TO
 65     importing
 66       !TO type TT_ADDRESS .
 67   methods SET_CC
 68     importing
 69       value(CC) type TT_ADDRESS optional .
 70   methods SET_BC
 71     importing
 72       value(BC) type TT_ADDRESS optional .
 73   methods SET_RECEIVER
 74     importing
 75       value(TO) type TT_ADDRESS
 76       value(CC) type TT_ADDRESS optional
 77       value(BC) type TT_ADDRESS optional .
 78   methods TEST
 79     raising
 80       resumable(ZCX_EMAIL) .
 81 protected section.
 82 private section.
 83 ENDCLASS.
 84 
 85 
 86 
 87 CLASS ZCL_SEND_EMAIL IMPLEMENTATION.
 88 
 89 
 90 * <SIGNATURE>---------------------------------------------------------------------------------------+
 91 * | Instance Public Method ZCL_SEND_EMAIL->ADD_ATTACH
 92 * +-------------------------------------------------------------------------------------------------+
 93 * | [--->] ATTACH                         TYPE        TY_ATTACH(optional)
 94 * | [!CX!] ZCX_EMAIL
 95 * +--------------------------------------------------------------------------------------</SIGNATURE>
 96   METHOD add_attach.
 97     APPEND attach TO me->attach.
 98   ENDMETHOD.
 99 
100 
101 * <SIGNATURE>---------------------------------------------------------------------------------------+
102 * | Instance Public Method ZCL_SEND_EMAIL->SEND
103 * +-------------------------------------------------------------------------------------------------+
104 * | [<-()] RETURN                         TYPE        TY_RETURN
105 * | [!CX!] ZCX_EMAIL
106 * +--------------------------------------------------------------------------------------</SIGNATURE>
107   METHOD send.
108     TRY.
109         DATA(lc_send_request) = cl_bcs=>create_persistent( ).
110 
111         DATA(document) = cl_document_bcs=>create_document( i_type = 'HTM' i_text = me->text i_subject = me->subject ).
112 
113         LOOP AT attach INTO DATA(ls_attach).
114           document->add_attachment(
115                         i_attachment_type    = ls_attach-type
116                         i_att_content_hex    = cl_document_bcs=>xstring_to_solix( ls_attach-xstr )
117                         i_attachment_size    = CONV #( xstrlen( ls_attach-xstr ) )
118                         i_attachment_subject = COND #( WHEN ls_attach-filename IS NOT INITIAL THEN ls_attach-filename
119                                                        ELSE CONV #( |{ sy-datum }_{ sy-uzeit }.xlsx | ) ) ).
120         ENDLOOP.
121 
122         lc_send_request->set_document( document ).
123 
124         lc_send_request->set_sender( i_sender = me->sender ).
125 
126         LOOP AT me->to INTO DATA(ls_to).
127           lc_send_request->add_recipient( i_recipient = cl_cam_address_bcs=>create_internet_address( ls_to ) ).
128         ENDLOOP .
129 
130         LOOP AT me->bc INTO DATA(ls_bc).
131           lc_send_request->add_recipient( i_blind_copy = 'X' i_recipient = cl_cam_address_bcs=>create_internet_address( ls_bc ) ).
132         ENDLOOP .
133 
134         LOOP AT me->cc INTO DATA(ls_cc).
135           lc_send_request->add_recipient( i_copy = 'X' i_recipient = cl_cam_address_bcs=>create_internet_address( ls_cc ) ).
136         ENDLOOP .
137 
138         lc_send_request->set_status_attributes( EXPORTING i_requested_status = 'E' i_status_mail      = 'E' ).
139 
140         lc_send_request->set_send_immediately( 'X' ).
141 
142         lc_send_request->send( EXPORTING i_with_error_screen = 'X' RECEIVING result = DATA(result) ).
143         IF result = 'X'.
144           COMMIT WORK.
145           return-type = 'S'.
146           return-message = '邮件发送成功!'.
147         ELSE.
148           ROLLBACK WORK.
149           return-type = 'E'.
150           return-message = '邮件发送失败!'.
151         ENDIF.
152       CATCH cx_root INTO DATA(lo_error).
153         RAISE EXCEPTION TYPE zcx_email EXPORTING message = lo_error->get_text( ).
154         return-type = 'E'.
155         return-message = '邮件发送失败:' && lo_error->get_text( ).
156     ENDTRY.
157     FREE:document,lc_send_request.
158     CLEAR:attach,subject,text,sender,to, bc,cc.
159   ENDMETHOD.
160 
161 
162 * <SIGNATURE>---------------------------------------------------------------------------------------+
163 * | Instance Public Method ZCL_SEND_EMAIL->SET_BC
164 * +-------------------------------------------------------------------------------------------------+
165 * | [--->] BC                             TYPE        TT_ADDRESS(optional)
166 * +--------------------------------------------------------------------------------------</SIGNATURE>
167   METHOD set_bc.
168     me->bc = bc.
169   ENDMETHOD.
170 
171 
172 * <SIGNATURE>---------------------------------------------------------------------------------------+
173 * | Instance Public Method ZCL_SEND_EMAIL->SET_CC
174 * +-------------------------------------------------------------------------------------------------+
175 * | [--->] CC                             TYPE        TT_ADDRESS(optional)
176 * +--------------------------------------------------------------------------------------</SIGNATURE>
177   METHOD set_cc.
178     me->cc = cc.
179   ENDMETHOD.
180 
181 
182 * <SIGNATURE>---------------------------------------------------------------------------------------+
183 * | Instance Public Method ZCL_SEND_EMAIL->SET_CONTENT
184 * +-------------------------------------------------------------------------------------------------+
185 * | [--->] TAB                            TYPE        SOLI_TAB(optional)
186 * | [--->] TEXT                           TYPE        STRING(optional)
187 * +--------------------------------------------------------------------------------------</SIGNATURE>
188   METHOD set_content.
189     IF tab[] IS NOT INITIAL.
190       me->text[] = tab[].
191     ELSE.
192       IF text IS NOT INITIAL.
193         CALL FUNCTION 'SCMS_STRING_TO_FTEXT'
194           EXPORTING
195             text      = text
196           TABLES
197             ftext_tab = me->text[].
198       ENDIF.
199     ENDIF.
200 
201   ENDMETHOD.
202 
203 
204 * <SIGNATURE>---------------------------------------------------------------------------------------+
205 * | Instance Public Method ZCL_SEND_EMAIL->SET_FROM
206 * +-------------------------------------------------------------------------------------------------+
207 * | [--->] FROM                           TYPE        AD_SMTPADR(optional)
208 * | [!CX!] ZCX_EMAIL
209 * +--------------------------------------------------------------------------------------</SIGNATURE>
210   METHOD set_from.
211     TRY.
212         CONSTANTS:lv_default TYPE ad_smtpadr VALUE 'xxxx@xxxx'.
213         IF from IS INITIAL.
214           IF sy-uname <> 'WINNER'.
215             me->sender = cl_sapuser_bcs=>create( sy-uname ).
216           ELSE.
217             me->sender = cl_cam_address_bcs=>create_internet_address( lv_default ).
218           ENDIF.
219         ELSE.
220           IF from CA '@'.
221             me->sender = cl_cam_address_bcs=>create_internet_address( from ).
222           ELSE.
223             DATA:lv_user TYPE uname.
224             lv_user = from.
225             me->sender = cl_sapuser_bcs=>create( lv_user ).
226           ENDIF.
227 
228         ENDIF.
229       CATCH cx_root INTO DATA(lo_error).
230         RAISE EXCEPTION TYPE zcx_email EXPORTING message = lo_error->get_text( ).
231     ENDTRY.
232   ENDMETHOD.
233 
234 
235 * <SIGNATURE>---------------------------------------------------------------------------------------+
236 * | Instance Public Method ZCL_SEND_EMAIL->SET_RECEIVER
237 * +-------------------------------------------------------------------------------------------------+
238 * | [--->] TO                             TYPE        TT_ADDRESS
239 * | [--->] CC                             TYPE        TT_ADDRESS(optional)
240 * | [--->] BC                             TYPE        TT_ADDRESS(optional)
241 * +--------------------------------------------------------------------------------------</SIGNATURE>
242   METHOD SET_RECEIVER.
243     me->to = to.
244     me->bc = bc.
245     me->cc = cc.
246   ENDMETHOD.
247 
248 
249 * <SIGNATURE>---------------------------------------------------------------------------------------+
250 * | Instance Public Method ZCL_SEND_EMAIL->SET_SUBJECT
251 * +-------------------------------------------------------------------------------------------------+
252 * | [--->] SUBJECT                        TYPE        SO_OBJ_DES(optional)
253 * +--------------------------------------------------------------------------------------</SIGNATURE>
254   METHOD set_subject.
255     me->subject = subject.
256   ENDMETHOD.
257 
258 
259 * <SIGNATURE>---------------------------------------------------------------------------------------+
260 * | Instance Public Method ZCL_SEND_EMAIL->SET_TO
261 * +-------------------------------------------------------------------------------------------------+
262 * | [--->] TO                             TYPE        TT_ADDRESS
263 * +--------------------------------------------------------------------------------------</SIGNATURE>
264   METHOD set_to.
265     me->to = to.
266   ENDMETHOD.
267 
268 
269 * <SIGNATURE>---------------------------------------------------------------------------------------+
270 * | Instance Public Method ZCL_SEND_EMAIL->TAB_CONV_XSTR
271 * +-------------------------------------------------------------------------------------------------+
272 * | [--->] DATA                           TYPE        ANY TABLE
273 * | [--->] FIELD                          TYPE        DDFIELDS(optional)
274 * | [<-()] XSTR                           TYPE        XSTRING
275 * | [!CX!] ZCX_EMAIL
276 * +--------------------------------------------------------------------------------------</SIGNATURE>
277   METHOD tab_conv_xstr.
278     TRY.
279         DATA(xlsx_handling) = cl_ehfnd_xlsx=>get_instance( ).
280         DATA(xlsx_document) = xlsx_handling->create_doc( ).
281         DATA(xlsx_sheets) = xlsx_document->get_sheets( ).
282         DATA(first_xlsx_sheet) = xlsx_document->get_sheet_by_id( xlsx_sheets[ 1 ]-sheet_id ).
283         first_xlsx_sheet->change_sheet_name( 'Sheet1' ).
284         IF field[] IS INITIAL.
285           DATA tablestructure TYPE REF TO cl_abap_structdescr.
286           DATA:ls_ref TYPE REF TO data.
287           CREATE DATA ls_ref LIKE LINE OF data.
288           tablestructure ?= cl_abap_typedescr=>describe_by_data_ref( ls_ref ).
289           field[] = tablestructure->get_ddic_field_list( ).
290         ENDIF.
291         LOOP AT field ASSIGNING FIELD-SYMBOL(<field>).
292           DATA(lv_column) = 1.
293           first_xlsx_sheet->set_cell_content( iv_row = 1 iv_column = lv_column iv_value = <field>-fieldname ).
294           first_xlsx_sheet->set_cell_content( iv_row = 2 iv_column = lv_column iv_value = <field>-scrtext_l ).
295           lv_column = lv_column + 1.
296         ENDLOOP.
297 
298         DATA(lv_row) = 3.
299         LOOP AT data ASSIGNING FIELD-SYMBOL(<data>).
300           lv_column = 1.
301           LOOP AT tablestructure->components REFERENCE INTO DATA(component).
302             ASSIGN COMPONENT component->name OF STRUCTURE <data> TO FIELD-SYMBOL(<value>).
303             first_xlsx_sheet->set_cell_content( iv_row = lv_row iv_column = lv_column iv_value = <value> ).
304             lv_column = lv_column + 1.
305           ENDLOOP.
306           lv_row = lv_row + 1.
307         ENDLOOP.
308         xstr = xlsx_document->save( ).
309         FREE:first_xlsx_sheet,xlsx_document,xlsx_handling.
310       CATCH cx_root INTO DATA(lo_error).
311         RAISE EXCEPTION TYPE zcx_email EXPORTING message = lo_error->get_text( ).
312     ENDTRY.
313 
314   ENDMETHOD.
315 
316 
317 * <SIGNATURE>---------------------------------------------------------------------------------------+
318 * | Instance Public Method ZCL_SEND_EMAIL->TEST
319 * +-------------------------------------------------------------------------------------------------+
320 * | [!CX!] ZCX_EMAIL
321 * +--------------------------------------------------------------------------------------</SIGNATURE>
322   METHOD test.
323     TRY.
324         set_subject( '测试邮件主题' ).
325         set_content( text = `<div>测试邮件正文</div>`).
326         SELECT * INTO TABLE @DATA(lt_t001) FROM t001 UP TO 10 ROWS.
327 
328         add_attach( VALUE #( type = 'EXT'
329                              xstr = tab_conv_xstr( data = lt_t001 )
330                              filename = '测试附件.xlsx' ) ).
331         set_from( '3496' ).
332         set_receiver( to = VALUE #( ( 'xxxx@xxxx' ) )
333                       cc = VALUE #( ( 'xxxx@xxxx' )
334                                     ( 'xxxx@xxxx' )
335                                     ( 'xxxx@xxxx' ) )
336                       bc = VALUE #( ( 'xxxx@xxxx' ) ) ).
337         send( ).
338 
339       CATCH cx_root INTO DATA(lo_error).
340         RAISE EXCEPTION TYPE zcx_email EXPORTING message = lo_error->get_text( ).
341     ENDTRY.
342   ENDMETHOD.
343 ENDCLASS.
View Code