SAP Office Excel Intergration

*&---------------------------------------------------------------------*
*& Report  DEMOEXCELINTEGRATION                                        *
*&---------------------------------------------------------------------*
INCLUDE rdemoexcelintegration2top.

DATA: control TYPE REF TO i_oi_container_control.
DATA: container TYPE REF TO cl_gui_custom_container.
DATA: link_server TYPE REF TO i_oi_link_server.
DATA: table_coll TYPE REF TO i_oi_table_collection.

DATA: document_type TYPE soi_document_type
                                       VALUE soi_doctype_excel_chart,
      document_format TYPE soi_document_type.

DATA: doc_size TYPE i, doc_url TYPE t_url,
      doc_table TYPE sbdst_content.

DATA: usa_sales TYPE i VALUE 1000,
      europe_sales TYPE i VALUE 2000,
      japan_sales TYPE i VALUE 1000,
      asia_sales TYPE i VALUE 100,
      america_sales TYPE i VALUE 100,
      africa_sales TYPE i VALUE 100.
DATA: total_sales TYPE i VALUE 0.

DATA: BEGIN OF test_line, region(50), sales TYPE i, END OF test_line.
DATA: test_table LIKE TABLE OF test_line.
DATA: wa_test_table LIKE test_line.

*---------------------------------------------------------------------*
*       CLASS c_excel_document DEFINITION
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*
CLASS c_excel_document DEFINITION.

  PUBLIC SECTION.
    DATA: proxy TYPE REF TO i_oi_document_proxy.
    DATA: document_type TYPE soi_document_type.
    DATA: data_table TYPE sbdst_content,
          data_size TYPE i,
          doc_url TYPE t_url.

    METHODS: constructor
              IMPORTING control TYPE REF TO i_oi_container_control
                        document_type TYPE soi_document_type.

    METHODS: on_close_document
              FOR EVENT on_close_document OF i_oi_document_proxy
              IMPORTING document_proxy has_changed.

    METHODS: on_custom_event
              FOR EVENT on_custom_event OF i_oi_document_proxy
              IMPORTING document_proxy event_name param_count
                        param1 param2 param3.

    METHODS: create_document
                  IMPORTING open_inplace    TYPE c DEFAULT ' '
                            value(no_flush) TYPE c DEFAULT ' '
                  EXPORTING error TYPE REF TO i_oi_error.

    METHODS: open_document
                  IMPORTING open_inplace    TYPE c DEFAULT ' '
                            open_readonly   TYPE c DEFAULT ' '
                            value(no_flush) TYPE c DEFAULT ' '
                  EXPORTING error TYPE REF TO i_oi_error.

    METHODS: open_document_url
                  IMPORTING open_inplace  TYPE c DEFAULT ' '
                            open_readonly TYPE c DEFAULT ' '
                            doc_url TYPE t_url DEFAULT ' '
                  EXPORTING error TYPE REF TO i_oi_error.

    METHODS: retrieve_document
                 IMPORTING documents TYPE document_list
                 EXPORTING document_format TYPE soi_document_type
                           doc_url TYPE t_url.

    METHODS: close_document
                  IMPORTING do_save         TYPE c DEFAULT ' '
                            value(no_flush) TYPE c DEFAULT ' '
                  EXPORTING error       TYPE REF TO i_oi_error.

  PRIVATE SECTION.
    DATA: control  TYPE REF TO i_oi_container_control.
ENDCLASS.


