需求
需求:根据 word 模板,动态填充模板内容,生成新的 word。实现:获取数据库数据,根据 word 模板填充内容,生成新的 word 文档。
“应用场景:笔者的应用场景是生成客户合同,根据用户提交的具体合同内容,填充进合同模板内,生成新的 word 即填充了内容的完整合同。
”
使用技术
1、poi-tl
poi-tl(poi template language)是基于 Apache POI 的 Word 模板引擎,纯 Java 组件,跨平台,代码短小精悍,通过插件机制使其具有高度扩展性。官方文档:poi-tl 官方文档(/poi-tl/)
2、poi-tl 的优点
根据官方文档介绍,poi-tl 具有以下优点:A、支持动态填充文本、图片、表格、列表、文档B、支持 DOCX 格式,所有的模板标签都是以 {{开头,以}} 结尾,模板标签可以出现在任何非文本框的位置,包括页眉,页脚,表格内部等等。C、poi-tl 的一个核心特点是数据模型与样式的分离,同样的数据模型可以用来渲染各种不同样式的模板。D、文档的样式继承模板标签的样式,即如果模板 {{title}} 是蓝色微软雅黑加粗四号字体,则替换后的文本也是蓝色微软雅黑加粗四号字体。
具体应用
1、依赖
com.deepoovepoi-tl1.5.0
2、Java 类
importcom.deepoove.poi.data.PictureRenderData; importorg.slf4j.Logger; importorg.slf4j.LoggerFactory; importorg.springframework.util.Assert; importjava.io.File; importjava.util.Date; importjava.util.HashMap; importjava.util.Map; /** *@authorJerry *@Title:WordUtil *@Description:Word工具类 *@date219/10/69:09 */ publicclassWordUtil{ privatestaticLoggerlogger=LoggerFactory.getLogger(WordUtil.class); /** *根据模板填充内容生成word *调用方法参考下面的main方法,详细文档参考官方文档 * Poi-tl模板引擎官方文档:/poi-tl/ * *@paramtemplatePathword模板文件路径 *@paramfileDir生成的文件存放地址 *@param fileName 生成的文件名,不带格式。假如要生成abc.docx,则fileName传入abc即可 *@paramparamMap替换的参数集合 *@return生成word成功返回生成的文件的路径,失败返回空字符串 */ publicstaticStringcreateWord(StringtemplatePath,StringfileDir,StringfileName,MapparamMap){ Assert.notNull(templatePath,"word模板文件路径不能为空"); Assert.notNull(fileDir,"生成的文件存放地址不能为空"); Assert.notNull(fileName,"生成的文件名不能为空"); //生成的word格式 StringformatSuffix=".docx"; //拼接后的文件名 fileName=fileName+formatSuffix; //生成的文件的存放路径if(!fileDir.endsWith("/")){ fileDir=fileDir+File.separator; } Filedir=newFile(fileDir);if(!dir.exists()){ logger.info("生成word数据时存储文件目录{}不存在,为您创建文件夹!",fileDir); dir.mkdirs(); } StringfilePath=fileDir+fileName; //读取模板templatePath并将paramMap的内容填充进模板,即编辑模板+渲染数据 XWPFTemplatetemplate=pile(templatePath).render(paramMap); try{ //将填充之后的模板写入filePath template.writeToFile(filePath); template.close(); }catch(Exceptione){ logger.error("生成word异常",e); e.printStackTrace();return""; }returnfilePath; } publicstaticvoidmain(String[]args){ Mapparams=newHashMap<>(); //渲染文本 params.put("projectName","XXX工程"); ... //渲染图片 params.put("picture",newPictureRenderData(120,120,"D:\\wx.png")); //TODO渲染其他类型的数据请参考官方文档 StringtemplatePath="D:\\zdd.docx"; StringfileDir="D:\\template"; StringfileName="zdd2"; StringwordPath=WordUtil.createWord(templatePath,fileDir,fileName,params); System.out.println("生成文档路径:"+wordPath); } }importcom.deepoove.poi.XWPFTemplate;
3、word 模板格式
4、最终生成 word 的效果
开发时遇到的问题
poi-tl 依赖的是 poi 3.16 版本,包括 poi-ooxml、poi、poi-ooxml-schemas 三个依赖,如果项目中有这三个依赖的其他版本可能会导致上面的代码报错,因此最好是使用 3.16 版本的这三个依赖。
作者:Jerry_1998
版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。
来源链接:
/weixin_44605704/article/details/102571324