什么是 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_control
的 init_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 文档以及获取模板文档放在下一节,以降低学习和理解的难度。