ABAP DOI详解(1)
什么是DOI
DOI是Desktop Office Integration
的缩写,,是SAP提供的解决与Office集成的开发技术。早期SAP用于解决Office集成,使用的是OLE技术。OLE有两个比较大的缺点,一是语法参照VBA,在ABAP中使用各种VBA的方法(method),语法的友好性差;二是数据写入到Excel中,速度特别慢,慢得难以接受。
DOI是SAP提供的OLE的替代品,用面向对象的方式实现。很好的解决了上面所说的两个问题。
请参考:Desktop Office Integration官方帮助
DOI开发的要点
涉及的关对象
SAP和Office集成,可以通过代码创建Excel文档,也可以将Excel模板文档放在应用程序服务器上。DOI打开这个文档,然后对文档进行操作。我们先介绍创建Excel文档的方式。
为了操作Excel文档,至少需要四个对象:
-
container: 存放excel电子表格(spreadsheet)的容器。这个开发人员应该比较容易理解,展示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
如果读取服务器上的文档模板,需要cl_bds_document_set
类:
-
business document set: bds是
business document set
的缩写。business document set用于管理后续要操作的文档,可以包含一个或多个文档。
DOI操作文档的步骤
- 获取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 = gr_container = cl_gui_container=>screen0.
endform. "get_container
创建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文档以及获取模板文档放在下一节,以降低学习和理解的难度。