freemarker的应用:java使用word模板生成word-(含有完整demo)

青年:新产品中的监测模块每天会生成新的监测数据,对于这些监测数据可提供word文档下载。按理说用poi是可以解决的,但是目前的痛点在于,监测数据的种类很多,每种监测数据的word模板也各不相同,并且在将来文档模板内容以及排版样式还会有变化。使用poi的方式,会使工作量剧增,将来扩展也存在很大的问题,大师你看该怎么办?

禅师:这个问题很有意思,目前生成文档的主流方式确实是使用poi。针对你的这种特殊需求确实需要就事论事,我的建议使用freemarker模板生成word。

青年:freemarker是模板引擎,他是把由模板语言写成的模板生成文本文件,思路上是符合需求的。只要在word文档中需要展示的数据用模板语言标记即可,可是问题是freemarker可以把word模板直接生成word文件吗?我的word模板如图:

freemarker的应用:java使用word模板生成word-(含有完整demo)_第1张图片

禅师:肯定不能把word模板直接作为freemarker的模板生成word的。需要把word模板另存为xml文件,用这个xml文件作为freemarker的模板生成word,如图:

我给你一个(demo-mydoc点击下载),只要在template文件夹下放入这个xml模板,运行Test.java文件就可以。

青年:大师,出问题了,我严格按照你的要求运行时发生了如下的错误:

freemarker.core.ParseException: Parsing error in template "company.xml" in line 3, column 20887:
Encountered "<", but was expecting one of:
    
    
    "false"
    "true"
    
    
    "."
    "+"
    "-"
    "!"
    "["
    "("
    "{"
    
	at freemarker.core.FMParser.generateParseException(FMParser.java:4672)
	at freemarker.core.FMParser.jj_consume_token(FMParser.java:4543)
	at freemarker.core.FMParser.UnaryExpression(FMParser.java:340)
	at freemarker.core.FMParser.MultiplicativeExpression(FMParser.java:452)
	at freemarker.core.FMParser.AdditiveExpression(FMParser.java:402)

可是我有时模板中只有一个参数的时候,比如${name},就可以正确的显示,一旦多个参数的时候就报错,甚至有时重写一遍模板,哪怕只有一个参数${name}的时候也报错,怎么会时而可以运行时而报错,像躲迷藏似的,确实让人抓狂,大师能不能指点一二。

禅师哈哈一笑后说:年轻人写代码的时候要有耐心,尤其在程序报错的时候更要加倍耐心。我们可以看到报错的原因是因为:freemarker.core.ParseException: Parsing error in template "company.xml" in line 3, column 20887,肯定是模板解析出现问题,也就是解析没成功呗,给你一个查看xml的工具(firstobject xml editor点击下载),看看模板变量是否有问题。

青年用firstobject xml editor工具打开模板文件,按F8格式化,双击左边w:body,定位到该标签如图:

freemarker的应用:java使用word模板生成word-(含有完整demo)_第2张图片


中果然看到问题所在:${name}被分隔成了若干块,如图:

freemarker的应用:java使用word模板生成word-(含有完整demo)_第3张图片

这种情况下,freemarker是解析不出模板命令的,改正做法就保留一个完整的${name},其余的都删除,如图:

其余的模板命令以此类推。然后把xml模板放到demo中,运行得到如图结果:

freemarker的应用:java使用word模板生成word-(含有完整demo)_第4张图片

禅师:干的不错,看来问题就出在了word模板另存为xml模板的时候,这应该是word软件的一个bug。

青年:感谢大师,现在心情舒畅多了!

 

总结:

1.word模板另存为xml文档,由于word软件本身的原因,会把模板命令比如$("name")分隔成若干块,导致freemarker无法解析。

2.需要用firstobject xml editor工具查看xml模板,手动修改,保留完整的模板命令块。

3.将手动修改好的xml拷进demo中,可成功运行。

4.xml格式的word换行标记

5.列宽节点属性

你可能感兴趣的:(freemarker)