之前项目有个需求,需要先动态生成word内容,然后再预览生成word的内容(不能修改).整理一下,方便以后使用.
网上参考了好多大神的博客.具体也忘了参考谁的了,如有侵权,请告知修改.
思路一:
将目标word文件另存为xml文件,将里面的需要动态生成的内容用freemarker的表达式${}替换.
用freemarker生成word的工具类,动态生成word. 这样生成的word实际上是xml文件,用办公软件能正常打开使用.
但是转PDF的时候发现转不成功.转过之后的PDF显示的不是word的格式字符,而是像xml文件的标签及字符,失败!
思路二:
word的docx文件其实属于zip的一种. 这里只需要对它的核心内容部分进行操作.其他数据不动.具体做法为:
1.用办公软件(wps/office)打开模板文件,将需要修改的内容,用freemarker的表达式${}替换.
(注意:需要循环展示的内容还需要在xml文件中处理)如下:
2.将模板docx文件重命名为.zip的压缩文件.
3.用解压工具打开,取出word/document.xml 文件.
4.此时用文本工具打开document.xml,内容不太好看,将文件格式化一下.(我这里没找到好的格式化工具,使用notepad没格好,最后用idea还行).格式化后如下.
5.在xml中需要循环的内容前增加如下标签:
6.说明
word中要填充的数据为map格式,${}中为map的key.如果还需要循环填充可以如下操作:
map1 map2 list
map1.put("userName",name);
list.add(map1);
map2.put("list",list);
map2.put("title",title);
map2即为要填充的所有数据.这样给list一个别名listKey 后,${}中如下填写即可.
7.将模板文件与xml文件保存到一个固定位置.我这里保存到了项目中:
8.准备工作完成,生成word工具类如下:
import freemarker.template.TemplateException;
import java.