1、需求(实现功能)
需求:根据word模板,动态填充模板内容,生成新的word。
实现:获取数据库数据,根据word模板填充内容,生成新的word文档。
应用场景:笔者的应用场景是生成客户合同,根据用户提交的具体合同内容,填充进合同模板内,生成新的word即填充了内容的完整合同。
2、Why poi-tl
Apache POI不仅在上层封装了易用的文档API(文本、图片、表格、页眉、页脚、图表等),也可以在底层直接操作文档XML结构,poi-tl正是一个基于Apache POI的Word模板引擎,并且拥有着让人喜悦的特性。
3、软件要求
Apache POI 4.1.2+
JDK 1.8+
4、Started
4.1. Maven
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>4.1.2</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.1.2</version>
</dependency>
<!-- word模板动态生成word poi-tl -->
<dependency>
<groupId>com.deepoove</groupId>
<artifactId>poi-tl</artifactId>
<version>1.8.2</version>
</dependency>
4.2java代码(一个小demo)
package com.example.demo.util;
import com.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.data.PictureRenderData;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.Assert;
import java.io.File;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
/**
* @author wanghuyue
* @Title: WordUtil
* @Description: Word工具类
* @date 2020/10/9 9:09
*/
public class WordUtil {
private static Logger logger = LoggerFactory.getLogger(WordUtil.class);
/**
* 根据模板填充内容生成word
* 调用方法参考下面的main方法,详细文档参考官方文档
* Poi-tl模板引擎官方文档:http://deepoove.com/poi-tl/
*
* @param templatePath word模板文件路径
* @param fileDir 生成的文件存放地址
* @param fileName 生成的文件名,不带格式。假如要生成abc.docx,则fileName传入abc即可
* @param dates 替换的参数集合
* @return 生成word成功返回生成的文件的路径,失败返回空字符串
*/
public static String createWord(String templatePath, String fileDir, String fileName, Dates dates) {
Assert.notNull(templatePath, "word模板文件路径不能为空");
Assert.notNull(fileDir, "生成的文件存放地址不能为空");
Assert.notNull(fileName, "生成的文件名不能为空");
// 生成的word格式
String formatSuffix = ".docx";
// 拼接后的文件名
fileName = fileName + formatSuffix;
// 生成的文件的存放路径
if (!fileDir.endsWith("/")) {
fileDir = fileDir + File.separator;
}
File dir = new File(fileDir);
if (!dir.exists()) {
logger.info("生成word数据时存储文件目录{}不存在,为您创建文件夹!", fileDir);
dir.mkdirs();
}
String filePath = fileDir + fileName;
// 读取模板templatePath并将paramMap的内容填充进模板,即编辑模板+渲染数据
XWPFTemplate template = XWPFTemplate.compile(templatePath).render(dates);
try {
// 将填充之后的模板写入filePath
template.writeToFile(filePath);
template.close();
} catch (Exception e) {
logger.error("生成word异常", e);
e.printStackTrace();
return "";
}
return filePath;
}
public static void main(String[] args) {
Dates dates = new Dates();
dates.setChun("大河");
dates.setName("asdasd");
dates.setZu("aa");
dates.setHouseNum("100");
dates.setIdCard("45345553");
dates.setPhone("1231233123");
dates.setImageFwct(new PictureRenderData(100, 100, "D:\\face-200720DYP86CMSA8.jpg"));
dates.setImageZdct(new PictureRenderData(100, 100, "D:\\face-200720DYP86CMSA8.jpg"));
// 渲染图片
//params.put("picture", new PictureRenderData(120, 120, "D:\\wx.png"));
// TODO 渲染其他类型的数据请参考官方文档
String templatePath = "D:/wanghuyue/fwyth/temp/桃源县农村宅基地实地调查申请表(新表).docx";
String fileDir = "D:/wanghuyue/fwyth/temp/template";
String fileName = "测试文档";
String wordPath = WordUtil.createWord(templatePath, fileDir, fileName, dates);
System.out.println("生成文档路径:" + wordPath);
}
}
4.3word模板格式
4.4生成的最终格式
注意:
Poi-tl模板引擎中文官方文档:http://deepoove.com/poi-tl/
官网文档很详细,而且有很多很好用的小demo。都有源码 小伙伴们可以去看看。