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.
本文来自博客园,作者:Lovemywx2,转载请注明原文链接:https://www.cnblogs.com/1187163927ch/p/16334885.html