一、需求(实现功能)

需求:根据word模板,动态填充模板内容,生成新的word。
实现:获取数据库数据,根据word模板填充内容,生成新的word文档。
应用场景:笔者的应用场景是生成客户合同,根据用户提交的具体合同内容,填充进合同模板内,生成新的word即填充了内容的完整合同。

二、使用技术

1、poi-tl

poi-tl(poi template language)是基于Apache POI的Word模板引擎,纯Java组件,跨平台,代码短小精悍,通过插件机制使其具有高度扩展性。
官方文档:poi-tl官方文档

2、poi-tl的优点

根据官方文档介绍,poi-tl具有以下优点:
A、支持动态填充文本、图片、表格、列表、文档
B、支持DOCX格式,所有的模板标签都是以 {{ 开头,以 }} 结尾,模板标签可以出现在任何非文本框的位置,包括页眉,页脚,表格内部等等。
C、poi-tl的一个核心特点是数据模型与样式的分离,同样的数据模型可以用来渲染各种不同样式的模板。
D、文档的样式继承模板标签的样式,即如果模板{{title}}是蓝色微软雅黑加粗四号字体,则替换后的文本也是蓝色微软雅黑加粗四号字体。

三、具体应用

1、依赖

<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 {// 将填充之后的模板写入filePathtemplate.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"));// 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、word模板格式

4、最终生成word的效果

四、存在问题

poi-tl依赖的是poi 3.16版本,包括poi-ooxml、poi、poi-ooxml-schemas三个依赖,如果项目中有这三个依赖的其他版本可能会导致上面的代码报错,因此最好是使用3.16版本的这三个依赖。

个人笔记:http://note.youdao.com/noteshare?id=e45282913259ab8043d823f2ec883299

JAVA根据word模板动态生成word(SpringBoot项目)相关推荐

  1. SpringBoot+Poi-tl根据Word模板动态生成word(含动态行表格、合并单元格)

    本编文章继SpringBoot+Poi-tl根据Word模板动态生成word(含动态行表格)文章之后 介绍Poi-tl导出word的延伸功能: 所需依赖以及word模板所属位置 见 SpringBoo ...

  2. java基于word模板动态生成word及转pdf实践

    在项目中很容易会遇到需要动态生成pdf的应用场景,其实现方式也比较多 由于项目的关系,对于这种组件性的开发方式我想的是怎么方便怎么来,怎么快就怎么来 在咨询了之前做政务系统的同学后,他们都一致推荐我使 ...

  3. POI利用word模板动态生成word报表以及动态生成word表格

    目录 核心依赖 动态表格 测试类 工具类 动态数据 测试类 工具类 核心依赖 <dependency><groupId>org.apache.poi</groupId&g ...

  4. Java中利用freemarker模板动态生成word含表格

    最近公司有导出word的需求,由于word的样式有的很复杂所以记录一下Java中利用freemarker模板动态生成word含表格,以防以后忘记. 1.word表格的模板 删掉无用的数据留下基础的样式 ...

  5. Freemarker - 根据模板动态生成word文档

    文章目录 Freemarker 根据模板动态生成word文档 Freemarker 介绍: Freemarker 使用: freemarker加载模板目录的方法 参考资料 Freemarker 根据模 ...

  6. Java使用ftl模板文件生成Word,以及Word转换图片或Pdf工具类

    Java使用ftl模板文件生成Word 一.写在前面 最近在项目中使用打印功能,发现这个功能我已经写过多次了,下面这个文章的发步日期在2020年,不得不感慨时间之快啊. https://blog.cs ...

  7. java根据模板动态生成word文档带表格

    废话不多说上代码 <dependencies><!-- web支持 --><dependency><groupId>org.springframewor ...

  8. java根据模板动态生成word文档

    模板文档 首先,需要创建一个word模板,我的模板例子如下: 动态生成的文档 根据java代码动态的修改模板生成自己想要的文档,结果如下: 具体代码 代码操作如下:其中进行了文本的替换,图片的插入,以 ...

  9. java使用world模板动态生成PDF文件

    根据项目需求,需要用到一个功能,根据页面参数需要动态的生成一个world,并将world生成两份PDF文件,一份正式文件,一份临时的电子文件(带有二维码,扫描可以下载正式文件的电子版本).同时上传到文 ...

  10. python 批量打印文档_使用python将Excel数据填充Word模板并生成Word

    [项目需求] Excel中有一万多条学生学平险数据,需要给每位学生打印购买回执单,回执单包括学生姓名,身份证号,学校等信息,目前只能从Excel拷贝数据到Word模板中,然后打印,效率及其低下,寻求帮 ...

最新文章

  1. 基于OpenCV的膨胀和腐蚀
  2. 数据库VIEW(视图)
  3. iOS UUID配合keychain的替换方案实现
  4. SAP Spartacus language和currency Component data加载
  5. Django forms组件
  6. [转]Angular 单元测试讲解
  7. ArcGIS实验教程——实验七:矢量数据空间校正(Spatial Adjustment)
  8. python字符串乘一个数_Python--初识庐山真面目
  9. 代数学笔记10.1: 关于对称多项式的理解和三次预解式的推导
  10. 大智慧 软件 开发语言_中科闻歌中标深圳税务局智慧税务中台软件开发服务项目...
  11. python中a* b是什么意思_Python中的a+=b和a=a+b之间的区别是什么?
  12. 前端怎么自我介绍_实习|猫眼前端面试经历,问问题很关键(已拿offer)
  13. vue写一个简单的警察抓小偷的打字游戏
  14. linux检查系统内存,Linux查看内存使用情况方法
  15. 商业的本质 + 社交电商思考
  16. 关于三栏式布局的几种方式
  17. idea 提示cannot find declaration to go to 解决方法
  18. 罗斯蒙特333D信号转换器
  19. 实用selenium+python实现web自动化测试
  20. Sequoia(基于JDBC的数据库集群中间件)用户手册

热门文章

  1. python情感词典计算得分_利用情感词典计算调研纪要中的情感得分
  2. PHP视频教程下载(PHP100系列视频教程)
  3. c语言上机+pdf,c语言上机题库.pdf
  4. JSP实用教程(3)——Tag文件和Tag标记
  5. Framehawk技术-思杰HDX
  6. java 解密pdf文件_Java 加密和解密PDF文档
  7. 心电图分析软件_动态心电图品牌排行榜
  8. SQL基础知识总结(SQL必知必会)
  9. aix查询服务器内存序列号_AIX查看cpu_内存序列号
  10. oracle的odbc源配置文件,odbc数据源配置oracle odbc driver configuration教程