摘要:
環境基於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