SAP ABAP里提供了一个标准的类CL_DOCX_DOCUMENT,提供了本地以".docx"结尾的微软Office word文档的读和写操作。

本文介绍了ABAP类CL_DOCX_DOCUMENT的简单用法。

Office OpenXML

从微软 Office2007开始, 当我们新建一个word文档时,其扩展名从“.doc"变为了".docx",后者是基上遵循了一个开源的规范:Office openXML格式。

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

我们把这个文档保存到本地,将其扩展名从.docx改成.zip, 然后双击,就可以用解压软件比如winrar打开。

于是发现这一个最简单的word文档实际上由如此多的xml和文件夹构成。

使用CL_DOCX_DOCUMENT读取word文件内容

示例代码如下:

DATA: lv_content TYPE xstring,

lo_document TYPE REF TO cl_docx_document.

PERFORM get_doc_binary USING 'C:Usersi042416Desktop est.docx' CHANGING lv_content.

lo_document = cl_docx_document=>load_document( lv_content ).

CHECK lo_document IS NOT INITIAL.

DATA(lo_core_part) = lo_document->get_corepropertiespart( ).

DATA(lv_core_data) = lo_core_part->get_data( ).

DATA(lo_main_part) = lo_document->get_maindocumentpart( ).

DATA(lo_image_parts) = lo_main_part->get_imageparts( ).

DATA(lv_image_count) = lo_image_parts->get_count( ).

DO lv_image_count TIMES.

DATA(lo_image_part) = lo_image_parts->get_part( sy-index - 1 ).

DATA(lv_image_data) = lo_image_part->get_data( ).

ENDDO.

DATA(lo_header_parts) = lo_main_part->get_headerparts( ).

DATA(lv_header_count) = lo_header_parts->get_count( ).

DO lv_header_count TIMES.

DATA(lo_header_part) = lo_header_parts->get_part( sy-index - 1 ).

DATA(lv_header_data) = lo_header_part->get_data( ).

ENDDO.

上述代码的简要说明

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返回。

同样的思路,微软Office 2007之后版本的其他格式的办公文档,比如Powerpoint和Excel等,均遵循Office OpenXML标准,因此将其后缀名改为.zip后同样可以看到大量xml和文件夹。ABAP也同样提供了标准代码来读写这些Office文档,例如CL_PPTX_DOCUMENT, CL_XLSX_DOCUMENT等等,如下图所示。

要获取更多Jerry的原创技术文章,请关注公众号"汪子熙"或者扫描下面二维码:

使用ABAP编程实现对微软Office Word文档的操作的更多相关文章

  1. 新建 Microsoft Office Word 文档 来源:牛客网

    题目 链接:https://ac.nowcoder.com/acm/contest/28886/1015 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其 ...

  2. 用注册表清除Office Word文档杀手病毒

    不久前,笔者打开word文件时遇到了一件离奇的怪事,常用的Word文件怎么也打不开,总是出现提示框:"版本冲突:无法打开高版本的word文档".再仔细查看,文件夹里竟然有两个名字一 ...

  3. [办公应用]我的WORD文档表格操作不灵活 无法调整列宽

    最近同事的一个word文档中的表格操作非常不灵活,用鼠标直接调整列宽时总觉得很不灵活.她的操作系统为XP,office 为微软office 2003. 我首先检查了木马,检查了输入法等,结果都没有问题 ...

  4. 利用Aspose.Word控件实现Word文档的操作

    Aspose系列的控件,功能都挺好,之前一直在我的Winform开发框架中用Aspose.Cell来做报表输出,可以实现多样化的报表设计及输出,由于一般输出的内容比较正规化或者多数是表格居多,所以一般 ...

  5. 黄聪:利用Aspose.Word控件实现Word文档的操作(转)

    撰写人:伍华聪  http://www.iqidi.com  Aspose系列的控件,功能都挺好,之前一直在我的Winform开发框架中用Aspose.Cell来做报表输出,可以实现多样化的报表设计及 ...

  6. c# word文档的操作

    参考https://blog.csdn.net/ruby97/article/details/7406806 Word对象模型  (.Net Perspective) 本文主要针对在Visual St ...

  7. c#写word文档基础操作(自己控制样式)

    下面一个函数,建立一个Word 文档,添加页眉.页脚,在内容中两个不同字体的Hello!!!   来自 <http://bbs.csdn.net/topics/340041961> pub ...

  8. java对word文档的操作(提取标题和内容等)-直接操作或poi工具包或freemarker+xml或html转word

    1,java自带工具包实现对word的排版和写入 import java.awt.Color; import java.io.FileNotFoundException; import java.io ...

  9. XWPFDocument创建和读取Office Word文档基础篇(一)

    注:有不正确的地方还望大神能够指出,抱拳了 老铁!   参考API:http://poi.apache.org/apidocs/org/apache/poi/xwpf/usermodel/XWPFDo ...

随机推荐

  1. Hadoop2 使用 YARN 运行 MapReduce 的过程源码分析

    Hadoop 使用 YARN 运行 MapReduce 的过程如下图所示: 总共分为11步. 这里以 WordCount 为例, 我们在客户端终端提交作业: # 把本地的 /home/hadoop/t ...

  2. PLSQL导入导出oracle表 表空间

    PLSQL导入导出表的正确步骤 原来总是直接 tools->import talbes->Oracle Import结果发现有的时候会出错:有的表不能正确导入, baidu+googel解 ...

  3. CSproject文件总是在Solution中被修改PROJECT GUID问题

    1.情况: 打开2个Solution 一个是client,一个是server 他们会互相修改GUID,切换solution的时候都会显示 xxxxx已经被外部修改云云 2.原因: 一般是在其中一个So ...

  4. SpringBoot2.0 整合 QuartJob ,实现定时器实时管理

    一.QuartJob简介 1.一句话描述 Quartz是一个完全由java编写的开源作业调度框架,形式简易,功能强大. 2.核心API (1).Scheduler 代表一个 Quartz 的独立运行容 ...

  5. 当项目只有src文件和web文件时eclipse如何导入javaweb工程

    原理是:利用工具生成class文件,并且在过程中检查出错误,生成对应的编译后文件,这样才能在tomcat等服务器上跑,服务器上只能跑编译后的文件. 1. 2. 3. . 4. 5. 6. 7.

  6. bzoj3427:[POI2013]BAJ-Bytecomputer

    传送门 很显然有一个结论:最大不过1,最小不过-1 然后dp,设\(f[i][j]\)为满足前\(i\)个不下降,当前放的是\(j-2\),转移就比较好想了 具体方程看代码吧,终于有一个自己会写的题了 ...

  7. Tomcat - 怎么控制某个类或者包下的日志打印级别

    问题与分析 Tomcat是使用自己的日志实现tomcat-juli.jar来打印日志信息的,日志会被打印到catalina.out里,除去你在项目里自己使用的日志框架外,由System.out,Sys ...

  8. C# 面向对象之封装

    封装是指将类的内部数据隐藏起来不让对象实例直接对其操作,C#中提供了属性机制来对类内部的状态进行操作. 在C#中封装可以通过public.private.protected和internal等关键字来 ...

  9. UVA11292(排序贪心)

    笔者休息娱乐. ; int n, m, a; ll solve(int n, int m) { ll ans = ; priority_queue<int, vector<int>, ...

  10. python之生成器(~函数,列表推导式,生成器表达式)

    一.生成器 概念:生成器的是实质就是迭代器 1.生成器的贴点和迭代器一样,取值方式也和迭代器一样. 2.生成器一般由生成器函数或者声称其表达式来创建,生成器其实就是手写的迭代器. 3.在python中 ...