http://www.chendd.cn/information/viewInformation/other/250.a
docx4j是什么?
docx4j是一个用于创建和cao作Word(docx)、PPT(pptx)和Excel(xlsx)文件的Java类库。为什么这些全部是带x的版本呢,因为office2007的版本(后),改写了文件的实现,它们都是由一些xml组成的,最初知道这一点要追溯到2013(4)年从欢乐哥那里知道的,也是无意中的了解,给我演示了一下使用zip解压缩软件去打开一个docx文件,发现其中是由多个xml及资源文件构成,今天介绍的这块组件也正是使用此种规范的xml去实现的,参考如下图所示:
文档的写
文档的写基本上常用的地方都有其实现和解决方案,如:文档的属性(作者、创建时间、主题、关键字等)、文档目录、文档批注、页眉和页脚、插入图片、超链接、表格、文档只读、添加水印、文档合并、书签、文档转换(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,本次就分享这么多,后期如有更新再做更改。
相关下载