[实用]【更新中】Java Apache POI 打印Word文档工具(含文本替换,动态表格功能)
基于Apache POI对Word进行操作
你好!这是由一个刚毕业的学生,由于项目所需,需要通过Java后台的方式打印Word文档,因此在对大量能操作word的Java API中,选择了Apache POI。以下将简单分享一下这个在学习和开发这个基于POI的word文档打印工具时,一些心得:
- Apache POI在操作word上非常费劲,在选型的过程中还遇到过很多,如Freemarker,freemarker本人没有研究,但是大概知道是基于word保存为xml后,然后用占位符替换的方式,对xml中整段整段的内容进行文本替换,最终输出word文档,就能得到word文档。
- Freemarker的缺点(只是看别人总结的,自己没有求证)
1.freemark在进行文本替换的时候,很难保持原有的样式
2.在好不容易编辑好word模板后,转成xml的时候,还需要打开xml对里面的内容进行核对,听说会由于word文档一些字符串处理不好,倒是xml中 标签的缺失or错误,需要手动处理。如果word文档少还好,但是如果文档内容多,那就很麻烦(up主的项目所需打印的word文档就很多内容) - Apache POI能很好的保持原来的样式,在理解底层接口原理后,还是挺好操作的,但是对于使用者来说,你们就不需要理解底层原理,因为我已经高度封装好了。
接下来,我将会对Apache POI进行讲解。以及我这套工具的一些底层原理,目的是为了和各位大牛交流,以及有人有定制需求的话,可以基于我这个工具进行改写,来适应不同的项目。如果你不想学原理,则只需要跳过本段内容,到最后一小节,我会用最黑盒的方式,来快速教大家上手使用我这套工具。
(由于本人技术有限,而且公文写作能力一般,因此有口误的地方请大家指出,并且欢迎大家提出更好的解决建议)
(本工具现在是V1.0版本,代码方面也还没进行过多优化,性能暂时还OK,但还有很大优化空间 )
一、基于Apache POI封装的word文档工具V1.0介绍
已实现的功能:
- 文本替换
- 静态表格的文本替换
- 动态表格(行的变化)
- 动态表格(整个表格动态增减)
- 动态表格(整个表格动态增减,与上面不同的是,这个表格会附带表格标题以及跟随文本)
- 图片插入
后期可能扩展的方向
- 富文本
本工具与网上其他POI打印工具类对比 特点:
- 文本替换可以灵活的在word文档的任意位置,并且不会受到左右其他文字的影响(网上绝大部分,只是简单封装POI,实际上他们的文本替换需要占据一整行,这是极度不灵活的)
- 文本替换功能,在编辑模板的时候,可以设置它的样式。文本替换的时候,会根据你给定的样式替换文本。
- 表格内支持样式自定义,很多百度其他封装工具,都不支持样式自定义
- 动态表格比较灵活,支持一整块的扩展。
- 插入图片支持自定义大小
简单例子
(1)word模板
(2)通过apache poi打印后
二、Apache POI 知识
apache poi官方文档:http://poi.apache.org/
1. jar包(maven的,这个不多做解释了)
<properties>
<java.poi.version>4.0.0</java.poi.version>
</properties>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>${
java.poi.version}</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml-schemas</artifactId>
<version>${
java.poi.version}</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>${
java.poi.version}</version>
</dependency>
2. poi的类
- XWPFDocument:一个word文档对应一个document
- XWPFHeaderFooterPolicy:文档的页眉页脚(可以设置每一页的页眉页脚不同,也可以统一一个默认的页眉页脚作为全局,一般来说,后者用的比较多,因此我的工具里也是后者)
- XWPFTable:一个表格对应一个XWPFTable对象
- XWPFTableRow:一个表格的每一行对应一个XWPFTableRow
- XWPFTableCell:table中的每一个单元格对应一个XWPFTableCell(Cell特别特殊,他的里面相当于一个XWPFDocument,也就是说,一个单元格里面,可以进行插入文字,图片,表格等操作,类似于document)
- XWPFParagraph:一段文本对应一个XWPFParagraph(注意,是一段文本,后面会解释合为一段文本)
- XWPFRun:一处具有相同样式的文本(一个XWPFParagraph里面包含多个XWPFRun)
他们之间的关系结构如图所示(为了更方便大家的理解,用一个图表示)
因此:
- 一个Document包含多段Paragraph和多个Table。
- 一个Paragra