ABAP|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 【ABAP|ABAP DOI详解(1)】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 必须,否则不能创建屏幕。
完整代码
reportzdoi_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_containerform 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_controlform 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_documentform main. skip 1.perform get_container. perform create_container_control. perform create_excel_document. endform.

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

    推荐阅读