同事写代码的时候使用了freemarker模版框架,该框架的原理是:利用语法替换模版文件中的自定义变量进而实现根据模板生成不同数据的word文档。由于没有接触过此类代码,首先从以下几个方面进行分析 1.是否将同事的代码用poi-tl重构 。 2.熟悉使用该freemarker语法,以便以后更容易修改相关代码。
由于现存大部分word代码是由freemarker模板引擎生成所以我选择了了解freemarker语法,之前代码的问题是导出后是doc后缀文件,且企业微信发送时文档存在大量乱码无法给客户查看(此处也有两种解决方案:一、将doc文件转化为pdf后乱码消失发送给客户 二、从原理解决乱码问题)
由于客户存在编辑文本后再打印的习惯所以我选择了从原理解决乱码问题让客户可编辑文本,我的方案是首先生成的文档要从doc后缀改成docx后缀。
doc后缀的word文件为2007年之前的WORD版本,使用freemaker模板引擎生成doc时需要将模板word另存为xml文件,将变量引入xml文件后再将xml后缀改成ftl后缀,最后生成,由于doc不是严格意义上的xml,而是另存到xml再到doc时容易导致未知丢失,所以特别容易导致报错和文件乱码
docx后缀的word文件为2007年之后的WORD版本,使用freemaker模板引擎生成docx时,docx实际上是一个zip压缩包,你可以把它重命名后缀为test.zip,得到压缩包
然后解压就会得到以下目录
此处比较有作用的文档大都在word文件夹中,以下为word文件夹下的文件
此处document.xml为模板文件,freemarker模板引擎正是通过修改该文件实现文章数据的修改,
embeddings文件夹内则是存储的图表源数据文件,也就是下图的excel文件,修改里面的数据相当于在word里面编辑图表中的数据,
embeddings里面的excel与freemarker模板引擎能修改的数据存在关联关系,找到关联的那个文件里的数据使用模板引擎进行修改就可以修改图表数据,这时候我们找到_rels文件夹内的document.xml.rels文件(该文件为配置关联文件,可以查到关联关系),用记事本打开该文件,excel的id为rId4,由此可知,与excel关联的文件位置在target标签处显示的charts/chart1.xml文件,
从图三处找到该文件,修改该文件中的值即可修改DOCX中图表中的数据内容,修改完后将文件夹重新整个压缩成zip文件,再将.zip后缀改为.docx后缀即可得到修改后的word,此完整过程用Java调用freedmarker模板引擎进行即可自动生成相关数据,
好了,既然原理清楚了那么小编也该用Java完成自己迟迟没有完成的任务了,小编会另外写一套案例分别用freemarker和poi-tl生成word,相关源码案例在下期公布