Java基于POI填充Word模版
最近有个需求,就是要根据用户订单信息来填充现有的Word
模版,从而生成一个在线电子文档,再通过易企签
来实现线上签字确认。
我们先来看看模版
这是我们项目上的大概文档,因为要涉及到一些文字替换和段落删减,引入了一些符号替换规则。
POI操作Word的常用属性
在操作之前,我们需要了解一下属性和方法
- XWPFDocument:用来获取或者创建一个Word文档
- XWPFParagraph:标题、文档、表格等
- XWPFRun:同样风格的一段文本
- XWPFTable:表格
- XWPFTableRow:表格中的一行
- XWPFTableCell:表格中的一个单元格
填充Word模版
现在我们就开始实践-填充我们上面的模版
引入POI包
1 | <!-- https://mvnrepository.com/artifact/org.apache.poi/poi --> |
这里的变量值是<poi.version>4.1.0</poi.version>
。
获取文档对象
由于我的文档模版是存储在GridFS
中(其实我更倾向于MinIO
),所以我的通过文件流的形式读取
1 | //通过文件读取 |
获取到文档之后,就可以从中获取到对应的XWPFParagraph
对象
1 | List<XWPFParagraph> paragraphs = document.getParagraphs(); |
然后我们可以从XWPFParagraph
获取到Text
即段落中的内容,但是我们要替换段落中的内容的话必须在XWPFRun
才行。所以需要循环遍历去处理
1 | for (XWPFParagraph paragraph : paragraphs) { |
这里我们可以通过run.toString()
获取到内容,并通过run.setText
进行替换。在我们获取到文本之后,要匹配出对象的关键字,所以这里需要一个正则匹配
1 | private static List<String> getKeywords(String source) { |
我们通过getKeywords
获取到模版中的关键字后,再从Map
对象中去取出对应的值,然replace
掉
1 | for (XWPFParagraph paragraph : paragraphs) { |
一般的内容可以通过${key}
的方式来替换,那么遇到表格怎么办呢?我继续来处理表格
1 | List<XWPFTable> tables = document.getTables(); |
我这里先只针对我的模版进行处理,如果是遇到多个XWPFTable
那么久根据情况自行处理吧
1 | for (int i = 1; i < tableList.size(); i++) { |
这里就会根据我们的传入的tableList
即表格数据进行填充。根据tableBottom
数组来添加一些样式。最后来看看我们做出的效果,首先是用Swagger
调用接口
1 | { |
上面是我传参数,最后导出的Word文档
是这样的
当然,这里还有一些细节需要处理。
Java基于POI填充Word模版