1、带你一起拥有docx4j

docx4j
placeholder image
admin 发布于:2018-10-13 18:15:22
阅读:loading

docx4j是什么?

docx4j是一个用于创建和cao作Word(docx)、PPT(pptx)和Excel(xlsx)文件的Java类库。为什么这些全部是带x的版本呢,因为office2007的版本(后),改写了文件的实现,它们都是由一些xml组成的,最初知道这一点要追溯到2013(4)年从欢乐哥那里知道的,也是无意中的了解,给我演示了一下使用zip解压缩软件去打开一个docx文件,发现其中是由多个xml及资源文件构成,今天介绍的这块组件也正是使用此种规范的xml去实现的,参考如下图所示:

docx4j.gif

docx4j有什么用?

docx4j可以用来cao作docx、pptx、xlsx文档,在这里我想说的是cao作docx文档我一定会使用docx4j了,对于xlsx文档我则会选择jxls2.X与POI相结合,至于cao作pptx则几乎没有在实际中使用过,所以这里先不考虑。也就是说docx4j的处理pptx与xlsx我没有去详细关注,更多的去了解cao作docx文档,多说一句,本站有大量的jxls2.X版本cao作xlsx的案例(网络上找不到比这更科学的案例了)。

说到这里我大概说一下我们使用docx4jcao作docx能够实现什么,无非就是docx文档的读和写了,详细如下:

文档的写

文档的写基本上常用的地方都有其实现和解决方案,如:文档的属性(作者、创建时间、主题、关键字等)、文档目录、文档批注、页眉和页脚、插入图片、超链接、表格、文档只读、添加水印、文档合并、书签、文档转换(docx转html、xml、pdf)。。。等等等;

文档的读

文档的读和写一致,我详细它能写到的东西肯定也可以读取到。

docx4j处理docx文档优势?

对于导出doc文档,方便强大的是使用word做好模板并另存为xml文件,再配合模板引擎对xml进行编辑,无论对于样式、文本、图片等都是可以很方便的实现;另外对于POI的Wordcao作至今还没有使用到,Jacob组件不提了(虽然很强大,作为小小项目倒尚能考虑),上述中的模板引擎实现虽然很好很强大,但是弊端也异常明显,如后期再对于这个xml模板进行样式调整或者格式上的调整或其它需求调整,我详细作为编码人员的你内心是痛苦的,就因为这份xml模板无法再用Word打开,导致了一堆的麻烦事儿。

docx4j则不一样,可以通过编程式和模板式的进行文档的读和写cao作,包括一些动态数据的处理(提供有jxel表达式引擎的替换等),这句话可能你还没明白,意思就是你可以直接在docx文档中直接作为模板文件的编辑,那么如果基于这种模板去实现的功能可以随意的更改和调整模板(模板了解到,至少有3中写法)。

docx4j对于文档的转换也提供有实现,如将docx文档转换为xml(doc)格式、将docx转换为html格式、将docx转换为pdf(我为大家准备了这几种转换的实现)。

关于docx4j

说了这么多,它是什么,它能干什么,我觉得直接去它的官网上查看 https://www.docx4java.org/trac/docx4j ,本示例是下载的当前最新版 docx4j-community-6.0.1(我这里关注的是基于java语言的实现,源码工程在 https://github.com/plutext/docx4j 源码中提供了大量的示例,如果你想学习它最好的过程莫过于从示例中开始研究了,我过了一下它的示例,发现少部分的示例除了相关的资源文件不存在导致无法运行外,大部分的示例都是可以直接main函数运行的,它们的示例(仅限docx)可参考如下:

类名称

类描述

AltChunkAddOfTypeDocx.java

在一个docx文档转换为xml格式后的文档中,追加另外一个docx文

档,生成一个新的docx文档

AltChunkAddOfTypeHtml.java

将html代码片段显示至docx文档中,支持定义的相关属性

AltChunkXHTMLRoundTrip.java

将html代码片段显示至docx文档中,同时还添加有其它片段

AnonCorpus.java

多个文件同时cao作,没搞懂这个示例是什么意思

AnonSingle.java

单个文档cao作,同上

BackgroundImage.java

设置背景图,但是只能在web视图或全屏下显示,至于全屏没发现,在web视图下或者另存为html确实是有背景图的

BookmarkAdd.java

添加文档内部超链接

BookmarksDeleter.java

删除超链接

BookmarksDuplicateCheck.java

超链接重复检查

BookmarksReplaceWithText.java

超链接替换为文本?

CommentsSample.java

添加批注

CommentsDeleter.java

删除批注

CompareDocuments.java

比较文档?

ContentControlBindingExtensions.java

文档内容根据标记生成(根据模板生成,模板在word2007的设计模式--内容控件中)

ContentControlBindingExtensionsOld.java

同上,旧的实现,示例更多

ContentControlsAddCustomXmlDataStoragePart

添加自定义xml数据存储?

ContentControlsApplyBindings

示例运行没看出效果?

ContentControlsApplyBindingsIncrementalSave

少模板文件,需手工在代码模板文件中进行修改模板文件的名称(代码中的模板文件与实体文件不符),生成为docx文件对应的一系列的xml文件包

