SAP DOI

OLE是SAP早期的Office集成的工具,而DOI是它的替代技术。

首先将 Excel 模板文档放在应用程序服务器上,然后开发代码 调用DOI 打开这个文档,对文档进行操作和处理。        

1: OAOR 上载EXCEL 模板

上载时注意,类名称和对象代码,后面代码要用它定位你上载的文件

 

 

 

2:写程序:

 1)创建屏幕:0100,并激活之

 

PROCESS BEFORE OUTPUT.
 MODULE STATUS_0100.
*
PROCESS AFTER INPUT.
 MODULE USER_COMMAND_0100.

2:创建PF-STATUS ,并分配OKOCDE和USER_COMMAND_0100匹配

  SET PF-STATUS 'SA1'.

 

*&---------------------------------------------------------------------*
*& Report ZTEST_DOI01
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ztest_doi01.

TABLES:mara.

TYPE-POOLS:vrm, sbdst, soi.

* SAP Desktop Office Integration Interfaces
DATA: cl_container   TYPE REF TO cl_gui_container,
      cl_splitter    TYPE REF TO cl_gui_splitter_container,
      cl_control     TYPE REF TO i_oi_container_control,
      cl_docu_proxy  TYPE REF TO i_oi_document_proxy,
      cl_spreadsheet TYPE REF TO i_oi_spreadsheet,
      cl_error       TYPE REF TO i_oi_error,
      cl_errors      TYPE REF TO i_oi_error OCCURS 0 WITH HEADER LINE.

* spreadsheet interface structures for Excel data input
DATA:wa_cellitem     TYPE soi_generic_item,
     wa_rangeitem    TYPE soi_range_item,
     gt_ranges       TYPE soi_range_list,
     gt_excel_input  TYPE soi_generic_table,
     wa_excel_input  TYPE soi_generic_item,
     g_initialized   TYPE c,
     g_retcode       TYPE soi_ret_string,
     gt_excel_format TYPE soi_format_table,
     wa_format       LIKE LINE OF gt_excel_format.


DATA:cl_bds_instance   TYPE REF TO  cl_bds_document_set,
     gt_doc_signature  TYPE         sbdst_signature,
     wa_doc_signature  LIKE LINE OF gt_doc_signature,
     gt_doc_components TYPE         sbdst_components,
     gt_doc_uris       TYPE         sbdst_uri,
     wa_doc_uris       LIKE LINE OF gt_doc_uris.

DATA:g_app         TYPE vrm_id,
     val(50),
     g_url(256)    TYPE c,
     g_has_activex TYPE c,
     g_excel       TYPE text80 VALUE 'Excel.Sheet',
     g_docu_type   TYPE text80.

*the following variable is from screen 100
DATA: ok_code TYPE sy-ucomm,
      save_ok TYPE sy-ucomm.
*output internal table

DATA: BEGIN OF itab OCCURS 0.
        INCLUDE STRUCTURE makt.
      DATA: END   OF itab.

*Please import template file "ztest_doi1" to sap using Tcode:OAOR
DATA: g_classname  TYPE sbdst_classname VALUE 'HRFPM_EXCEL_STANDARD', "SOFFICEINTEGRATION',
      g_classtype  TYPE sbdst_classtype VALUE 'OT',
      g_object_key TYPE sbdst_object_key VALUE 'DEMO_DOI'.         "variable
************************************************************************

SELECTION-SCREEN BEGIN OF BLOCK xavery WITH FRAME TITLE TEXT-001.
SELECT-OPTIONS:  s_matnr FOR mara-matnr MEMORY ID mat.
SELECTION-SCREEN END OF BLOCK xavery.
************************************************************************

INITIALIZATION.

START-OF-SELECTION.
  PERFORM get_data.

END-OF-SELECTION.

  CALL SCREEN 0100.

*&---------------------------------------------------------------------*
*&      Form  sub_query_mara
*&---------------------------------------------------------------------*
*       从物料主数据表MARA中取数
*----------------------------------------------------------------------*
FORM get_data .
  SELECT *
    FROM makt UP TO 5 ROWS
    INTO TABLE itab
   WHERE makt~matnr IN s_matnr.
  MOVE '10999999' TO itab-matnr.
  APPEND itab.