DATA: document TYPE REF TO c_excel_document.
DATA: error TYPE REF TO i_oi_error.
DATA: error_table TYPE TABLE OF REF TO i_oi_error.
DATA: bds_instance TYPE REF TO cl_bds_document_set.
*&---------------------------------------------------------------------*
*&      Module  STATUS_0100  OUTPUT
*&---------------------------------------------------------------------*
MODULE status_0100 OUTPUT.

  SET PF-STATUS 'MAIN0100'.
  SET TITLEBAR '001'.

  IF control IS INITIAL.
    CLEAR error_table.

    DATA: b_has_activex.

    CALL FUNCTION 'GUI_HAS_ACTIVEX'
         IMPORTING
              return = b_has_activex.
    IF b_has_activex IS INITIAL. MESSAGE e007. ENDIF.

    CALL METHOD c_oi_container_control_creator=>get_container_control
                      IMPORTING control = control
                                error = error.
    APPEND error TO error_table.

    CREATE OBJECT container
              EXPORTING container_name = 'CONTAINER'.

    CALL METHOD control->init_control
                        EXPORTING r3_application_name =
                                              'R/3 Basis' "#EC NOTEXT
                                  inplace_enabled = 'X'
                                  inplace_scroll_documents = 'X'
                                  parent = container
                                  register_on_close_event = 'X'
                                  register_on_custom_event = 'X'
                                  no_flush = 'X'
                        IMPORTING error = error.
    APPEND error TO error_table.

    CALL METHOD control->get_link_server
                       EXPORTING no_flush = 'X'
                       IMPORTING link_server = link_server
                                 error = error.
    APPEND error TO error_table.

    CALL METHOD link_server->start_link_server
                       EXPORTING no_flush = 'X'
                       IMPORTING error = error.
    APPEND error TO error_table.

    CALL METHOD control->get_table_collection
                    EXPORTING no_flush = 'X'
                    IMPORTING table_collection = table_coll
                              error = error.
    APPEND error TO error_table.

    CALL METHOD table_coll->add_table
                    EXPORTING table_name = 'SALES_IN'
                              table_type = table_coll->table_type_input
                              no_flush = ' '
                    IMPORTING error = error
                    CHANGING  data_table = test_table.
    APPEND error TO error_table.

    LOOP AT error_table INTO error.
      CALL METHOD error->raise_message EXPORTING type = 'E'.
    ENDLOOP.
    CLEAR error_table.

    PERFORM refresh_sales.

    CREATE OBJECT document
              EXPORTING control = control
                        document_type = document_type.

  ENDIF.
  IF bds_instance IS INITIAL.
    CREATE OBJECT bds_instance.
  ENDIF.

ENDMODULE.                             " STATUS_0100  OUTPUT

*&---------------------------------------------------------------------*
*&      Module  USER_COMMAND_0100  INPUT
*&---------------------------------------------------------------------*
MODULE user_command_0100 INPUT.
  DATA: l_fcode LIKE fcode.

  l_fcode = fcode.
  CLEAR fcode.

  CALL METHOD cl_gui_cfw=>dispatch.

  CASE l_fcode.
    WHEN 'EXIT'.                       "Zurück
      IF NOT document IS INITIAL.
        CALL METHOD document->close_document.
        FREE document.
      ENDIF.
      IF NOT link_server IS INITIAL.
        CALL METHOD link_server->stop_link_server.
        FREE link_server.
      ENDIF.
      IF NOT table_coll IS INITIAL.
        FREE table_coll.
      ENDIF.
      IF NOT control IS INITIAL.
        CALL METHOD control->destroy_control.
        FREE control.
      ENDIF.
      IF NOT bds_instance IS INITIAL.
        FREE bds_instance.
      ENDIF.

      LEAVE PROGRAM.
    WHEN 'CREATE'.
      IF NOT control IS INITIAL.
        CALL METHOD document->create_document.
        CALL METHOD c_oi_errors=>show_message EXPORTING type = 'E'.
      ENDIF.
    WHEN 'SELECT'.
      IF NOT control IS INITIAL.
        DATA: documents TYPE document_list.
        DATA: descr TYPE document_descr.

        CLEAR documents.
        descr-document_name = 'Car Sales Chart'(do1).
        descr-document_id = 'DEMOEXCELCHART1'.
        APPEND descr TO documents.
        descr-document_name = 'Car Sales Chart 2'(do3).
        descr-document_id = 'DEMOEXCELCHART2'.
        APPEND descr TO documents.
        descr-document_name = 'Car Sales Sheet'(do2).
        descr-document_id = 'DEMOEXCELSHEET1'.
        APPEND descr TO documents.

        CLEAR doc_url.
        CALL METHOD document->retrieve_document
                    EXPORTING documents = documents
                    IMPORTING document_format = document_format
                              doc_url = doc_url.

        IF NOT doc_url IS INITIAL.
          CALL METHOD document->close_document.

          CALL METHOD document->open_document_url
                            EXPORTING open_inplace = 'X'
                                      doc_url = doc_url
                            IMPORTING error = error.
          CALL METHOD c_oi_errors=>show_message EXPORTING type = 'E'.
        ELSE.
          MESSAGE e010.
        ENDIF.
      ENDIF.
    WHEN 'OPEN'.
      IF document->data_size NE 0.
        IF NOT control IS INITIAL.
          CALL METHOD document->open_document
                            IMPORTING error = error.
          CALL METHOD error->raise_message EXPORTING type = 'E'.
        ENDIF.
      ELSE.
        MESSAGE e005.
      ENDIF.
    WHEN 'INPLACE'.
      IF document->data_size NE 0.
        IF NOT control IS INITIAL.
          CALL METHOD document->open_document
                            EXPORTING open_inplace = 'X'
                                      open_readonly = 'X'
                            IMPORTING error = error.
          CALL METHOD error->raise_message EXPORTING type = 'E'.
        ENDIF.
      ELSE.
        MESSAGE e005.
      ENDIF.
    WHEN 'SAVEAS'.
      IF NOT document IS INITIAL AND NOT document->proxy IS INITIAL.
        CALL METHOD document->proxy->save_as
                          EXPORTING prompt_user = 'X'
                          IMPORTING error = error.
        CALL METHOD error->raise_message EXPORTING type = 'E'.
      ELSE.
        MESSAGE e000.
      ENDIF.
    WHEN 'CLOSE'.
      IF NOT document IS INITIAL.
        CALL METHOD document->close_document
                      EXPORTING do_save = 'X'
                      IMPORTING error = error.
        CALL METHOD error->raise_message EXPORTING type = 'E'.
      ELSE.
        MESSAGE e000.
      ENDIF.
    WHEN 'COPYLINK'.
      IF NOT link_server IS INITIAL.
        PERFORM refresh_sales.
        CALL METHOD link_server->execute_copy_link_dialog
                 IMPORTING error = error.
        CALL METHOD error->raise_message EXPORTING type = 'E'.
      ELSE.
        MESSAGE e004.
      ENDIF.
    WHEN 'REFRESH'.
      IF NOT link_server IS INITIAL.
        PERFORM refresh_sales.
      ELSE.
        MESSAGE e004.
      ENDIF.
      IF NOT document IS INITIAL AND NOT document->proxy IS INITIAL.
        CALL METHOD document->proxy->execute_macro
                      EXPORTING macro_string = 'module1.R3StartupMacro'
                                param_count = 1
                                param1 = 10
                      IMPORTING error = error.
