赞
踩
需求:根据word模板,动态填充模板内容,生成新的word。
实现:获取数据库数据,根据word模板填充内容,生成新的word文档。
应用场景:笔者的应用场景是生成客户合同,根据用户提交的具体合同内容,填充进合同模板内,生成新的word即填充了内容的完整合同。
poi-tl(poi template language)是基于Apache POI的Word模板引擎,纯Java组件,跨平台,代码短小精悍,通过插件机制使其具有高度扩展性。
官方文档:poi-tl官方文档
根据官方文档介绍,poi-tl具有以下优点:
A、支持动态填充文本、图片、表格、列表、文档
B、支持DOCX格式,所有的模板标签都是以 {{ 开头,以 }} 结尾,模板标签可以出现在任何非文本框的位置,包括页眉,页脚,表格内部等等。
C、poi-tl的一个核心特点是数据模型与样式的分离,同样的数据模型可以用来渲染各种不同样式的模板。
D、文档的样式继承模板标签的样式,即如果模板{{title}}是蓝色微软雅黑加粗四号字体,则替换后的文本也是蓝色微软雅黑加粗四号字体。
- <dependency>
- <groupId>com.deepoove</groupId>
- <artifactId>poi-tl</artifactId>
- <version>1.5.0</version>
- </dependency>
2、Java类 ,保存到本地
- 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 Jerry
- * @Title: WordUtil
- * @Description: Word工具类
- * @date 219/10/6 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 paramMap 替换的参数集合
- * @return 生成word成功返回生成的文件的路径,失败返回空字符串
- */
- public static String createWord(String templatePath, String fileDir, String fileName, Map<String, Object> paramMap) {
- 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(paramMap);
- 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) {
- Map<String, Object> params = new HashMap<>();
- // 渲染文本
- params.put("projectName", "XXX工程");
- ...
- // 渲染图片
- params.put("picture", new PictureRenderData(120, 120, "D:\\wx.png"));//本地图片
- //params.put("signature", new PictureRenderData(120, 90,".png", //BytePictureUtils.getUrlBufferedImage(pictureUrl)));//图片url
- // TODO 渲染其他类型的数据请参考官方文档
- String templatePath = "D:\\zdd.docx";
- String fileDir = "D:\\template";
- String fileName = "zdd2";
-
- String wordPath = WordUtil.createWord(templatePath, fileDir, fileName, params);
- System.out.println("生成文档路径:" + wordPath);
- }
- }
3、Java类 ,保存到OSS
- /**
- * 根据模板填充内容生成word
- * 详细文档参考官方文档
- * Poi-tl模板引擎官方文档:http://deepoove.com/poi-tl/
- *
- * @param templatePath word模板文件路径
- * @param fileDir 生成的文件存放地址
- * @param fileName 生成的文件名,不带格式。假如要生成abc.docx,则fileName传入abc即可
- * @param paramMap 替换的参数集合
- * @return 生成word成功返回生成的文件的路径,失败返回空字符串
- */
- public static InputStream createWord(String templatePath, String fileDir, String fileName, Map<String, Object> paramMap) {
- 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 + File.separator);
- if (!dir.exists()) {
- log.info("生成word数据时存储文件目录{}不存在,为您创建文件夹!", fileDir);
- dir.mkdirs();
- }
- InputStream in = null;
- try {
- InputStream inputStream = IcePdfUtils.url2InputStream(templatePath);
- XWPFTemplate template = XWPFTemplate.compile(inputStream).render(paramMap);
- File file = new File(fileDir + File.separator + fileName);
- // 将填充之后的模板写入filePath
- template.writeToFile(file.getAbsolutePath());
- in = new FileInputStream(file);
- //用完删除
- FileUtil.del(dir);
- FileUtil.del(file);
- template.close();
- } catch (Exception e) {
- log.error("生成word异常", e);
- e.printStackTrace();
- }
- return in;
- }
- public static void main(String[] args) {
- Map<String, Object> params = new HashMap<>();
- // 渲染文本
- params.put("leasee", "XXX工程");
- ...
- // 渲染图片
- //params.put("picture", new PictureRenderData(120, 120, "D:\\wx.png"));//本地图片
- params.put("signature", new PictureRenderData(120, 90,".png",
- BytePictureUtils.getUrlBufferedImage(pictureUrl)));//图片url
- // TODO 渲染其他类型的数据请参考官方文档
- String templatePath = "url地址";
- String fileName = "名称";
- InputStream wordPath = createWord(templatePath, "download", fileName, params);
- String fileName2 = UUID.randomUUID().toString().replaceAll("-", "") + fileName;
- OssFile ossFile = OssUtils.uploadOosByByte(wordPath, fileName2 + ".docx");
- System.out.println("生成文档路径:" + ossFile.getFileUrl());
- return ossFile.getFileUrl();
- }
4.word模版
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。