一、学习背景
Freemarker 是一款强大的模板引擎,可以用来生成网页、邮件、文档等。对于简单的 Word 文档导出,只需要手动编写 ftl 文件即可。但如果要导出复杂的文档,比如带有复杂样式、页眉页脚、内嵌图片、批注等,手动编写模板就行不通了。现在提出一个从目标文档出发的解决方案:先将目标 Word 模板文档转换为 xml 文档,然后将 xml 文档转换为 ftl 文档,手动替换模板中的变量之后即可导出复杂 Word 。

二、根据目标文档获取 ftl 文档
我们以导出房屋租赁合同文档为例,模板中有房东、租客信息、房屋信息等。

1. 将目标模板转换为 xml 文档
操作 Word 文档,点击【文件】,另存为 xml 文档。

用 NotePad++ 或 Sublime 打开 xml 文档,内容缺乏层次感,这里需要格式化一下。

2. 将 xml 文档转换为 ftl 文档
格式化之后的 xml 文档,选择【文件】,另存为 ftl 文档。接下来需要手动替换模板参数。
文本参数:根据模板中的默认值,找到其所在位置,直接替换。

图片参数:图片参数是对图片进行 Base64 加密之后的值,加密操作可以由 Java 来完成。

三、使用 Java 根据 ftl 模板导出 Word 文档
在 Resource 目录下新建文件夹 freemarker_template,将 ftl 文档粘贴进去。

图片 Base64 位编码:
1 | import com.company.exception.ServiceException; |
解析模板内容实现:
1 | import com.company.exception.ServiceException; |
单元测试:
1 | import ImageService; |
注意: 通过这种方式导出的 Word 文档,本质上还是 xml 文档,因此必须使用 .doc 后缀,具体请查看MsOffice Word docx 研究。
运行起来,导出租房合同-打工人.doc。

四、总结
通过将目标模板转换为 ftl 文档,再解析得到目标文档的办法,理论上可以应对任何复杂程度的文档导出需求。但这种好办法也有弊端:ftl 文档包含太多的内联样式、复杂标签等,可读性太差。当模板发生变化时,手动替换太多的模板参数将会是一种灾难。
参考:




































