ABAP DOI详解(1)

什么是 DOI?

DOI 是Desktop Office Integration的缩写,是 SAP 提供的解决与 Office 集成的技术方案。早期 SAP 用 OLE 技术解决 与 Office 集成。OLE 语法参照 VBA,在 ABAP 中调用方法来操作 Excel,语法的友好性差;另外将数据从ABAP 内表写入到 Excel ,速度特别慢,性能难以接受。

DOI 可以看作 OLE 的替代品,用面向对象的方式实现。很好的解决了上面所说的两个问题。(参考:Desktop Office Integration官方帮助)

DOI 开发的技术要点

相关对象

SAP 与 Office 集成,既可以通过代码创建 Excel 文档,也可以将 Excel 模板文档放在应用程序服务器上由 DOI 调用,DOI 打开这个文档,对文档进行操作和处理。我们先介绍代码创建 Excel 文档的方式。为了操作 Excel 文档,至少需要四个对象:

  • container: 存放 Excel 电子表格 (spreadsheet) 的容器。这个应该比较容易理解,容器一般在 dialog screen 中定义,也可以直接使用 ABAP 程序中默认的 screen(即 screen 号码为 1000 的屏幕)

  • container control: 容器中用于创建和管理其他 Office 集成所需要的对象,container control 是一个接口,类型为 i_oi_container_control

  • document proxy: 每一个 document proxy 的实例代表用 office application 打开的文档,可以是 Excel,也可以是 Word,如果想打开多个文档,需要定义多个实例。document proxy 是一个接口,类型为 i_oi_document_proxy

  • spreadsheet: spreadsheet 接口,代表最终要操作的 Excel文档,spreadhseet 的类型是 i_oi_spreadsheet

  • business document set: 如果读取服务器上的文档模板,用 cl_bds_document_set 类,将business document set缩写为 bds,bds 用于管理要操作的文档,可以包含一个或多个文档。

DOI 操作 Excel 的步骤

  • 获取 container
  • 创建 container control 对象实例
  • 创建 document proxy 对象的实例
  • 打开一个服务器上的模板文档或新建一个新的 Excel 文档
  • 操作打开的 Excel 文档,设置 Excel 相关属性或调用相关方法
  • 退出时关闭 Excel 文档,释放资源

我们的第一个例子,不使用 dialog screen,新建一个 Excel 文档,在屏幕 1000 中显示。以下是开发步骤:

定义公共变量

* desktop office integration interface
data: gr_container type ref to cl_gui_container,
      gr_control type ref to i_oi_container_control,
      gr_document type ref to i_oi_document_proxy,
      gr_spreadsheet type ref to i_oi_spreadsheet.

这些就是我们前面提到的四个必须的对象。

获取container

cl_gui_container 类的静态方法 screen0 获取屏幕 1000,并赋值给 gr_container。

form get_container.
  gr_container = cl_gui_container=>screen0.
endform.  

创建 container control 对象实例并初始化

代码比较直观,不多解释。

form create_container_control.
* create container control
  call method c_oi_container_control_creator=>get_container_control
    importing
      control = gr_control.

* initialize control
  call method gr_control->init_control
    exporting
      inplace_enabled          = 'X '
      inplace_scroll_documents = 'X'
      register_on_close_event  = 'X'
      register_on_custom_event = 'X'
      r3_application_name      = 'DOI demo by Stone Wang'
      parent                   = gr_container.
endform.   

创建 document proxy 对象的实例

form create_excel_document.
  call method gr_control->get_document_proxy
    exporting
      document_type  = 'Excel.Sheet'
      no_flush       = 'X'
    importing
      document_proxy = gr_document.

  call method gr_document->create_document
    exporting
      document_title = 'DOI test by Stone Wang '
      no_flush       = 'X '
      open_inplace   = 'X'.
endform.                    "create_excel_document

open_inplace 参数控制 Excel 文档是独立显示还是在 SAP GUI 中嵌入显示。如果嵌入式显示,gr_controlinit_control 方法中,inplace_enabled 参数要设为 X

将以上代码综合在一起:

form main.
  skip 1.

  perform get_container.
  perform create_container_control.
  perform create_excel_document.
endform.

注意第一句 skip 1 必须,否则不能创建屏幕。

完整代码

report  zdoi_hello.

type-pools: soi.

data: gr_container type ref to cl_gui_container,
      gr_control type ref to i_oi_container_control,
      gr_document type ref to i_oi_document_proxy,
      gr_spreadsheet type ref to i_oi_spreadsheet.

start-of-selection.
  perform main.

form get_container.
  gr_container = gr_container = cl_gui_container=>screen0.
endform.                    "get_container

form create_container_control.
* create container control
  call method c_oi_container_control_creator=>get_container_control
    importing
      control = gr_control.

* initialize control
  call method gr_control->init_control
    exporting
      inplace_enabled          = 'X '
      inplace_scroll_documents = 'X'
      register_on_close_event  = 'X'
      register_on_custom_event = 'X'
      r3_application_name      = 'DOI demo by Stone Wang'
      parent                   = gr_container.
endform.                    "create_container_control

form create_excel_document.
  call method gr_control->get_document_proxy
    exporting
      document_type  = 'Excel.Sheet'
      no_flush       = 'X'
    importing
      document_proxy = gr_document.

  call method gr_document->create_document
    exporting
      document_title = 'DOI test by Stone Wang '
      no_flush       = 'X '
      open_inplace   = 'X'.
endform.                    "create_excel_document

form main.
  skip 1.

  perform get_container.
  perform create_container_control.
  perform create_excel_document.
endform.

操作 Excel 文档以及获取模板文档放在下一节,以降低学习和理解的难度。

你可能感兴趣的:(ABAP DOI详解(1))