ContentControlsInfoParts

示例运行没看出效果?

ContentControlsInfoStructure

示例运行没看出效果?

ContentControlsMergeXML

根据模板文件和xml数据文件生成新文档

ContentControlsXmlEdit

同上?

ConvertInFlatOpenPackage

将xml转换为docx文档

ConvertOutFlatOpenPackage

将docx文档转换为xml(经验证可将xml的后缀修改为doc文件后打开,可作为docx转换为doc的一种实现)

ConvertOutHtml

将docx文档转换为html文件

ConvertOutHtmlDeprecated

将docx文档转换为html文件(不建议使用的)

ConvertOutPDF

将docx文档转换为pdf文件,示例运行时有个访问docx4j官网的逻辑,本机无网络导致转换报错

CreateDocxProtected

创建一个docx文档,限制为只读

DisplayMainDocumentPartXml

显示文档的部分xml

DocProps

获取文档的相关信息,如:作者,创建时间,标题,主题,关键字等(文档另存为时的相关信息)

ErrorLineExtractor

错误行抽取?看代码没啥意义

EventMonitoringDemo

程序打开或保存文档时的事件监控

FieldINCLUDEPICTURE

可在字段处插入图片,全选(或者鼠标点击片段处的焦点)按下F9可显示图片,代码中的图片路径原本写为file:///d:/temp/a.png,经过验证发现这里的图片地址不能写为\,必须为/斜杠,而且word打开时必须要可以访问到图片的位置,否则无法正常显示图片,另外也可将图片和docx放置在同一个目录下,代码中就无需写file:///d:/temp...的,直接写文件名称

FieldsDiagnostics

列出DOX中的所有字段指令(主文档部分、页眉、页脚),示例代码无文件,没找到文档具体意义

FieldsMailMerge

合并字段,一种按模板替换的方式

FieldsMailMergeNext

多条数据的模板合并实现,未找到模板文件,示例未完美运行出来

Filter

过滤一些文档信息

FontCheck

指定字体是否存在检查示例,可以获取到所有相关的字体,但相关中文字体全部对应的为英文字体,如“STSong”应该对应的就是宋体

FootnoteAdd

添加脚注,在页脚上方添加

FootnotesDelete

删除脚注

HeaderFooterCreate

添加页眉图片

HeaderFooterList

获取页眉列表

HeaderFooterNoneOnTitlePage

???

HeaderFooterRemove

页眉删除

HyperlinkTest

添加一个超链接

ImageAdd

插入几张图片

ImageAddWMF

插入wmf格式图片

ImageConvertEmbeddedToLinked

???

ImageDelete

图片删除

MacroAdd

???

MathsEquationsFormulae

docx添加数学公式,示例中有将xml结构转换为docx对象再添加至文档中

MergeDocx

两个docx文档合并

NewDocxHelloWorld

创建一个文档并写入helloworld

NumberingRestart

创建新文档带编号

OLEExtractEmbeddedPDF

???

OpenAndSaveRoundTripTest

打开一个现有文档再追加一个段落

OpenUnzippedAndSaveZipped

将一个docx文档更改为zip格式后,解压缩后存储至文件夹里,然后通过示例还原这个docx文档

OpenZippedAndSaveUnzipped

将一个docx文档解压成一个文件夹结构的xml文件

PageCounter

将docx转换为pdf获取页数

PartCopy

???

PartLoadFromFileSystem

???

PartsStrip

???

ProtectRestrictFormatting

将docx文档另存为只读

SampleDocument

简单文档cao作,有在xml字符串中使用${}变量

SubDocument

???

TemplateAttach

???(模板文件不存在)

TocAdd

目录相关cao作(示例文件不存在)

TocSample

目录相关cao作(无网络访问connect timeout)

TocUpdateDemo

目录相关cao作(无网络访问connect timeout)

TrackChangesAccept

???示例文件不存在

TraverseFind

???示例文件不存在

VariableReplace

使用模板变量替换

VariableReplaceSAX

使用模板变量替换(少示例文件)

VariableReplaceStAX

使用模板变量替换(少示例文件)

Watermark

添加背景水印(使用xml代码)

WatermarkPicture

添加背景水印(使用图片实现)

XPathOverDir

???从文件夹中批量找docx的对象

XPathQuery

从XPath中查找对象

示例分享

为大家准备了一些示例,这些示例是日常工作中最可能会使用到的,带着实际应用中的问题去分析和实现,同时也将按照循序渐进的方式去一步一步深入,你绝对值得拥有。这些示例参考分别为:

①、也就是本篇的总体介绍;

②、一个专业的hello world入门程序介绍;

③、一个包含多种样式的段落实现;

④、关于图片在实际应用中的使用;

⑤、docx文档模板的cao作;

⑥、编程式表格的应用;

⑦、关于模板式的表格和动态表格实现;

⑧、关于模板式的单元格合并(支出多列并列合并)

⑨、关于docx文档的转换;

OK,本次就分享这么多,后期如有更新再做更改。

相关下载

docx4j示例代码下载.zip

 点赞


 发表评论

当前回复:作者

 评论列表


留言区