通过FreeMarker生成word文档doc(一)
FreeMarker是一款模板引擎:基于模板和要改变的数据,生成输出文本(Word、Html)的通用工具。它是一款简单的、专用语言,在模板中,我们只需专注如何显示数据,而在模板外专注于展示的数据。
1、maven包导入
<dependency> <groupId>org.freemarker</groupId> <artifactId>freemarker</artifactId> <version>2.3.31</version> </dependency>
2、生成ftl文件模板
2.1、创建word表格模板
2.2、生成xml文件
将2.1生成的word文件另存为xml文件,由于生成xml文件格式是行,可在线格式化xml文件。
2.3、生成ftl文件
将2.2生成的xml文件内容复制到代码编辑器中,如IDEA,这样做避免在生成word时已处理文件编码格式为UTF-8,然而还会出现乱码。是在本地编译时是其他的编码格式,所以用自己编辑器编写后再用代码读取不会出现乱码。
<w:body> <w:p w14:paraId="71B7BB9F" w14:textId="6448AFC4" w:rsidR="008959A4" w:rsidRDefault="001A60B2" w:rsidP="001A60B2"> <w:pPr> <w:pStyle w:val="1"/> <w:jc w:val="center"/> </w:pPr> <w:r> <w:rPr> <w:rFonts w:hint="eastAsia"/> </w:rPr> <w:t>四性检测报告(${link})</w:t> </w:r> </w:p> <w:tbl> <w:tblPr> <w:tblStyle w:val="a3"/> <w:tblW w:w="8532" w:type="dxa"/> <w:tblLook w:val="04A0" w:firstRow="1" w:lastRow="0" w:firstColumn="1" w:lastColumn="0" w:noHBand="0" w:noVBand="1"/> </w:tblPr> <w:tblGrid> <w:gridCol w:w="1385"/> <w:gridCol w:w="1385"/> <w:gridCol w:w="1385"/> <w:gridCol w:w="240"/> <w:gridCol w:w="1034"/> <w:gridCol w:w="167"/> <w:gridCol w:w="867"/> <w:gridCol w:w="598"/> <w:gridCol w:w="436"/> <w:gridCol w:w="1035"/> </w:tblGrid> <w:tr w:rsidR="001A60B2" w14:paraId="0E72CB28" w14:textId="77777777" w:rsidTr="00975BA5"> <w:trPr> <w:trHeight w:val="549"/> </w:trPr> <w:tc> <w:tcPr> <w:tcW w:w="1347" w:type="dxa"/> </w:tcPr> <w:p w14:paraId="29B97F33" w14:textId="636092AB" w:rsidR="001A60B2" w:rsidRPr="00AF1AEA" w:rsidRDefault="001A60B2" w:rsidP="00AF1AEA"> <w:pPr> <w:spacing w:line="480" w:lineRule="auto"/> <w:jc w:val="center"/> <w:rPr> <w:rFonts w:hint="eastAsia"/> <w:b/> <w:bCs/> </w:rPr> </w:pPr> <w:r w:rsidRPr="00AF1AEA"> <w:rPr> <w:rFonts w:hint="eastAsia"/> <w:b/> <w:bCs/> </w:rPr> <w:t>检验编号</w:t> </w:r> </w:p> </w:tc> <w:tc> <w:tcPr> <w:tcW w:w="1348" w:type="dxa"/> </w:tcPr> <w:p w14:paraId="4C519AC6" w14:textId="4350FD2B" w:rsidR="001A60B2" w:rsidRDefault="00E77D46" w:rsidP="00AF1AEA"> <w:pPr> <w:spacing w:line="480" w:lineRule="auto"/> <w:jc w:val="center"/> <w:rPr> <w:rFonts w:hint="eastAsia"/> </w:rPr> </w:pPr> <w:r> <w:t>${inspectionNumber}</w:t> </w:r> </w:p> </w:tc> <w:tc> <w:tcPr> <w:tcW w:w="1348" w:type="dxa"/> </w:tcPr> <w:p w14:paraId="71AB7033" w14:textId="754CF665" w:rsidR="001A60B2" w:rsidRPr="00AF1AEA" w:rsidRDefault="001A60B2" w:rsidP="00AF1AEA"> <w:pPr> <w:spacing w:line="480" w:lineRule="auto"/> <w:jc w:val="center"/> <w:rPr> <w:rFonts w:hint="eastAsia"/> <w:b/> <w:bCs/> </w:rPr> </w:pPr> <w:r w:rsidRPr="00AF1AEA"> <w:rPr> <w:rFonts w:hint="eastAsia"/> <w:b/> <w:bCs/> </w:rPr> <w:t>检验时间</w:t> </w:r> </w:p> </w:tc> <w:tc> <w:tcPr> <w:tcW w:w="1403" w:type="dxa"/> <w:gridSpan w:val="3"/> </w:tcPr> <w:p w14:paraId="58FC3F4D" w14:textId="76BBE3B7" w:rsidR="001A60B2" w:rsidRDefault="00975BA5" w:rsidP="00AF1AEA"> <w:pPr> <w:spacing w:line="480" w:lineRule="auto"/> <w:jc w:val="center"/> <w:rPr> <w:rFonts w:hint="eastAsia"/> </w:rPr> </w:pPr> <w:r> <w:t>${inspectionTime}</w:t> </w:r> </w:p> </w:tc> <w:tc> <w:tcPr> <w:tcW w:w="1426" w:type="dxa"/> <w:gridSpan w:val="2"/> </w:tcPr> <w:p w14:paraId="601540AA" w14:textId="2CEA1FDD" w:rsidR="001A60B2" w:rsidRPr="00AF1AEA" w:rsidRDefault="001A60B2" w:rsidP="00AF1AEA"> <w:pPr> <w:spacing w:line="480" w:lineRule="auto"/> <w:jc w:val="center"/> <w:rPr> <w:rFonts w:hint="eastAsia"/> <w:b/> <w:bCs/> </w:rPr> </w:pPr> <w:r w:rsidRPr="00AF1AEA"> <w:rPr> <w:rFonts w:hint="eastAsia"/> <w:b/> <w:bCs/> </w:rPr> <w:t>检验人</w:t> </w:r> </w:p> </w:tc> <w:tc> <w:tcPr> <w:tcW w:w="1431" w:type="dxa"/> <w:gridSpan w:val="2"/> </w:tcPr> <w:p w14:paraId="2A5EB5D7" w14:textId="7E60D814" w:rsidR="001A60B2" w:rsidRDefault="00E77D46" w:rsidP="00AF1AEA"> <w:pPr> <w:spacing w:line="480" w:lineRule="auto"/> <w:jc w:val="center"/> <w:rPr> <w:rFonts w:hint="eastAsia"/> </w:rPr> </w:pPr> <w:r> <w:t>${createName}</w:t> </w:r> </w:p> </w:tc> </w:tr> <w:tr w:rsidR="001A60B2" w14:paraId="351BA912" w14:textId="77777777" w:rsidTr="00975BA5"> <w:trPr> <w:trHeight w:val="487"/> </w:trPr> <w:tc> <w:tcPr> <w:tcW w:w="1347" w:type="dxa"/> </w:tcPr> <w:p w14:paraId="64E86D09" w14:textId="2A0B6707" w:rsidR="001A60B2" w:rsidRPr="00AF1AEA" w:rsidRDefault="001A60B2" w:rsidP="00975BA5"> <w:pPr> <w:spacing w:line="480" w:lineRule="auto"/> <w:jc w:val="center"/> <w:rPr> <w:rFonts w:hint="eastAsia"/> <w:b/> <w:bCs/> </w:rPr> </w:pPr> <w:r w:rsidRPr="00AF1AEA"> <w:rPr> <w:rFonts w:hint="eastAsia"/> <w:b/> <w:bCs/> </w:rPr> <w:t>检验总数</w:t> </w:r> </w:p> </w:tc> <w:tc> <w:tcPr> <w:tcW w:w="1348" w:type="dxa"/> </w:tcPr> <w:p w14:paraId="43ABD241" w14:textId="137A7868" w:rsidR="001A60B2" w:rsidRPr="00975BA5" w:rsidRDefault="00E77D46" w:rsidP="00975BA5"> <w:pPr> <w:spacing w:line="480" w:lineRule="auto"/> <w:jc w:val="center"/> <w:rPr> <w:rFonts w:hint="eastAsia"/> </w:rPr> </w:pPr> <w:r w:rsidRPr="00975BA5"> <w:t>${inspectionTotal}</w:t> </w:r> </w:p> </w:tc> <w:tc> <w:tcPr> <w:tcW w:w="1348" w:type="dxa"/> </w:tcPr> <w:p w14:paraId="31ADD53D" w14:textId="222C932F" w:rsidR="001A60B2" w:rsidRPr="00AF1AEA" w:rsidRDefault="001A60B2" w:rsidP="00975BA5"> <w:pPr> <w:spacing w:line="480" w:lineRule="auto"/> <w:jc w:val="center"/> <w:rPr> <w:rFonts w:hint="eastAsia"/> <w:b/> <w:bCs/> </w:rPr> </w:pPr> <w:r w:rsidRPr="00AF1AEA"> <w:rPr> <w:rFonts w:hint="eastAsia"/> <w:b/> <w:bCs/> </w:rPr> <w:t>通过数</w:t> </w:r> </w:p> </w:tc> <w:tc> <w:tcPr> <w:tcW w:w="1403" w:type="dxa"/> <w:gridSpan w:val="3"/> </w:tcPr> <w:p w14:paraId="74DA65E4" w14:textId="5C69DA23" w:rsidR="001A60B2" w:rsidRPr="00975BA5" w:rsidRDefault="00E77D46" w:rsidP="00975BA5"> <w:pPr> <w:spacing w:line="480" w:lineRule="auto"/> <w:jc w:val="center"/> <w:rPr> <w:rFonts w:hint="eastAsia"/> </w:rPr> </w:pPr> <w:r w:rsidRPr="00975BA5"> <w:t>${passTotal}</w:t> </w:r> </w:p> </w:tc> <w:tc> <w:tcPr> <w:tcW w:w="1426" w:type="dxa"/> <w:gridSpan w:val="2"/> </w:tcPr> <w:p w14:paraId="7983C8C5" w14:textId="293966A1" w:rsidR="001A60B2" w:rsidRPr="00AF1AEA" w:rsidRDefault="001A60B2" w:rsidP="00975BA5"> <w:pPr> <w:spacing w:line="480" w:lineRule="auto"/> <w:jc w:val="center"/> <w:rPr> <w:rFonts w:hint="eastAsia"/> <w:b/> <w:bCs/> </w:rPr> </w:pPr> <w:r w:rsidRPr="00AF1AEA"> <w:rPr> <w:rFonts w:hint="eastAsia"/> <w:b/> <w:bCs/> </w:rPr> <w:t>未通过数</w:t> </w:r> </w:p> </w:tc> <w:tc> <w:tcPr> <w:tcW w:w="1431" w:type="dxa"/> <w:gridSpan w:val="2"/> </w:tcPr> <w:p w14:paraId="4FBA31F7" w14:textId="63E25EEF" w:rsidR="001A60B2" w:rsidRPr="00975BA5" w:rsidRDefault="00E77D46" w:rsidP="00975BA5"> <w:pPr> <w:spacing w:line="480" w:lineRule="auto"/> <w:jc w:val="center"/> <w:rPr> <w:rFonts w:hint="eastAsia"/> </w:rPr> </w:pPr> <w:r w:rsidRPr="00975BA5"> <w:t>${nopassTotal}</w:t> </w:r> </w:p> </w:tc> </w:tr> <w:tr w:rsidR="001A60B2" w14:paraId="0886F626" w14:textId="77777777" w:rsidTr="00975BA5"> <w:trPr> <w:trHeight w:val="706"/> </w:trPr> <w:tc> <w:tcPr> <w:tcW w:w="8303" w:type="dxa"/> <w:gridSpan w:val="10"/> </w:tcPr> <w:p w14:paraId="04B40095" w14:textId="7C52A6BB" w:rsidR="001A60B2" w:rsidRPr="00AF1AEA" w:rsidRDefault="001A60B2" w:rsidP="00AF1AEA"> <w:pPr> <w:pStyle w:val="4"/> <w:jc w:val="center"/> <w:rPr> <w:rFonts w:hint="eastAsia"/> </w:rPr> </w:pPr> <w:r w:rsidRPr="00AF1AEA"> <w:rPr> <w:rFonts w:hint="eastAsia"/> </w:rPr> <w:t>检测概述</w:t> </w:r> </w:p> </w:tc> </w:tr> <w:tr w:rsidR="00975BA5" w14:paraId="07983F0B" w14:textId="77777777" w:rsidTr="00975BA5"> <w:trPr> <w:trHeight w:val="499"/> </w:trPr> <w:tc> <w:tcPr> <w:tcW w:w="4277" w:type="dxa"/> <w:gridSpan w:val="4"/> </w:tcPr> <w:p w14:paraId="3C9DD51D" w14:textId="22BB76CB" w:rsidR="00975BA5" w:rsidRPr="00AF1AEA" w:rsidRDefault="00975BA5" w:rsidP="00975BA5"> <w:pPr> <w:spacing w:line="480" w:lineRule="auto"/> <w:jc w:val="center"/> <w:rPr> <w:rFonts w:hint="eastAsia"/> <w:b/> <w:bCs/> </w:rPr> </w:pPr> <w:r w:rsidRPr="00AF1AEA"> <w:rPr> <w:rFonts w:hint="eastAsia"/> <w:b/> <w:bCs/> </w:rPr> <w:t>档号</w:t> </w:r> </w:p> </w:tc> <w:tc> <w:tcPr> <w:tcW w:w="1006" w:type="dxa"/> </w:tcPr> <w:p w14:paraId="1FC31D7C" w14:textId="77777777" w:rsidR="00975BA5" w:rsidRPr="00AF1AEA" w:rsidRDefault="00975BA5" w:rsidP="00975BA5"> <w:pPr> <w:spacing w:line="480" w:lineRule="auto"/> <w:jc w:val="center"/> <w:rPr> <w:b/> <w:bCs/> </w:rPr> </w:pPr> <w:r w:rsidRPr="00AF1AEA"> <w:rPr> <w:rFonts w:hint="eastAsia"/> <w:b/> <w:bCs/> </w:rPr> <w:t>真实性</w:t> </w:r> </w:p> </w:tc> <w:tc> <w:tcPr> <w:tcW w:w="1007" w:type="dxa"/> <w:gridSpan w:val="2"/> </w:tcPr> <w:p w14:paraId="5E5C3851" w14:textId="12E96B39" w:rsidR="00975BA5" w:rsidRPr="00AF1AEA" w:rsidRDefault="00975BA5" w:rsidP="00975BA5"> <w:pPr> <w:spacing w:line="480" w:lineRule="auto"/> <w:jc w:val="center"/> <w:rPr> <w:b/> <w:bCs/> </w:rPr> </w:pPr> <w:r w:rsidRPr="00AF1AEA"> <w:rPr> <w:rFonts w:hint="eastAsia"/> <w:b/> <w:bCs/> </w:rPr> <w:t>完整性</w:t> </w:r> </w:p> </w:tc> <w:tc> <w:tcPr> <w:tcW w:w="1006" w:type="dxa"/> <w:gridSpan w:val="2"/> </w:tcPr> <w:p w14:paraId="08DDC354" w14:textId="3E9B1407" w:rsidR="00975BA5" w:rsidRPr="00AF1AEA" w:rsidRDefault="00975BA5" w:rsidP="00975BA5"> <w:pPr> <w:spacing w:line="480" w:lineRule="auto"/> <w:jc w:val="center"/> <w:rPr> <w:b/> <w:bCs/> </w:rPr> </w:pPr> <w:r w:rsidRPr="00975BA5"> <w:rPr> <w:rFonts w:hint="eastAsia"/> <w:b/> <w:bCs/> </w:rPr> <w:t>可用性</w:t> </w:r> </w:p> </w:tc> <w:tc> <w:tcPr> <w:tcW w:w="1007" w:type="dxa"/> </w:tcPr> <w:p w14:paraId="28D4D265" w14:textId="11FF43EE" w:rsidR="00975BA5" w:rsidRPr="00975BA5" w:rsidRDefault="00975BA5" w:rsidP="00975BA5"> <w:pPr> <w:spacing w:line="480" w:lineRule="auto"/> <w:jc w:val="center"/> <w:rPr> <w:rFonts w:hint="eastAsia"/> <w:b/> <w:bCs/> </w:rPr> </w:pPr> <w:r w:rsidRPr="00975BA5"> <w:rPr> <w:rFonts w:hint="eastAsia"/> <w:b/> <w:bCs/> </w:rPr> <w:t>安全性</w:t> </w:r> </w:p> </w:tc> </w:tr> <#list summary as work> <w:tr w:rsidR="003B13EC" w14:paraId="716A936D" w14:textId="77777777" w:rsidTr="00975BA5"> <w:trPr> <w:trHeight w:val="499"/> </w:trPr> <w:tc> <w:tcPr> <w:tcW w:w="4277" w:type="dxa"/> <w:gridSpan w:val="4"/> </w:tcPr> <w:p w14:paraId="6742E110" w14:textId="3056EBE4" w:rsidR="003B13EC" w:rsidRPr="00A15B12" w:rsidRDefault="00A15B12" w:rsidP="00975BA5"> <w:pPr> <w:spacing w:line="480" w:lineRule="auto"/> <w:jc w:val="center"/> <w:rPr> <w:rFonts w:hint="eastAsia"/> </w:rPr> </w:pPr> <w:r w:rsidRPr="00A15B12"> <w:t>${work.DH}</w:t> </w:r> </w:p> </w:tc> <w:tc> <w:tcPr> <w:tcW w:w="1006" w:type="dxa"/> </w:tcPr> <w:p w14:paraId="0BC0FF94" w14:textId="11A45DAD" w:rsidR="003B13EC" w:rsidRPr="00A15B12" w:rsidRDefault="00A15B12" w:rsidP="00975BA5"> <w:pPr> <w:spacing w:line="480" w:lineRule="auto"/> <w:jc w:val="center"/> <w:rPr> <w:rFonts w:hint="eastAsia"/> </w:rPr> </w:pPr> <w:r w:rsidRPr="00A15B12"> <w:rPr> <w:rFonts w:hint="eastAsia"/> </w:rPr> <w:t>${work.authenticity}</w:t> </w:r> </w:p> </w:tc> <w:tc> <w:tcPr> <w:tcW w:w="1007" w:type="dxa"/> <w:gridSpan w:val="2"/> </w:tcPr> <w:p w14:paraId="06197F4D" w14:textId="69AA7323" w:rsidR="003B13EC" w:rsidRPr="00A15B12" w:rsidRDefault="00A15B12" w:rsidP="00975BA5"> <w:pPr> <w:spacing w:line="480" w:lineRule="auto"/> <w:jc w:val="center"/> <w:rPr> <w:rFonts w:hint="eastAsia"/> </w:rPr> </w:pPr> <w:r w:rsidRPr="00A15B12"> <w:rPr> <w:rFonts w:hint="eastAsia"/> </w:rPr> <w:t>${work.integrity}</w:t> </w:r> </w:p> </w:tc> <w:tc> <w:tcPr> <w:tcW w:w="1006" w:type="dxa"/> <w:gridSpan w:val="2"/> </w:tcPr> <w:p w14:paraId="1B3558BC" w14:textId="4B0FF5E2" w:rsidR="003B13EC" w:rsidRPr="00A15B12" w:rsidRDefault="00A15B12" w:rsidP="00975BA5"> <w:pPr> <w:spacing w:line="480" w:lineRule="auto"/> <w:jc w:val="center"/> <w:rPr> <w:rFonts w:hint="eastAsia"/> </w:rPr> </w:pPr> <w:r w:rsidRPr="00A15B12"> <w:rPr> <w:rFonts w:hint="eastAsia"/> </w:rPr> <w:t>${work.availability}</w:t> </w:r> </w:p> </w:tc> <w:tc> <w:tcPr> <w:tcW w:w="1007" w:type="dxa"/> </w:tcPr> <w:p w14:paraId="6899DAC5" w14:textId="3E58B5B8" w:rsidR="003B13EC" w:rsidRPr="00A15B12" w:rsidRDefault="00A15B12" w:rsidP="00975BA5"> <w:pPr> <w:spacing w:line="480" w:lineRule="auto"/> <w:jc w:val="center"/> <w:rPr> <w:rFonts w:hint="eastAsia"/> </w:rPr> </w:pPr> <w:r w:rsidRPr="00A15B12"> <w:rPr> <w:rFonts w:hint="eastAsia"/> </w:rPr> <w:t>${work.security}</w:t> </w:r> </w:p> </w:tc> </w:tr> </#list> </w:tbl> <w:p w14:paraId="538BDBA0" w14:textId="77777777" w:rsidR="001A60B2" w:rsidRPr="001A60B2" w:rsidRDefault="001A60B2" w:rsidP="001A60B2"> <w:pPr> <w:rPr> <w:rFonts w:hint="eastAsia"/> </w:rPr> </w:pPr> </w:p> <w:sectPr w:rsidR="001A60B2" w:rsidRPr="001A60B2"> <w:pgSz w:w="11906" w:h="16838"/> <w:pgMar w:top="1440" w:right="1800" w:bottom="1440" w:left="1800" w:header="851" w:footer="992" w:gutter="0"/> <w:cols w:space="425"/> <w:docGrid w:type="lines" w:linePitch="312"/> </w:sectPr> </w:body>
其中list集合遍历:<#list workof as work></#list>
3、Java方法生成doc文件
public void testReportSummary(String monitoringZongId){ Map<String,Object> map = new HashMap<>(); List<Map<String,String>> mapList = detectionMapper.selectMonitoringZong(monitoringZongId); List<Map<String,String>> mapListSummary = detectionMapper.selectMonitoringSummary(monitoringZongId); map.put("link", mapList.get(0).get("link")); map.put("inspectionNumber", mapList.get(0).get("inspectionNumber")); map.put("inspectionTime", mapList.get(0).get("inspectionTime")); map.put("createName", mapList.get(0).get("createName")); map.put("inspectionTotal", mapList.get(0).get("inspectionTotal")); map.put("passTotal", mapList.get(0).get("passTotal")); map.put("nopassTotal", mapList.get(0).get("nopassTotal"));
/*组装循环部分list*/ List<Map<String,String>> listSummary = new ArrayList<>(); for (Map<String,String> map2 : mapListSummary){ Map<String,String> map1 = new HashMap<>(); map1.put("DH", map2.get("dh")); map1.put("authenticity", map2.get("authenticity")); map1.put("security", map2.get("security")); map1.put("integrity", map2.get("integrity")); map1.put("availability", map2.get("availability")); listSummary.add(map1); } map.put("summary", listSummary); try { //ToWord.exportMillCertificateWord(response, map); DocumentHandler documentHandler = new DocumentHandler(); documentHandler.createDoc(map, detectionFilePath, detectionFileName, generatePath + File.separator + mapList.get(0).get("inspectionNumber") + ".doc"); } catch (Exception e) { e.printStackTrace(); } }
public class DocumentHandler { private Configuration configuration = null; public DocumentHandler() { configuration = new Configuration(new Version("2.3.0")); configuration.setDefaultEncoding("utf-8"); } public void createDoc(Map<String,Object> map, String detectionFilePath, String detectionFileName, String generatePath) { Template template = null; try { configuration.setDirectoryForTemplateLoading(new File(detectionFilePath)); template = configuration.getTemplate(detectionFileName); /*configuration已经设置了编码格式*/
//template.setEncoding("utf-8"); } catch (IOException e) { e.printStackTrace(); } // 输出文档路径及名称 File outFile = new File(generatePath); Writer out = null; try { out = new BufferedWriter(new OutputStreamWriter( new FileOutputStream(outFile), "utf-8")); } catch (Exception e1) { e1.printStackTrace(); } try { template.process(map, out); out.close(); } catch (TemplateException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }
5、生成结果
本文来自博客园,作者:曾经已是追忆,转载请注明原文链接:https://www.cnblogs.com/hehanhan/p/15730450.html