ENDFORM.                    " sub_query_mara
************************************************************************
** Dialog Modules PBO and PAI
************************************************************************
MODULE status_0100 OUTPUT.

  SET PF-STATUS 'SA1'.
  PERFORM sub_create_basic_object.
  PERFORM output_to_excel.
ENDMODULE.                    "status_0100 OUTPUT
*&---------------------------------------------------------------------*
*& Dialog Modules PAI
*&---------------------------------------------------------------------*
MODULE user_command_0100 INPUT.

  save_ok = ok_code.
  CLEAR ok_code.
  CASE save_ok.
    WHEN 'STOP' .
      IF NOT cl_docu_proxy IS INITIAL.
        CALL METHOD cl_docu_proxy->close_document.
        FREE cl_docu_proxy.
      ENDIF.
      IF NOT cl_control IS INITIAL.
        CALL METHOD cl_control->destroy_control.
        FREE cl_control.
      ENDIF.
      LEAVE PROGRAM.
    WHEN 'BACK' .
      IF NOT cl_docu_proxy IS INITIAL.
        CALL METHOD cl_docu_proxy->close_document.
        FREE cl_docu_proxy.
      ENDIF.
      IF NOT cl_control IS INITIAL.
        CALL METHOD cl_control->destroy_control.
        FREE cl_control.
      ENDIF.

      SET SCREEN 0.  " quit the program
      "set screen 1000.
  ENDCASE.
ENDMODULE.                    "USER_COMMAND_0100 INPUT
*&---------------------------------------------------------------------*
*&      Form  SUB_CREATE_BASIC_OBJECT
*&---------------------------------------------------------------------*
*       创建相关的对象
*----------------------------------------------------------------------*
FORM sub_create_basic_object .
  CHECK g_initialized IS INITIAL.

  CALL FUNCTION 'GUI_HAS_ACTIVEX'
    IMPORTING
      return = g_has_activex.
  IF g_has_activex IS INITIAL.
    MESSAGE e007(demoofficeintegratio).
  ENDIF.
* first get the SAP DOI i_oi_container_control interface
  CALL METHOD c_oi_container_control_creator=>get_container_control
    IMPORTING
      control = cl_control
      error   = cl_error.
* check no errors occur
  CALL METHOD cl_error->raise_message
    EXPORTING
      type = 'E'.
* create container
  CREATE OBJECT cl_splitter
    EXPORTING
      parent  = cl_gui_container=>screen0
      rows    = 1
      columns = 1.

  CALL METHOD cl_splitter->set_border
    EXPORTING
      border = cl_gui_cfw=>false.

  cl_container  = cl_splitter->get_container( row = 1 column = 1 ).
* initialize the SAP DOI Container, tell it to run in the container
* specified above and tell it to run Excel in-place
  CALL METHOD cl_control->init_control
    EXPORTING
      r3_application_name      = 'RBasis'
      inplace_enabled          = 'X'
      inplace_scroll_documents = 'X'
      parent                   = cl_container
      register_on_close_event  = 'X'
      register_on_custom_event = 'X'
      no_flush                 = 'X'
    IMPORTING
      error                    = cl_errors.
* save error object in collection
  APPEND cl_errors.
  CALL METHOD cl_gui_cfw=>dispatch.

  wa_doc_signature-prop_name = 'DESCRIPTION'.
  g_app = 'excel'.                                       "
  IF g_app = 'excel'.
    g_docu_type = g_excel.
    wa_doc_signature-prop_value = 'Prop_REPORT'.
  ELSE.
  ENDIF.
  APPEND wa_doc_signature TO gt_doc_signature.
  CREATE OBJECT cl_bds_instance.
  CALL METHOD cl_bds_instance->get_info
    EXPORTING
      classname       = g_classname
      classtype       = g_classtype
      object_key      = g_object_key
    CHANGING
      components      = gt_doc_components
      signature       = gt_doc_signature
    EXCEPTIONS
      nothing_found   = 1
      error_kpro      = 2
      internal_error  = 3
      parameter_error = 4
      not_authorized  = 5
      not_allowed     = 6.

  CALL METHOD cl_bds_instance->get_with_url
    EXPORTING
      classname  = g_classname
      classtype  = g_classtype
      object_key = g_object_key
    CHANGING
      uris       = gt_doc_uris
      signature  = gt_doc_signature.

  FREE cl_bds_instance.
