美文网首页ABAP
ABAP DOI详解(1)

ABAP DOI详解(1)

作者: Stone0823 | 来源:发表于2016-12-16 14:17 被阅读821次

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

相关文章

  • ABAP DOI详解(1)

    什么是DOI DOI是Desktop Office Integration的缩写,,是SAP提供的解决与Offic...

  • ABAP DOI详解(2)

    我们之所以用Excel输出,主要是想用Excel在显示中的优势,所以最常见的做法,往往调用Excel模板文件来实现...

  • ABAP DOI详解(3)

    这一篇解决上一篇的几个遗留问题: 如何根据屏幕大小让 Excel 自适应 Excel 单个单元格写入 设置 Exc...

  • SAP ABAP语法基础

    ABAP语法基础 一、ABAP语法结构 1.每条ABAP语句均以关键字开头,以实心句号(.)结束;2.ABAP的格...

  • 肺癌-上皮细胞分类以及markers

    文献来源 doi: https://doi.org/10.1101/742320[https://doi.org/...

  • Fiori-like Prototype ( SAP Cloud

    SAP Cloud Platform - ABAP Environment. ABAP ABAP Getting ...

  • ABAP-ALV-LVC

    教程 下面这个列出了区别,很实用,跟着这个一点点把grid改成了lvc:ABAP的ALV详解,内含GRID和LVC...

  • Fiori-like Prototype ( ABAP Prog

    ABAP Programming on HANA Training - Course Content Day 1....

  • ABAP的Package interface, 安卓的manif

    ABAP 事务码SE21创建ABAP包接口。这是ABAP基于包层面的访问控制实现逻辑。包里可以存储很多ABAP对象...

  • SAP ABAP基本语法

    ABAP基本语法 基本语法.01-语句 ABAP源程序由注释和ABAP语句组成。 ABAP中的每个语句都以关键字开...

网友评论

    本文标题:ABAP DOI详解(1)

    本文链接:https://www.haomeiwen.com/subject/ycjnmttx.html