*                      CHANGING  retvalue = usa_sales.
*         CALL METHOD c_oi_errors=>show_message EXPORTING type = 'E'.
      ELSE.
        MESSAGE e000.
      ENDIF.
    WHEN 'PRINT'.
      IF NOT document IS INITIAL AND NOT document->proxy IS INITIAL.
        CALL METHOD document->proxy->print_document
                       EXPORTING prompt_user = 'X'
                       IMPORTING error = error.
        CALL METHOD error->raise_message EXPORTING type = 'E'.
      ELSE.
        MESSAGE e000.
      ENDIF.
  ENDCASE.
ENDMODULE.                             " USER_COMMAND_0100  INPUT

************************************************************************
*  CLASS c_excel_document IMPLEMENTATION.
************************************************************************
CLASS c_excel_document IMPLEMENTATION.
  METHOD: constructor.
*              IMPORTING control TYPE REF TO i_oi_container_control
*                        document_type TYPE soi_document_type
    me->control = control.
    me->document_type = document_type.
  ENDMETHOD.

  METHOD create_document.
*                 IMPORTING open_inplace  TYPE c DEFAULT ' '
*                 EXPORTING error TYPE REF TO i_oi_error.
    IF NOT proxy IS INITIAL.
      CALL METHOD me->close_document.
    ENDIF.
    CALL METHOD control->get_document_proxy
             EXPORTING document_type = document_type
                       register_container = 'X'
             IMPORTING document_proxy = proxy
                       error = error.
    IF error->error_code NE c_oi_errors=>ret_ok.
      EXIT.
    ENDIF.

    CALL METHOD proxy->create_document
                        EXPORTING create_view_data = 'X'
                                  open_inplace = open_inplace
                                document_title = 'R/3 Demo' "#EC NOTEXT
                        IMPORTING error = error.
    IF error->error_code NE c_oi_errors=>ret_ok.
      EXIT.
    ENDIF.

    SET HANDLER me->on_close_document FOR proxy.
    SET HANDLER me->on_custom_event FOR proxy.
  ENDMETHOD.

  METHOD open_document.