* ask the SAP DOI container for a i_oi_document_proxy for Excel
  CALL METHOD cl_control->get_document_proxy
    EXPORTING
      document_type  = 'Excel.Sheet'
      no_flush       = 'X'
*     REGISTER_CONTAINER = 'X'
    IMPORTING
      document_proxy = cl_docu_proxy
      error          = cl_errors.
  APPEND cl_errors.
* open a document saved in business document service.
*  READ TABLE doc_uris INTO wa_doc_uris INDEX 1.
  LOOP AT gt_doc_uris INTO wa_doc_uris.
    g_url = wa_doc_uris-uri.
  ENDLOOP.

  CALL METHOD cl_docu_proxy->open_document
    EXPORTING
      open_inplace = 'X'
*     NO_FLUSH     = 'X'
      document_url = g_url
    IMPORTING
      error        = cl_errors.

  DATA: has TYPE i.
  CALL METHOD cl_docu_proxy->has_spreadsheet_interface
    EXPORTING
      no_flush     = 'X'
    IMPORTING
      is_available = has
      error        = cl_errors.
  APPEND cl_errors.

  CALL METHOD cl_docu_proxy->get_spreadsheet_interface
    EXPORTING
      no_flush        = 'X'
    IMPORTING
      sheet_interface = cl_spreadsheet
      error           = cl_errors.
  APPEND cl_errors.
* Activate  sheet 1

  DATA: g_def_active_sheetname(50) VALUE 'Sheet1'.

  CALL METHOD cl_spreadsheet->select_sheet
    EXPORTING
      name     = g_def_active_sheetname
      no_flush = ''
    IMPORTING
      error    = cl_errors.
  APPEND cl_errors.
  LOOP AT cl_errors.
    CALL METHOD cl_errors->raise_message
      EXPORTING
        type = 'E'.
  ENDLOOP.
  FREE cl_errors.
  g_initialized = 'X'.
ENDFORM.                    " FRM_CREATE_BASIC_OBJECT
*&---------------------------------------------------------------------*
*&      Form  SUB_SET_CELL
*&---------------------------------------------------------------------*
*       根据数据设置 EXCEL 表的属性
*----------------------------------------------------------------------*
FORM fill_cell  USING i j val..
  DATA: columns_number TYPE i,
        rows_number    TYPE i.

  columns_number = 1.
  rows_number = 1.

  CALL METHOD cl_spreadsheet->insert_range_dim
    EXPORTING
      name     = 'cell'
      no_flush = 'X'
      top      = i
      left     = j
      rows     = rows_number
      columns  = columns_number
    IMPORTING
      error    = cl_errors.
  APPEND cl_errors.

  REFRESH: gt_ranges, gt_excel_input.
  wa_rangeitem-name = 'cell'.
  wa_rangeitem-columns = 1.
  wa_rangeitem-rows = 1.
  APPEND wa_rangeitem TO gt_ranges.

  wa_excel_input-column = 1.
  wa_excel_input-row = 1.
  wa_excel_input-value = val.
  APPEND wa_excel_input TO gt_excel_input.

* set data
  CALL METHOD cl_spreadsheet->set_ranges_data
    EXPORTING
      ranges   = gt_ranges
      contents = gt_excel_input
      no_flush = 'X'
    IMPORTING
      error    = cl_errors.
  APPEND cl_errors.
*  set FRAME.
  CALL METHOD cl_spreadsheet->set_frame
    EXPORTING
      rangename = 'cell'
      typ       = '127'
      color     = '1'
      no_flush  = 'X'
    IMPORTING
      error     = cl_errors.
* ??
  CALL METHOD cl_spreadsheet->fit_widest
    EXPORTING
      name     = space
      no_flush = 'X'.

  REFRESH: gt_ranges, gt_excel_input.
ENDFORM.                    " SUB_SET_CELL

*&---------------------------------------------------------------------*
*&      Form  sub_process_excel
*&---------------------------------------------------------------------*
*       处理结果内表
*----------------------------------------------------------------------*
FORM output_to_excel .
  DATA num TYPE i VALUE 1.
