在上一篇文章中,我们介绍了一个通过ApachePOI导出word的例子;如果是word模板法,有没有开源库可以通过模板法导出word?poi-tl是一个基于ApachePOI的Word模板引擎。它也是一个免费和开源的Java类库。您可以轻松地将它添加到您的项目中,并且它具有令人愉悦的特性。本文主要介绍poi-tl结合SpringBoot以模板方式实现的Word导出功能。SpringBoot集成文档-POI-tl的基于模板的Word导出知识准备什么是poi-tlpoi-tl的TDO模式源码参考文章更多内容知识准备需要了解文件上传下载的常见场景和技术手段。@pdai什么是poi-tl以下内容来自poi-tl官网。poi-tl(poi模板语言)是一个Word模板引擎,它使用Word模板和数据来创建很棒的Word文档。优势:它还支持自定义插件,如下是官网代码仓库支持的特性poi-tl支持自定义函数(插件),函数可以在Word模板的任意位置执行,在文档的任意位置做任何事情是poi的目标-tl.FeatureDescriptionText将标签渲染为文本Picture将标签渲染为图片Table将标签渲染为表格Numbering将标签渲染为编号ChartBar图(3D条形图)、columnchart(3D柱形图)、areachart(3D面积图)、折线图(3D折线图)、雷达图、饼图(3D饼图)等图表渲染IfCondition根据条件隐藏或显示某些文档内容(包括文本、段落、图片、表格、列表、图表等)ForeachLoop根据集合循环遍历一定的文档内容(包括文本、段落、图片、表格、列表、图表等)LooptablerowLoop复制渲染表格的一行Looptablecolumn循环复制并渲染表格的一列Loop有序列表支持lo有序列表的op,同时支持多级列表高亮代码代码块的文字高亮,支持26种语言和上百种着色风格Markdown转换Markdown为word文档Word附件在Word中插入附件WordComments完成支持评论,创建评论,修改评论等WordSDTComplete支持结构化文档标签TextboxTag支持文本框内的图片替换用另一张图片替换原图片书签、锚点、超链接支持在文档中设置书签、锚点、超链接表达式语言完全支持SpringEL表达式,可以扩展更多表达式:OGNL,MVEL...Style模板就是样式,代码也可以设置样式模板嵌套模板包含子模板,子模板再包含子模板MergeWordmerge合并,也可以自定义在指定位置合并功能(插件)插件设计,exdocumentpoi-tl的TDO模式中任意位置执行函数TDO模式:Template+data-model=output以官网为例:XWPFTemplatetemplate=XWPFTemplate.compile("template.docx").render(newHashMap(){{put("title","Hi,poi-tlWord模板引擎");}});template.writeAndClose(newFileOutputStream("output.docx"));compilecompiletemplate-Templaterenderrenderdata-data-modelwriteoutputtostream-outputTemplate:模板模板是一个Docx格式的Word文档,你可以使用Microsoftoffice、WPSOffice、Pages等任何你喜欢制作模板的软件,你可以同样使用ApachePOI代码生成模板,所有标签都是以{{开始,}}结束。标签可以出现在任何地方,包括页眉、页脚、表格内部、文本框等。表格布局可以设计出许多优秀而专业的文档。建议使用表格布局。poi-tl模板遵循“所见即所得”的设计,模板和标签的样式将得到完整保留。data-model:Data数据类似于hash或者字典,可以是Map结构(key是标签名):Mapdata=newHashMap<>();data.put("name","赛义");data.put("开始时间","2019-08-04");可以是一个对象(属性名就是标签名):publicclassData{privateStringname;私有字符串开始时间;privateAuthorauthor;}数据可以是Tree结构,每一层用点号分隔,比如{{author.name}}标签对应的数据就是author对象的name属性值。Word模板不是用简单的文字来表示的,所以在渲染图片、表格等元素时提供了数据模型。它们都实现了RenderData接口。例如,图片数据模型PictureRenderData包含三个属性:图片路径、宽度和高度。输出:输出以流的形式输出:template.write(OutputStreamstream);可以写入任何输出流,例如文件流:template.write(newFileOutputStream("output.docx"));比如网络流:response.setContentType("application/octet-stream");response.setHeader("Content-disposition","attachment;filename=\""+"out_template.docx"+"\"");//HttpServletResponseresponseOutputStreamout=response.getOutputStream();BufferedOutputStreambos=newBufferedOutputStream(out);template.write(bos);bos.flush();out.flush();PoitlIOUtils.closeQuietlyMulti(template,bos,out);//最后不要忘记关闭这些流。这里的实现案例展示了SpringBoot集成poi-tl基于word模板导出Word,将markdown导出到word的例子。pom依赖导入poi的依赖包基础包:com.deepoovepoi-tl1.12.0plugin包如下,比如高亮,markdown包com.deepoovepoi-tl-plugin-highlight1.0.0com.deepoovepoi-tl-plugin-markdown1.0.3基于模板导出方法wordcontroller@ApiOperation("DownloadWord")@GetMapping("/word/download")publicvoiddownload(HttpServletResponseresponse){try{XWPFTemplate文档=userService.generateWordXWPFTemplate();响应.重置();response.setContentType("application/octet-stream");回应。setHeader("Content-disposition","attachment;filename=user_word_"+System.currentTimeMillis()+".docx");OutputStreamos=response.getOutputStream();document.write(os);os.close();}catch(Exceptione){e.printStackTrace();}}服务中的实际方法@OverridepublicXWPFTemplategenerateWordXWPFTemplate()throwsIOException{Mapcontent=newHashMap<>();content.put("title","Java全栈知识体系");content.put("author","pdai");content.put("site",newHyperlinkTextRenderData("https://pdai.tech","https://pdai.tech"));content.put("poiText","ApachePOI是一个JavaAPI,用于创建和维护符合OfficeOpenXML(OOXML)标准的操作,可以使用微软的OLE2CompoundDocumentFormat(OLE2)Java读取和创建、修改MSExcel文件,此外,您还可以使用Java读取和创建MSWord和MSPowerPoint文件。更多信息请参考[官方文档](https://poi.apache.org/index.html)");content.put("poiText2","生成xls和xlsx有什么区别?POI的对象在Excel封装对应?");content.put("poiList",Numberings.create("excel03只能打开xls格式,不能直接打开xlsx格式","xls只有65536行256列;xlsx可以have1048576rowsand16384Column","xls占用空间大,xlsx占用空间小,运行速度会更快"));RowRenderDataheadRow=Rows.of("ID","Name","电子邮件","电话","描述").textColor("FFFFFF").bgColor("4472C4").center().create();TableRenderDatatable=Tables.create(headRow);getUserList().forEach(a->table.addRow(Rows.create(a.getId()+"",a.getUserName(),a.getEmail(),a.getPhoneNumber()+"",a.getDescription())));content.put("poiTable",table);Resourceresource=newClassPathResource("pdai-guli.png");content.put("poiImage",Pictures.ofStream(newFileInputStream(resource.getFile())).create());返回XWPFTemplate.compile(newClassPathResource("poi-tl-template.docx").getFile()).render(content);}privateListgetUserList(){ListuserList=newArrayList<>();for(inti=0;i<5;i++){userList.add(User.builder().id(Long.parseLong(i+"")).userName("pdai"+i).email("pdai@pdai.tech"+i).phoneNumber(121231231231L).description("helloworld"+i).build());}returnuserList;}准备模板导出word导出markdown为wordcontroller中的方法@ApiOperation("根据markdown下载Word")@GetMapping("/word/downloadMD")publicvoiddownloadMD(HttpServletResponseresponse){try{XWPFTemplate文档=userService.generateWordXWPFTemplateMD();response.reset();response.setContentType("aapplication/octet-stream");response.setHeader("Content-disposition","attachment;filename=user_word_"+System.currentTimeMillis()+".docx");OutputStreamos=response.getOutputStream();document.write(os);os.close();}catch(Exceptione){e.printStackTrace();}}Service中实现的方法@OverridepublicXWPFTemplategenerateWordXWPFTemplateMD()throwsIOException{MarkdownRenderDatacode=newMarkdownRenderData();Resourceresource=newClassPathResource("test.md");code.setMarkdown(newString(Files.readAllBytes(resource.getFile().toPath())));code.setStyle(MarkdownStyle.newStyle());Mapdata=newHashMap<>();data.put("md",code);Configureconfig=Configure.builder().bind("md",newMarkdownRenderPolicy()).build();returnXWPFTemplate.compile(新的ClassPathResource(“降价_template.docx").getFile(),config).render(data);}准备模板导出word示例源码https://github.com/realpdai/t...参考文章http:///deepoove.com/poi-tl/更多内容告别碎片化学习,一站式系统化学习无套路后端开发:Java全栈知识体系(https://pdai.tech)