使用ABAP操作Excel的几种方法
这篇文章本来不在我计划之内,因为最近一个朋友微信上问到我这个问题,但我平时在SAP研究院工作中从没遇到过需要用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里。
你也许会问,我咋知道Excel里有哪些公有的类和方法可以被ABAP调用呢?
在Excel里点击右键,选择:
打开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年的照片:
关于OLE,Jerry知道的就这么点了,在SAP研究院里如今我们还是会和微软的技术打交道,比如微软的Azure.
如果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文档的。
希望这些内容对大家有用,感谢阅读。
更多阅读
要获取更多Jerry的原创文章,请关注公众号"汪子熙":
使用ABAP操作Excel的几种方法的更多相关文章
- .NET导出Excel的四种方法及评测
.NET导出Excel的四种方法及评测 导出Excel是.NET的常见需求,开源社区.市场上,都提供了不少各式各样的Excel操作相关包.本文,我将使用NPOI.EPPlus.OpenXML.Aspo ...
- [转帖].NET导出Excel的四种方法及评测
.NET导出Excel的四种方法及评测 https://www.cnblogs.com/sdflysha/p/20190824-dotnet-excel-compare.html 导出Excel是.N ...
- Linux 下操作GPIO(两种方法,驱动和mmap)(转载)
目前我所知道的在Linux下操作GPIO有两种方法: 1.编写驱动,这当然要熟悉Linux下驱动的编写方法和技巧,在驱动里可以使用ioremap函数获得GPIO物理基地址指针,然后使用这个指针根据io ...
- .net(C#)操作文件的几种方法汇总
.net(C#)操作文件的几种方法汇总 System.IO命名空间下类的用法:在System.IO名称空间中包含了用于文件输入输出的主要类.File:实用类,提供许多静态方法,用于移动.复制和删除文件 ...
- Linux 下操作gpio(两种方法,驱动和mmap)
目前我所知道的在linux下操作GPIO有两种方法: 1. 编写驱动,这当然要熟悉linux下驱动的编写方法和技巧,在驱动里可以使用ioremap函数获得GPIO物理基地址指针,然后使用这个指针根据 ...
- IO流----操作文件的9种方法代码实现
IO流----操作文件的9种方法代码实现: 1:使用字节流读写数据: 四种方式: method1: 每次读写一个字节,边读边写: /* * 复制文本文件. * * 数据源:从哪里来 ...
- delphi 导出到excel的7种方法
本文来自 爱好者8888 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/kpc2000/article/details/17066823?utm_source=cop ...
- Delphi 导出数据至Excel的7种方法【转】
一; delphi 快速导出excel uses ComObj,clipbrd; function ToExcel(sfilename:string; ADOQuery:TADOQuery): ...
- Shell脚本中执行sql语句操作mysql的5种方法【转】
对于自动化运维,诸如备份恢复之类的,DBA经常需要将SQL语句封装到shell脚本.本文描述了在Linux环境下mysql数据库中,shell脚本下调用sql语句的几种方法,供大家参考.对于脚本输出的 ...
随机推荐
- [原]使用global mapper 修改影像数据DOM的投影变换(将数据转换成osgearth支持的投影)
osgearth默认使用的投影基准面为: Geographic(Latitude/Longitude)的 WGS84 有这样一份数据需要修改: 1.在菜单栏种选择“工具”---->“配置” 2. ...
- CentOS7下NFS服务安装及配置固定端口
CentOS7下NFS服务安装及配置 系统环境:CentOS Linux release 7.4.1708 (Core) 3.10.0-693.el7.x86_64 软件版本:nfs-utils-1. ...
- (转)react 项目构建
原文:https://segmentfault.com/a/1190000016342792 写在前面 每次构建react项目的时候都会配置一大堆东西,时间久了就会忘记怎么配置.为了方便自己记忆也为了 ...
- SDN实验---Mininet实验(模拟多数据中心带宽实验)
补充:NameError: name 'buffer' is not defined >>> import sys >>> ,): ... buffer = mem ...
- CentOS上安装配置RabbitMQ Server
1. 安装Erlang 由于rabbitmq是基于erlang语言开发的,所以必须先安装erlang. curl -s https://packagecloud.io/install/reposito ...
- Office2019 Word 新建文档豆沙绿背景色失效零时解决方案
如果只针对Word的话,可以尝试在开发者选项卡中新建一个宏,复制下面的内容进行运行: Sub WritingLayout() ActiveDocument.Background.Fill.Visibl ...
- jsp标签${fn:contains()}遇到问题记录
在jsp页面要实现这样一个功能,列表的某一列字段要显示的数据,是从后台的一个列表中获取的,数据库里面该列存储的方式是 类似 1,2,3 这样的 主键id数据.显示的时候要根据id显示名称,如果是多个 ...
- linux驱动开发学习二:创建一个阻塞型的字符设备
在Linux 驱动程序中,可以使用等待队列来实现阻塞进程的唤醒.等待队列的头部定义如下,是一个双向列表. struct list_head { struct list_head *next, *pre ...
- 基于Livy的Spark提交平台搭建与开发
为了方便使用Spark的同学提交任务以及加强任务管理等原因,经调研采用Livy比较靠谱,下图大致罗列一下几种提交平台的差别. 本文会以基于mac的单机环境搭建一套Spark+Livy+Hadoop来展 ...
- 我瞅瞅源码系列之---flask
快速使用 通过werkzurg 了解wsgi threading.local和高级 LocalStack和Local对象实现栈的管理 Flask源码之:配置加载 Flask源码之:路由加载 ...