当前位置:网站首页>使用 ABAP 操作 Excel 的几种方法

使用 ABAP 操作 Excel 的几种方法

2022-06-28 09:56:00 InfoQ

用ABAP操作Excel这个需求算是比较常见,所以 Jerry 希望这篇文章能起到抛砖引玉的效果,在这个话题上有多年工作经验的朋友们,欢迎留言,指出Jerry文章中不足或者错误之处。

在SAPGUI里根据关键字OLE搜索,能找到通过ABAP操作Excel的一种办法:

null
这段文档说的比较清楚,微软的Word和Excel这种Office应用,提供了一种所谓automation的接口,暴露的公有类的方法和属性可以被其他应用消费。

作为ABAP应用开发人员,我们通过调用OLE对象的方法CALL METHOD, GET PROPERTY,SET PROPERTY等来访问微软Word和Excel的automation接口,代码看起来像这样:

null
上面这个函数RH_START_EXCEL_DATA_OLE调用微软Excel的automation接口,新建一个Excel workbook,然后准备把ABAP内表里的数据写到Excel里。

ABAP 编程语言支持 OLE2 自动化技术。 因此,开发人员可以从 ABAP 系统调用支持 OLE2 的桌面应用程序。在 ABAP 同 Office 软件集成的场景中,Microsoft Excel 或 Microsoft Word 等桌面应用程序,实际上充当了 OLE2 服务器端的角色。交互架构如下图所示:

null
所有由 ABAP 控制的应用程序都必须输入到 ABAP 开发工作台的 TOLE 表中。 为了维护表 TOLE,使用事物码 SOLE:
null
  • TOLE(OLE 应用程序)的键在 CREATE 语句中用作对象类名。 每个条目都包含生成 OLE 对象所需的所有信息。
  • Typeinfo 描述了特定应用程序可以处理的所有对象,包括它的所有方法、属性和参数。

双击上图某一行,进入明细页面:
null
  • OLE Application:应用程序名称,确定生成对象时的对象类。
  • CLSID:在演示主机上的注册数据库中指定的字符格式的 OLE 类标识。在交互场景中,CLSID 号码被发送到前端。
  • CLSID LibType:字符格式的 OLE 类 ID。OLE 应用程序的类型库部分具有自己的 CLSID。
  • OLE object name:创建的第一个 OLE 对象的名称。此字段仅在对象浏览器中使用。
  • Type Info Key:OLE 应用程序的 Typeinfo 的键。在此键下,类型信息存储在数据库中。 NO_TYPELIB 表示不需要为此应用程序使用 typeinfo。

你也许会问,我咋知道Excel里有哪些公有的类和方法可以被ABAP调用呢?

在Excel里点击右键,选择View Code:

null
打开Microsoft Visual Basic Object Brower,所有可用的类和方法都列在这里了,上面ABAP代码第218行调用的workbook的open方法在列表里也能找到。

null
这个解决方案只在windows平台有效,并且需要运行SAPGUI的Presentation Server上安装有微软的Excel应用。

我们采用OLE的方式操作Excel时,打开Windows操作系统的任务管理器,会发现一个以/automation -Embedding参数启动的Excel进程。

null
这里的-Embedding参数,来自OLE的全称:Object Linking and Embedding里的一部分。OLE是微软的一项非常古老的技术了。

null
微软和SAP两位大佬,Bill Gates和Hasso Plattner 1993年的照片:

null



如果Jerry没记错的话, 微软Office从2007版本开始, 采用新的支持Office Open XML标准的格式来管理Excel和Word等文件。Jerry 2014年在SAP成都研究院CRM开发团队负责CRM Document Builder这个模块,当时编写过使用ABAP操作Word文档的代码。

以Word为例,下图是我创建了一个最简单的Word文档,包含了一个Header区域,一个由三行彩色文字组成的段落,还有一张图片。

null
我们把这个Word文档的扩展名从.docx改成.zip, 然后双击,就可以用解压软件比如winrar打开。

于是发现这一个最简单的按照Office Open XML协议实现的Word文档,实际上由如此多的xml和文件夹构成。

null
使用SAP标准的类CL_DOCX_DOCUMENT读取Word文件内容:

null
上述代码的简要说明:

(1) 将word文档的二进制内容传入方法cl_docx_document=>load_document,得到一个文档对象引用,然后就可以借助该对象引用调用各种方法了。

(2) word文档的创建者,创建时间,最后修改时间等信息都存储在所谓的“Core property part”内,可以通过方法lo_document->get_corepropertiespart获得"Core property part"的引用,再使用该引用调用方法get_data获得实际内容。

下图是get_data返回的内容的一个例子,可以看出是xml格式。

null
(3) 现在我们准备读取Word文档的正文了。使用方法lo_document->get_maindocumentpart得到Word文档正文,文字的字体类型,颜色也包含在内。如下图所示:

null
null
(4) Word文档里插入的图片的二进制内容当然也是可以读取出来的。使用方法:lo_image_parts->get_part返回。

Excel的例子我没有动手做过,不过原理类似,大家可以用开发包S_OOXML_CORE里的CL_XLSX_DOCUMENT来操作格式为xlsx的Excel文档。

null
除此之外,还有一个著名的开源项目,
abap2xlsx
, Jerry没有试过,感兴趣的朋友可以试试。

null
最后,大家在SE24里使用关键字XSLX以及SE38里搜索_OLE,

null
可以从搜索列表里选一些点进去,参考SAP标准程序是如何操作Excel文档的。

null
希望这些内容对大家有用,感谢阅读。

总结

本文首先介绍了 SAP ABAP 应用同微软 Office 应用程序比如 Excel 交互场景的工作原理和技术架构,接着分享了在 ABAP Presentation 服务器上使用事物码 SOLE 进行服务注册的配置步骤,最后给出了 ABAP 应用通过 OLE2 接口同 Excel 应用交互的源代码。

原网站

版权声明
本文为[InfoQ]所创,转载请带上原文链接,感谢
https://xie.infoq.cn/article/ffc906d907827fc26893dbe07