1、带你一起拥有docx4j
docx4jadmin 发布于:2018-10-13 18:15:22
阅读:loading
docx4j是一个用于创建和cao作Word(docx)、PPT(pptx)和Excel(xlsx)文件的Java类库。为什么这些全部是带x的版本呢,因为office2007的版本(后),改写了文件的实现,它们都是由一些xml组成的,最初知道这一点要追溯到2013(4)年从欢乐哥那里知道的,也是无意中的了解,给我演示了一下使用zip解压缩软件去打开一个docx文件,发现其中是由多个xml及资源文件构成,今天介绍的这块组件也正是使用此种规范的xml去实现的,参考如下图所示:
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)。。。等等等;
文档的读
文档的读和写一致,我详细它能写到的东西肯定也可以读取到。
对于导出doc文档,方便强大的是使用word做好模板并另存为xml文件,再配合模板引擎对xml进行编辑,无论对于样式、文本、图片等都是可以很方便的实现;另外对于POI的Wordcao作至今还没有使用到,Jacob组件不提了(虽然很强大,作为小小项目倒尚能考虑),上述中的模板引擎实现虽然很好很强大,但是弊端也异常明显,如后期再对于这个xml模板进行样式调整或者格式上的调整或其它需求调整,我详细作为编码人员的你内心是痛苦的,就因为这份xml模板无法再用Word打开,导致了一堆的麻烦事儿。
docx4j则不一样,可以通过编程式和模板式的进行文档的读和写cao作,包括一些动态数据的处理(提供有jxel表达式引擎的替换等),这句话可能你还没明白,意思就是你可以直接在docx文档中直接作为模板文件的编辑,那么如果基于这种模板去实现的功能可以随意的更改和调整模板(模板了解到,至少有3中写法)。
docx4j对于文档的转换也提供有实现,如将docx文档转换为xml(doc)格式、将docx转换为html格式、将docx转换为pdf(我为大家准备了这几种转换的实现)。
说了这么多,它是什么,它能干什么,我觉得直接去它的官网上查看 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,本次就分享这么多,后期如有更新再做更改。
点赞