Send an email with well formatted excel as attachment

14622 단어 ExcelOSvisio
REPORT  zemail.

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_classname  DEFAULT 'HRFPM_EXCEL_STANDARD',
            p_type  TYPE sbdst_classtype  DEFAULT 'OT',
            p_key   TYPE sbdst_object_key DEFAULT 'Z_DOI_TEST',
            p_name  TYPE 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.

*&---------------------------------------------------------------------*
*&      Form  prep_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_signature  LIKE 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 type
  CALL 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 open
  CALL 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 document
  CALL 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 sheet
  CALL METHOD l_sheet->select_sheet
    EXPORTING
      name  = 'Sheet1'
    IMPORTING
      error = l_error.
  PERFORM raise_message USING l_error.
*rename sheet name
  CALL 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 sheet
  CALL 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

*&---------------------------------------------------------------------*
*&      Form  raise_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

*&---------------------------------------------------------------------*
*&      Form  prep_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_components  TYPE 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

*&---------------------------------------------------------------------*
*&      Form  send_email
*&---------------------------------------------------------------------*
*       SEND EMAIL WITH WELL FORMATED EXCEL ATTACHMENT
*----------------------------------------------------------------------*
FORM send_email.
  DATA: l_bcs_exception TYPE REF TO cx_bcs.
*Create persistent send request
  TRY.
      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

좋은 웹페이지 즐겨찾기