摘要:
环境基于freemarker模板引擎实现,模板引擎中文文档参见:http://freemarker.foofun.cn/。实现原理,先将word需要填充的字段填入,格式:${xxx}。然后将word另存为xml,然后重命名为xxx.ftl得到模板。
myGitResource: https://github.com/duangYiXia/freemarkerWord 测试通过,可以直接使用
具体步骤:
- 引入依赖
<!-- https://mvnrepository.com/artifact/org.freemarker/freemarker -->
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.29</version>
</dependency>
- 复制FreemarkerUtils,在myGitResource中获取
- 准备好word文档,如:
按途中格式填充。
对于
这一块不需要每个填充 ,只需要修改ftl,详见第5步骤 - 将word另存为xml,注意选项
- 调整xml
1> 首先格式化xml,可在线格式化,地址:https://www.sojson.com/xml.html
2> 调整${xxx}被分离的部分,如:
<w:tc>
<w:tcPr>
<w:tcW w:w="1575" w:type="dxa"/>
<w:vAlign w:val="center"/>
</w:tcPr>
<w:p w:rsidR="003F436A" w:rsidRDefault="00946E62">
<w:pPr>
<w:jc w:val="center"/>
<w:rPr>
<w:b/>
<w:sz w:val="24"/>
</w:rPr>
</w:pPr>
<w:r>
<w:rPr>
<w:rFonts w:hint="eastAsia"/>
<w:b/>
<w:sz w:val="24"/>
</w:rPr>
<w:t>**$**</w:t>
</w:r>
<w:r>
<w:rPr>
<w:b/>
<w:sz w:val="24"/>
</w:rPr>
<w:t>**{name}**</w:t>
</w:r>
</w:p>
</w:tc>
将分开的$ 和 {name}```写在一起,如下:
<w:tc>
<w:tcPr>
<w:tcW w:w="1575" w:type="dxa"/>
<w:vAlign w:val="center"/>
</w:tcPr>
<w:p w:rsidR="003F436A" w:rsidRDefault="00946E62">
<w:pPr>
<w:jc w:val="center"/>
<w:rPr>
<w:b/>
<w:sz w:val="24"/>
</w:rPr>
</w:pPr>
<w:r>
<w:rPr>
<w:rFonts w:hint="eastAsia"/>
<w:b/>
<w:sz w:val="24"/>
</w:rPr>
<w:t>**${name}**</w:t>
</w:r>
</w:p>
</w:tc>
几乎所有$ 、{ 、 xxx 、 }都是分离的,需要全部改完
3> 添加循环填充的代码,如第3步骤中的 获奖情况这一栏,可以修改如下:
**<#list list as item>**
<w:tr w:rsidR="003F436A">
<w:trPr>
<w:cantSplit/>
<w:trHeight w:val="643"/>
</w:trPr>
<w:tc>
<w:tcPr>
<w:tcW w:w="538" w:type="dxa"/>
<w:vMerge/>
<w:vAlign w:val="center"/>
</w:tcPr>
<w:p w:rsidR="003F436A" w:rsidRDefault="003F436A">
<w:pPr>
<w:spacing w:before="72"/>
<w:jc w:val="center"/>
<w:rPr>
<w:b/>
<w:sz w:val="24"/>
</w:rPr>
</w:pPr>
</w:p>
</w:tc>
<w:tc>
<w:tcPr>
<w:tcW w:w="875" w:type="dxa"/>
<w:vAlign w:val="center"/>
</w:tcPr>
<w:p w:rsidR="003F436A" w:rsidRDefault="002301BB" w:rsidP="002301BB">
<w:pPr>
<w:spacing w:before="72" w:afterLines="50" w:after="156"/>
<w:rPr>
<w:b/>
<w:sz w:val="24"/>
</w:rPr>
</w:pPr>
<w:r>
<w:rPr>
<w:b/>
<w:sz w:val="24"/>
</w:rPr>
<w:t>${item.d}</w:t>
</w:r>
</w:p>
</w:tc>
<w:tc>
<w:tcPr>
<w:tcW w:w="3375" w:type="dxa"/>
<w:gridSpan w:val="3"/>
<w:vAlign w:val="center"/>
</w:tcPr>
<w:p w:rsidR="003F436A" w:rsidRDefault="002301BB">
<w:pPr>
<w:spacing w:before="72" w:afterLines="50" w:after="156"/>
<w:ind w:firstLineChars="100" w:firstLine="241"/>
<w:rPr>
<w:b/>
<w:sz w:val="24"/>
</w:rPr>
</w:pPr>
<w:r>
<w:rPr>
<w:rFonts w:hint="eastAsia"/>
<w:b/>
<w:sz w:val="24"/>
</w:rPr>
<w:t>${item.prizeName}</w:t>
</w:r>
</w:p>
</w:tc>
<w:tc>
<w:tcPr>
<w:tcW w:w="4275" w:type="dxa"/>
<w:gridSpan w:val="3"/>
<w:vAlign w:val="center"/>
</w:tcPr>
<w:p w:rsidR="003F436A" w:rsidRDefault="002301BB">
<w:pPr>
<w:spacing w:before="72" w:afterLines="50" w:after="156"/>
<w:ind w:firstLineChars="100" w:firstLine="241"/>
<w:rPr>
<w:b/>
<w:sz w:val="24"/>
</w:rPr>
</w:pPr>
<w:r>
<w:rPr>
<w:rFonts w:hint="eastAsia"/>
<w:b/>
<w:sz w:val="24"/>
</w:rPr>
<w:t>${item.awardUnit}</w:t>
</w:r>
</w:p>
</w:tc>
</w:tr>
**</#list>**
其中list为传入的列表引用名。
4>将图片的字符串编码删除,改成 ${image}, image作为参数传入
6. 将调整好的xml重命名为xxx.ftl格式,作为模板放入resource下file文件下,cp一个头像(注意大小).jpg的到file下,代码使用
7. 使用如下:
FreemarkerUtils.build(this.getClass(), path).setTemplate(srcFileName).generate(dataMap,
httpServletResponse.getOutputStream());
详见:https://github.com/duangYiXia/freemarkerWord