写点什么

使用 ABAP 操作 Excel 的几种方法

作者:Jerry Wang
  • 2022 年 6 月 28 日
  • 本文字数:2017 字

    阅读完需:约 7 分钟

使用 ABAP 操作 Excel 的几种方法

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


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



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


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



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


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


所有由 ABAP 控制的应用程序都必须输入到 ABAP 开发工作台的 TOLE 表中。 为了维护表 TOLE,使用事物码 SOLE:

  • TOLE(OLE 应用程序)的键在 CREATE 语句中用作对象类名。 每个条目都包含生成 OLE 对象所需的所有信息。

  • Typeinfo 描述了特定应用程序可以处理的所有对象,包括它的所有方法、属性和参数。


双击上图某一行,进入明细页面:


  • 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:



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



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


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



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



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



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


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



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


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



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



上述代码的简要说明:


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


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


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



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




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


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



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



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



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



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

总结

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


发布于: 刚刚阅读数: 3
用户头像

Jerry Wang

关注

🏆InfoQ写作平台-签约作者🏆 2017.12.03 加入

SAP成都研究院开发专家,SAP社区导师,SAP中国技术大使。2007 年从电子科技大学计算机专业硕士毕业后加入 SAP 成都研究院工作至今。工作中使用 ABAP, Java, JavaScript 和 TypeScript 进行开发。

评论

发布
暂无评论
使用 ABAP 操作 Excel 的几种方法_microsoft_Jerry Wang_InfoQ写作社区