*                 IMPORTING open_inplace  TYPE c DEFAULT ' '
*                           open_readonly TYPE c DEFAULT ' '
*                 EXPORTING error TYPE REF TO i_oi_error.
    IF NOT proxy IS INITIAL.
      CALL METHOD me->close_document.
    ENDIF.
    CALL METHOD control->get_document_proxy
             EXPORTING document_type = document_type
                       register_container = 'X'
             IMPORTING document_proxy = proxy
                       error = error.
    IF error->error_code NE c_oi_errors=>ret_ok.
      EXIT.
    ENDIF.

    CALL METHOD proxy->open_document_from_table
                           EXPORTING document_table = data_table
                                     document_size  = data_size
                                     open_inplace = open_inplace
                                     open_readonly = open_readonly
                                     document_title = 'R/3 Demo'
                           IMPORTING error = error.
    IF error->error_code NE c_oi_errors=>ret_ok.
      EXIT.
    ENDIF.

    SET HANDLER me->on_close_document FOR proxy.
    SET HANDLER me->on_custom_event FOR proxy.

    CALL METHOD proxy->update_document_links
                           IMPORTING error = error.
  ENDMETHOD.

  METHOD open_document_url.
*                 IMPORTING open_inplace  TYPE c DEFAULT ' '
*                           open_readonly TYPE c DEFAULT ' '
*                           doc_url TYPE t_url DEFAULT ' '
*                 EXPORTING error TYPE REF TO i_oi_error.
    DATA: save_error TYPE REF TO i_oi_error.

    IF NOT proxy IS INITIAL.
      CALL METHOD me->close_document.
    ENDIF.
    CALL METHOD control->get_document_proxy
             EXPORTING document_type = document_type
                       register_container = 'X'
             IMPORTING document_proxy = proxy
                       error = error.
    IF error->error_code NE c_oi_errors=>ret_ok.
      EXIT.
    ENDIF.

    me->doc_url = doc_url.
    CALL METHOD proxy->open_document
                           EXPORTING document_url = doc_url
                                     open_inplace = open_inplace
                                     open_readonly = open_readonly
                           IMPORTING error = error.
    IF error->error_code NE c_oi_errors=>ret_ok.
      EXIT.
    ENDIF.

        data: is_available TYPE I.
    data: sheet_interface TYPE REF TO i_oi_spreadsheet.
    CALL METHOD proxy->has_spreadsheet_interface
     IMPORTING is_available = is_available
               error = error.
    if is_available EQ 1.
      CALL METHOD proxy->get_spreadsheet_interface
        IMPORTING sheet_interface = sheet_interface
                  error = error.

      CALL METHOD sheet_interface->select_sheet
       EXPORTING name      = 'Sheet1'
       IMPORTING error = error.

      CALL METHOD proxy->update_document_links
                           IMPORTING error = error.

      CALL METHOD sheet_interface->select_sheet
       EXPORTING name      = 'Chart1'
       IMPORTING error = error.

     endif.


*   Document shall also be available in ITAB for respective operations:
    CALL METHOD proxy->save_document_to_table
                      IMPORTING error = save_error
                      CHANGING  document_table = data_table
                                document_size = data_size.
    IF NOT save_error IS INITIAL.
      IF save_error->error_code NE c_oi_errors=>ret_ok.
        error = save_error.
        EXIT.
      ENDIF.
    ENDIF.
    SET HANDLER me->on_close_document FOR proxy.
    SET HANDLER me->on_custom_event FOR proxy.

    CALL METHOD proxy->update_document_links
                           IMPORTING error = error.
  ENDMETHOD.

  METHOD retrieve_document.
*              importing documents type document_list
*              exporting document_format type soi_document_format
*                        doc_url type t_url.
*------BDS-Data-Structures:---------------------------------------------

* Tables and WAs:
    DATA: doc_signature TYPE sbdst_signature,
          wa_doc_signature LIKE LINE OF doc_signature,
          doc_components TYPE sbdst_components,
          wa_doc_components LIKE LINE OF doc_components,
          doc_properties TYPE sbdst_properties,
          wa_doc_properties LIKE LINE OF doc_properties,
          doc_uris TYPE sbdst_uri,
          wa_doc_uris LIKE LINE OF doc_uris.
