什么是 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 用于管理要操作的文档,可以包含一个或多个文档。
- 获取 container
- 创建 container control 对象实例
- 创建 document proxy 对象的实例
- 打开一个服务器上的模板文档或新建一个新的 Excel 文档
- 操作打开的 Excel 文档,设置 Excel 相关属性或调用相关方法
- 退出时关闭 Excel 文档,释放资源
定义公共变量
* 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_control
的 init_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 文档以及获取模板文档放在下一节,以降低学习和理解的难度。