IT干货网

ABAP DOI详解(1)

shasha 2022年03月20日 SAP 1153 0

什么是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. 
 
 
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

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

获取container

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

form get_container. 
  gr_container = gr_container = cl_gui_container=>screen0. 
endform.                    "get_container 
 
 
  
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

创建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.    
 
 
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

代码比较直观,不多说。

创建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 
 
 
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

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. 
 
 
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

注意第一句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. 
 
 
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55


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


评论关闭
IT干货网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!