* ID's:
    DATA: doc_classname TYPE sbdst_classname VALUE 'SOFFICEINTEGRATION',
          doc_classtype TYPE sbdst_classtype VALUE 'OT',
        doc_object_key TYPE sbdst_object_key VALUE 'SOFFICEINTEGRATION',
          doc_mimetype TYPE bapicompon-mimetype.
*-----------------------------------------------------------------------

    DATA: field_desc TYPE TABLE OF rsvbfidesc.
    DATA: wa_field_desc TYPE rsvbfidesc.
    DATA: l_nr LIKE sy-tabix.

    CLEAR: field_desc, wa_field_desc.
    wa_field_desc-fieldnum = 1.
    wa_field_desc-display = 'X'.
    APPEND wa_field_desc TO field_desc.

    l_nr = 0.
    CALL FUNCTION 'RS_VALUES_BOX'
         EXPORTING
              left_upper_col = 5
              left_upper_row = 5
              pagesize       = 10
              title          = 'Select document'(sdc)
         IMPORTING
              linenumber     = l_nr
         TABLES
              field_desc     = field_desc
              value_tab      = documents
         EXCEPTIONS
              OTHERS         = 1.

    IF sy-subrc EQ 0 AND l_nr NE 0.
      READ TABLE documents INDEX l_nr INTO descr.
      IF sy-subrc EQ 0.
        CLEAR: wa_doc_signature, wa_doc_components, wa_doc_uris.
        CLEAR: doc_signature, doc_components, doc_uris.

        wa_doc_signature-prop_name = 'DESCRIPTION'.
        wa_doc_signature-prop_value = descr-document_id.
        APPEND wa_doc_signature TO doc_signature.

        CALL METHOD bds_instance->get_info
                      EXPORTING classname = doc_classname
                                classtype = doc_classtype
                                object_key = doc_object_key
                      CHANGING components = doc_components
                               signature = doc_signature
                      EXCEPTIONS nothing_found = 1
                                 error_kpro = 2
                                 internal_error = 3
                                 parameter_error = 4
                                 not_authorized = 5
                                 not_allowed = 6.
        IF sy-subrc NE 0 AND sy-subrc NE 1.
          MESSAGE e016.
        ENDIF.
        IF sy-subrc = 1.
          MESSAGE e017.
        ENDIF.

        CALL METHOD bds_instance->get_with_url
                           EXPORTING classname = doc_classname
                                     classtype = doc_classtype
                                     object_key = doc_object_key
                           CHANGING uris = doc_uris
                                    signature = doc_signature
                      EXCEPTIONS nothing_found = 1
                                 error_kpro = 2
                                 internal_error = 3
                                 parameter_error = 4
                                 not_authorized = 5
                                 not_allowed = 6.
        IF sy-subrc NE 0 AND sy-subrc NE 1.
          MESSAGE e016.
        ENDIF.
        IF sy-subrc = 1.
          MESSAGE e017.
        ENDIF.

        READ TABLE doc_components INTO wa_doc_components INDEX 1.
        READ TABLE doc_uris INTO wa_doc_uris INDEX 1.
        doc_mimetype = wa_doc_components-mimetype.
        doc_url = wa_doc_uris-uri.

        CASE doc_mimetype.
          WHEN 'application/x-rtf' OR 'text/rtf'.
            document_format = soi_docformat_rtf.
          WHEN 'application/x-oleobject'.
            document_format = soi_docformat_compound.
          WHEN 'text/plain'.
            document_format = soi_docformat_text.
          WHEN OTHERS.
            document_format = soi_docformat_native.
        ENDCASE.

      ENDIF.
    ENDIF.
  ENDMETHOD.

  METHOD close_document.
