Send an email with well formatted excel as attachment
REPORTzemail.TABLES: adr6. "E-Mail Addresses (Business Address Services)TYPE-POOLS: sbdst, soi.*--------------------------------------------------------------------**SELECTION SCREEN*--------------------------------------------------------------------*SELECTION-SCREEN BEGIN OF BLOCK mail WITH FRAME TITLE text-002.PARAMETERS: p_addr LIKE adr6-smtp_addr.SELECTION-SCREEN END OF BLOCK mail.SELECTION-SCREEN BEGIN OF BLOCK blk WITH FRAME TITLE text-001.PARAMETERS: p_class TYPE sbdst_classnameDEFAULT 'HRFPM_EXCEL_STANDARD', p_typeTYPE sbdst_classtypeDEFAULT 'OT', p_key TYPE sbdst_object_key DEFAULT 'Z_DOI_TEST', p_nameTYPE bds_propva DEFAULT 'ZTEST'.SELECTION-SCREEN END OF BLOCK blk.*--------------------------------------------------------------------**INTERNAL TABLE DECLARATION*--------------------------------------------------------------------*DATA: w_text TYPE bcsy_text, it_excel TYPE TABLE OF solix, it_fields TYPE soi_fields_table, wa_field LIKE LINE OF it_fields, it_data TYPE STANDARD TABLE OF spfli.*--------------------------------------------------------------------**VARIABLE DECLARATION*--------------------------------------------------------------------*DATA: w_size TYPE i, w_sent_to_all TYPE os_boolean, w_send_request TYPE REF TO cl_bcs, w_doc TYPE REF TO cl_document_bcs, w_sender TYPE REF TO cl_sapuser_bcs, w_recipient TYPE REF TO cl_cam_address_bcs.FIELD-SYMBOLS: <fs_tab> TYPE STANDARD TABLE, <fs_wa>, <fs_val>.*--------------------------------------------------------------------**START-OF-SELECTION*--------------------------------------------------------------------*START-OF-SELECTION.PERFORM prep_data.PERFORM prep_attach_excel.PERFORM send_email.*&---------------------------------------------------------------------**& Formprep_attach*&---------------------------------------------------------------------** Prepare for attachmetn*----------------------------------------------------------------------*FORM prep_attach_excel.TYPES: BEGIN OF ty_otline, oleline(128), END OF ty_otline.DATA: l_control TYPE REF TO i_oi_container_control, l_container TYPE REF TO cl_gui_custom_container, l_doc_signatures TYPE sbdst_signature, l_doc_signatureLIKE LINE OF l_doc_signatures, l_bds_inst TYPE REF TO cl_bds_document_set, l_components TYPE sbdst_components, l_component LIKE LINE OF l_components, l_uris TYPE sbdst_uri, l_uri LIKE LINE OF l_uris, l_uri_value TYPE bds_uri, l_mime_type TYPE bds_mimetp, l_doc_format TYPE soi_document_type, l_doc_type TYPE soi_document_type, l_ole_types TYPE TABLE OF ty_otline, l_doc TYPE REF TO i_oi_document_proxy, l_sheet TYPE REF TO i_oi_spreadsheet, l_error TYPE REF TO i_oi_error.CALL METHOD c_oi_container_control_creator=>get_container_control IMPORTING control = l_control error = l_error.PERFORM raise_message USING l_error.CREATE OBJECT l_container EXPORTING container_name = 'CONTAINER'.CALL METHOD l_control->init_control EXPORTING r3_application_name = 'TEST' parent = l_container inplace_enabled = 'X' IMPORTING error = l_error.PERFORM raise_message USING l_error.l_doc_signature-prop_name = 'DESCRIPTION'.l_doc_signature-prop_value = p_name.APPEND l_doc_signature TO l_doc_signatures.CREATE OBJECT l_bds_inst.CALL METHOD l_bds_inst->get_info EXPORTING classname = p_class classtype = p_type object_key = p_key CHANGING components = l_components signature = l_doc_signatures EXCEPTIONS nothing_found = 1 error_kpro = 2 internal_error= 3 parameter_error = 4 not_authorized= 5 not_allowed = 6.CALL METHOD l_bds_inst->get_with_url EXPORTING classname = p_class classtype = p_type object_key = p_key CHANGING uris = l_uris signature = l_doc_signatures EXCEPTIONS error_kpro = 1 internal_error= 2 nothing_found = 3 not_authorized= 4 not_allowed = 5 parameter_error = 6.READ TABLE: l_uris INTO l_uri INDEX 1, l_components INTO l_component INDEX 1.l_uri_value = l_uri-uri.l_mime_type = l_component-mimetype.CASE l_mime_type. WHEN 'application/msword'. l_doc_format = soi_docformat_compound. WHEN 'application/vnd.ms-excel'. l_doc_format = soi_docformat_compound. WHEN 'application/vnd.visio'. l_doc_format = soi_docformat_compound. WHEN 'application/x-rtf' OR 'text/rtf'. l_doc_format = soi_docformat_rtf. WHEN 'application/x-oleobject'. l_doc_format = soi_docformat_compound. WHEN 'text/plain'. l_doc_format = soi_docformat_text. WHEN OTHERS. l_doc_format = soi_docformat_native.ENDCASE.*conversion of mimetype to ole typeCALL METHOD c_oi_container_control_creator=>mime_to_ole EXPORTING mimetype = l_mime_type version= '' IMPORTING oletypes = l_ole_types.READ TABLE l_ole_types INTO l_doc_type INDEX 1.*create an instance document for each document that you wanna openCALL METHOD l_control->get_document_proxy EXPORTING document_type = l_doc_type document_format = l_doc_format no_flush = 'X' IMPORTING document_proxy= l_doc error = l_error.PERFORM raise_message USING l_error.*open an existed documentCALL METHOD l_doc->open_document EXPORTING open_inplace = 'X' document_url = l_uri_value.CALL METHOD l_doc->get_spreadsheet_interface EXPORTING no_flush = space IMPORTING sheet_interface = l_sheet error = l_error.PERFORM raise_message USING l_error.*select sheetCALL METHOD l_sheet->select_sheet EXPORTING name= 'Sheet1' IMPORTING error = l_error.PERFORM raise_message USING l_error.*rename sheet nameCALL METHOD l_sheet->set_sheet_name EXPORTING oldname = 'Sheet1' newname = 'TEST' IMPORTING error = l_error.PERFORM raise_message USING l_error.*append data into selected sheetCALL METHOD l_sheet->set_selection EXPORTING top = 2 left = 1 rows = 1 columns = 1 IMPORTING error = l_error.PERFORM raise_message USING l_error.CALL METHOD l_sheet->insert_range EXPORTING name = 'RANGE' rows = 10 columns = 9 IMPORTING error = l_error.PERFORM raise_message USING l_error.CALL METHOD l_sheet->insert_one_table EXPORTING wholetable = 'X' data_table = <fs_tab> fields_table = it_fields rangename= 'RANGE' IMPORTING error = l_error.PERFORM raise_message USING l_error.*save spreedsheet into internal table(binary data)CALL METHOD l_doc->save_document_to_table IMPORTING error = l_error CHANGING document_table = it_excel document_size= w_size.PERFORM raise_message USING l_error.CALL METHOD l_doc->close_document IMPORTING error = l_error.PERFORM raise_message USING l_error.CALL METHOD l_doc->release_document IMPORTING error = l_error.PERFORM raise_message USING l_error.ENDFORM. "prep_attach*&---------------------------------------------------------------------**& Formraise_message*&---------------------------------------------------------------------** Raise message*----------------------------------------------------------------------** -->P_ERROR text*----------------------------------------------------------------------*FORM raise_message USING p_error TYPE REF TO i_oi_error.IF p_error->has_failed EQ abap_true. CALL METHOD p_error->raise_message EXPORTING type = 'E'. LEAVE LIST-PROCESSING.ENDIF.ENDFORM. "raise_message*&---------------------------------------------------------------------**& Formprep_data*&---------------------------------------------------------------------** create internal table and fill data*----------------------------------------------------------------------*FORM prep_data.DATA: l_char_type TYPE REF TO cl_abap_typedescr, l_struct_type TYPE REF TO cl_abap_structdescr, l_table_type TYPE REF TO cl_abap_tabledescr, l_componentsTYPE cl_abap_structdescr=>component_table, l_component LIKE LINE OF l_components, l_counter(1) TYPE n, l_handler TYPE REF TO data, l_struct_handler TYPE REF TO data.l_char_type = cl_abap_elemdescr=>get_c( 10 ).DO 9 TIMES. l_counter = sy-index. CONCATENATE 'TXT' l_counter INTO l_component-name. wa_field-fieldname = l_component-name. wa_field-position= sy-index. wa_field-offset = ( sy-index - 1 ) * 10. wa_field-intlength = 10. wa_field-decimals= 0. wa_field-exid = 'C'. APPEND wa_field TO it_fields. l_component-type ?= l_char_type. APPEND l_component TO l_components.ENDDO.l_struct_type = cl_abap_structdescr=>create( l_components ).l_table_type= cl_abap_tabledescr=>create( l_struct_type ).CREATE DATA l_handler TYPE HANDLE l_table_type.CREATE DATA l_struct_handler TYPE HANDLE l_struct_type.ASSIGN l_handler->* TO <fs_tab>.ASSIGN l_struct_handler->* TO <fs_wa>.DO 10 TIMES. DO 9 TIMES. ASSIGN COMPONENT sy-index OF STRUCTURE <fs_wa> TO <fs_val>. <fs_val> = sy-index. ENDDO. APPEND <fs_wa> TO <fs_tab>.ENDDO.ENDFORM. "prep_data*&---------------------------------------------------------------------**& Formsend_email*&---------------------------------------------------------------------** SEND EMAIL WITH WELL FORMATED EXCEL ATTACHMENT*----------------------------------------------------------------------*FORM send_email.DATA: l_bcs_exception TYPE REF TO cx_bcs.*Create persistent send requestTRY. w_send_request = cl_bcs=>create_persistent( ). APPEND: '<html><body>' TO w_text, 'Hi,' TO w_text, '<p>the attached is the excel!</p>' TO w_text, '</body></html>' TO w_text.*Create document from internal table with text w_doc = cl_document_bcs=>create_document(* i_type = 'RAW' i_type = 'HTM' i_text = w_text i_subject = 'CL_BCS DEMO' ).*attachment CALL METHOD w_doc->add_attachment EXPORTING i_attachment_type = 'XLS' i_attachment_subject = 'TEST' i_att_content_hex = it_excel.*add document to send request CALL METHOD w_send_request->set_document( w_doc ).*set sender w_sender = cl_sapuser_bcs=>create( sy-uname ). CALL METHOD w_send_request->set_sender EXPORTING i_sender = w_sender.*add recipient w_recipient = cl_cam_address_bcs=>create_internet_address( p_addr ). CALL METHOD w_send_request->add_recipient EXPORTING i_recipient = w_recipient i_express = 'X'.*send document CALL METHOD w_send_request->set_send_immediately( 'X' ). CALL METHOD w_send_request->send( EXPORTING i_with_error_screen = 'X' RECEIVING result = w_sent_to_all ). IF w_sent_to_all EQ 'X'. WRITE: / 'Sent successfully!'. ENDIF. COMMIT WORK. CATCH cx_bcs INTO l_bcs_exception.ENDTRY.ENDFORM. "send_email
页:
[1]