*&test info
  PERFORM fill_cell USING 3 1 'May 2012'.
  PERFORM fill_cell USING 3 2 'July 2012'.

  LOOP AT itab.
    num = 3 + sy-tabix.
    PERFORM fill_cell USING num 1 itab-matnr.
    PERFORM fill_cell USING num 2 itab-maktx.
    PERFORM fill_cell USING num 3 itab-maktg.

  ENDLOOP.
*&test info
  PERFORM fill_cell USING 15 1 '轿车'.
  PERFORM fill_cell USING 16 1 '卡车'.
  PERFORM fill_cell USING 17 1 '自行车'.
  PERFORM fill_cell USING 15 2 '67'.
  PERFORM fill_cell USING 16 2 '89'.
  PERFORM fill_cell USING 17 2 '12'.

* change the name of worksheet "sheet1"
  CALL METHOD cl_spreadsheet->set_sheet_name
    EXPORTING
      newname = '物料主数据清单'
      oldname = 'Sheet1'
    IMPORTING
      error   = cl_errors.
* activate worksheet
  CALL METHOD cl_spreadsheet->select_sheet
    EXPORTING
      name  = 'Sheet2'
    IMPORTING
      error = cl_errors.
  APPEND cl_errors.
* run macro
  CALL METHOD cl_docu_proxy->execute_macro
    EXPORTING
*     SCRIPT_NAME  = 'test1'
      macro_string = '模块1.test1'
*     param1       = ''
*     param_count  = 1
    IMPORTING
      error        = cl_errors.

ENDFORM.                    " sub_process_excel

*CALL METHOD spreadsheet->set_format_string
*EXPORTING rangename = rangename
*formatstring = formatstring
*no_flush = no_flush
*IMPORTING error = error
*retcode = retcode.
*
*formatstring = '0.00_ ;[红色]-0.00'
*or  formatstring = '0.00_ ;[RED]-0.00'

ABAP是一种SAP系统的编程语言,SAP DOI(Document Object Infrastructure)是SAP系统的一个组件,用于处理文档对象。其中,I_OI_SPREADSHEET接口可用于读取和写入Excel电子表格数据。 以下是使用I_OI_SPREADSHEET接口读取Excel数据的简单示例: ``` DATA: lr_spreadsheet TYPE REF TO i_oi_spreadsheet, lr_worksheet TYPE REF TO i_oi_spreadsheet_worksheet, lr_cell TYPE REF TO i_oi_spreadsheet_cell, lv_value TYPE string. * 创建电子表格对象 CREATE OBJECT lr_spreadsheet TYPE cl_oi_spreadsheet. * 打开Excel文件 lr_spreadsheet->open_file( 'C:\data\example.xlsx' ). * 获取第一个工作表 lr_worksheet = lr_spreadsheet->get_worksheet( 1 ). * 逐个读取单元格数据 DO 10 TIMES. lr_cell = lr_worksheet->get_cell( sy-index, 1 ). IF lr_cell IS BOUND. lv_value = lr_cell->get_value( ). WRITE: / lv_value. ENDIF. ENDDO. ``` 以上代码会逐行读取Excel文件的第一个工作表的第一列数据,并输出到屏幕上。 如果希望写入Excel数据,可以使用类似以下的代码: ``` DATA: lr_spreadsheet TYPE REF TO i_oi_spreadsheet, lr_worksheet TYPE REF TO i_oi_spreadsheet_worksheet, lr_cell TYPE REF TO i_oi_spreadsheet_cell. * 创建电子表格对象 CREATE OBJECT lr_spreadsheet TYPE cl_oi_spreadsheet. * 打开Excel文件 lr_spreadsheet->open_file( 'C:\data\example.xlsx' ). * 获取第一个工作表 lr_worksheet = lr_spreadsheet->get_worksheet( 1 ). * 写入数据到单元格 lr_cell = lr_worksheet->get_cell( 1, 1 ). IF lr_cell IS BOUND. lr_cell->set_value( 'Hello World!' ). ENDIF. * 保存Excel文件 lr_spreadsheet->save( ). ``` 以上代码会将字符串“Hello World!”写入Excel文件的第一个工作表的第一个单元格,并保存文件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值