*                 IMPORTING do_save TYPE c DEFAULT ' '
*                 EXPORTING error TYPE REF TO i_oi_error.
    DATA: is_closed TYPE i, has_changed TYPE i.
    DATA: save_error TYPE REF TO i_oi_error.

    IF NOT proxy IS INITIAL.
      CALL METHOD proxy->is_destroyed IMPORTING ret_value = is_closed.

      IF is_closed IS INITIAL.
        CALL METHOD proxy->close_document
                     EXPORTING do_save = do_save
                     IMPORTING has_changed = has_changed
                               error = error.
        IF error->error_code NE c_oi_errors=>ret_ok.
          EXIT.
        ENDIF.
      ENDIF.

      IF NOT has_changed IS INITIAL.
        CALL METHOD proxy->save_document_to_table
                      EXPORTING no_flush = 'X'
                      IMPORTING error = save_error
                      CHANGING  document_table = data_table
                                document_size = data_size.
      ENDIF.

      CALL METHOD proxy->release_document
                                   IMPORTING error = error.

      IF NOT save_error IS INITIAL.
        IF save_error->error_code NE c_oi_errors=>ret_ok.
          error = save_error.
        ENDIF.
      ENDIF.

      SET HANDLER me->on_close_document FOR proxy ACTIVATION ' '.
      SET HANDLER me->on_custom_event FOR proxy ACTIVATION ' '.
    ELSE.
      CALL METHOD c_oi_errors=>create_error_for_retcode
              EXPORTING retcode = c_oi_errors=>ret_document_not_open
                        no_flush = ' '
              IMPORTING error = error.
    ENDIF.
  ENDMETHOD.

  METHOD on_close_document.
*              FOR EVENT on_close_document OF c_oi_container_control
*              IMPORTING document_proxy has_changed.
    DATA: answer, do_save.

    IF has_changed EQ 1.
      CALL FUNCTION 'POPUP_TO_CONFIRM'
           EXPORTING
                titlebar              = 'Office Integration Demo'(oid)
                text_question         = 'Save Document?'(sav)
                display_cancel_button = ' '
           IMPORTING
                answer                = answer.
      IF answer EQ '1'.
        do_save = 'X'.
      ELSE.
        do_save = ' '.
      ENDIF.
      CALL METHOD me->close_document
                    EXPORTING do_save = do_save
                    IMPORTING error = error.
      CALL METHOD error->raise_message
                                  EXPORTING type = 'E'.
    ENDIF.
  ENDMETHOD.

  METHOD on_custom_event.
*              FOR EVENT on_custom_event OF i_oi_document_proxy
*              IMPORTING document_proxy event_name param_count
*                        param1 param2 param3.
    IF event_name EQ 'ON_SERIES_CHANGE'.
      CALL METHOD table_coll->get_table
                    EXPORTING table_name = 'SALES_IN'
                    IMPORTING error = error
                    CHANGING  data_table = test_table.
      CALL METHOD error->raise_message
                                  EXPORTING type = 'E'.
      CLEAR wa_test_table.
      READ TABLE test_table INTO wa_test_table INDEX 1.
      usa_sales = wa_test_table-sales.
      CLEAR wa_test_table.
      READ TABLE test_table INTO wa_test_table INDEX 2.
      europe_sales = wa_test_table-sales.
      CLEAR wa_test_table.
      READ TABLE test_table INTO wa_test_table INDEX 3.
      japan_sales = wa_test_table-sales.
      CLEAR wa_test_table.
      READ TABLE test_table INTO wa_test_table INDEX 4.
      asia_sales = wa_test_table-sales.
      CLEAR wa_test_table.
      READ TABLE test_table INTO wa_test_table INDEX 5.
      america_sales = wa_test_table-sales.
      CLEAR wa_test_table.
      READ TABLE test_table INTO wa_test_table INDEX 6.
      africa_sales = wa_test_table-sales.
      CLEAR wa_test_table.

    ENDIF.
  ENDMETHOD.
ENDCLASS.

************************************************************************
* FORM refresh_sales.
************************************************************************
FORM refresh_sales.
  DATA: BEGIN OF item_line,
             region(60),
             sales TYPE i,
             date  TYPE d,
             time  TYPE t,
             weight TYPE f,
             amount TYPE p DECIMALS 3,
             id(10) TYPE n,
        END OF item_line.
  DATA: sales_table LIKE TABLE OF item_line.
  DATA: wa_sales_table LIKE item_line.
  DATA: fields_table TYPE TABLE OF rfc_fields.
  DATA: wa_fields_table TYPE rfc_fields.
  DATA: ind TYPE i.

  CALL FUNCTION 'DP_GET_FIELDS_FROM_TABLE'
       TABLES
            data   = sales_table
            fields = fields_table.

  READ TABLE fields_table INDEX 1 INTO wa_fields_table.
  wa_fields_table-fieldname = 'Region'."#EC NOTEXT
  MODIFY fields_table FROM wa_fields_table INDEX 1.
  CLEAR wa_fields_table.
  READ TABLE fields_table INDEX 2 INTO wa_fields_table.
  wa_fields_table-fieldname = 'Sales'. "#EC NOTEXT
  MODIFY fields_table FROM wa_fields_table INDEX 2.

  CLEAR: sales_table, wa_sales_table.

  wa_sales_table-region = 'USA'(usa).
  wa_sales_table-sales = usa_sales.
  APPEND wa_sales_table TO sales_table.
  CLEAR wa_sales_table.
  wa_sales_table-region = 'Europe'(eur).
  wa_sales_table-sales = europe_sales.
  APPEND wa_sales_table TO sales_table.
  CLEAR wa_sales_table.
  wa_sales_table-region = 'Japan'(jap).
  wa_sales_table-sales = japan_sales.
  APPEND wa_sales_table TO sales_table.
  CLEAR wa_sales_table.
  wa_sales_table-region = 'Asia'(asi).
  wa_sales_table-sales = asia_sales.
  APPEND wa_sales_table TO sales_table.
  CLEAR wa_sales_table.
  wa_sales_table-region = 'America'(ame).
  wa_sales_table-sales = america_sales.
  APPEND wa_sales_table TO sales_table.
  CLEAR wa_sales_table.
  wa_sales_table-region = 'Africa'(afr).
  wa_sales_table-sales = africa_sales.
  APPEND wa_sales_table TO sales_table.
  CLEAR wa_sales_table.

  LOOP AT sales_table INTO wa_sales_table.
    ind = sy-tabix.
    wa_sales_table-date = sy-datum + ind.
    wa_sales_table-time = sy-uzeit + ind.
    wa_sales_table-weight = 100000 * ind.
    wa_sales_table-amount = 11111 * ind.
    wa_sales_table-id = ind.
    MODIFY sales_table FROM wa_sales_table INDEX ind.
  ENDLOOP.

  CALL METHOD table_coll->add_table
                    EXPORTING table_name = 'SALES_OUT'
                              table_type = table_coll->table_type_output
                              no_flush    = 'X'
                    IMPORTING error = error
                    CHANGING  data_table = sales_table
                              fields_table = fields_table.

  CALL METHOD link_server->add_table_item2
           EXPORTING item_name = 'Sales'    "#EC NOTEXT
                     item_title = 'Car Sales Figures'(sal)
                     no_flush    = 'X'
           IMPORTING error = error
           CHANGING  data_table = sales_table
                     fields_table = fields_table.

  CALL METHOD link_server->add_string_item
           EXPORTING item_name   = 'ChartTitle'
                     item_title  = 'Chart Title'(ti0)
                     item_value  = 'Car Sales by Region'(ti1)
                     no_flush    = 'X'
           IMPORTING error = error.
  CALL METHOD link_server->add_string_item
           EXPORTING item_name   = 'ColumnTitle1'
                     item_title  = 'Column Title 1'(ti2)
                     item_value  = 'Region'(ti3)
                     no_flush    = 'X'
           IMPORTING error = error.
  CALL METHOD link_server->add_string_item
           EXPORTING item_name   = 'ColumnTitle2'
                     item_title  = 'Column Title 2'(ti4)
                     item_value  = 'Sold Cars'(ti5)
                     no_flush    = ' '
           IMPORTING error = error.

ENDFORM.
*----------------------------------------------------------------------*
*   INCLUDE RDEMOEXCELINTEGRATIONTOP2                                  *
*----------------------------------------------------------------------*
REPORT  saprdemoexcelintegration2 MESSAGE-ID demoofficeintegratio.

SET SCREEN 100.

TYPE-POOLS: sbdst, soi.

CLASS c_oi_errors DEFINITION LOAD.

TYPES: BEGIN OF document_descr,
          document_name(40), document_id(64),
       END OF document_descr.

TYPES: document_list TYPE TABLE OF document_descr.
TYPES: t_url LIKE bapiuri-uri.

DATA: fcode LIKE sy-ucomm.
原文地址:https://www.cnblogs.com/JackeyLove/p/13650565.html