需要用到的jar包:
commons-codec-1.10.jar
freemarker-2.3.21.jar
jacob-1.6.jar
实现思路:
1、先将word文档另存为 : Word 2003 XML文档(*.xml) 格式的模板文件;
2、通过Java程序,使用 freemarker.jar包转换为xml格式的word文档文件
3、使用jacob包,将xml格式的word文档文件,转换为docx格式的文档文件
具体实现步骤:
一、模板编辑
1、将word文档另存为xml模板:
2、模板中需要动态改变的内容,通过freemarker标签:${variableName}
说明:variableName是需要动态添加内容的一个标志符号,可自由命名
注意:freemarker标签:${variableName},不能再word文档中直接输入,需要通过记事本,或者其他notePad++ 文本编辑工具先写好,然后再复制到文档中,否则在转换为xml模板时会出问题。具体问题可百度查找
模板样式(参考):
3、处理将要替换的图片,通过xml编辑工具打开xml模板文件:(可使用notePad++打开)
两种替换图片方式,一种是直接动态插入一张图片,另一种是从数据库中读取,并循环插入图片
(1)直接动态插入单张图片:(编辑xml模板文件)
每个位置在保存模板前,放置一张图片,通过notePad++ 打开xml模板文件,找到对应的图片,在xml模板中,图片会发生转换,以base64的编码形式存在,只要找到一长串的字符就能确定这是一张图片;
把红框中的内容(后面还有很长),删除掉,直接替换freemarker标签,另外一张图片同样操作,如图所示:
(2)需要循环插入图片:(编辑xml模板文件)
循环插图,需要加入freemarker循环标签,xml模板中:一对 <tr></tr>,为一行;我的模板设置了表格,需要循环插入表格,那么需要将循环标签包围到图片所在的 tr 标签:
图片中横线说明:
(1)图片中因为有两个地方插入图片,所以需要将一个list对象中,要存两张图片的数据,
(2)<#list loopImageList as imgList> :loopImageList 可自由命名,但是在Java代码中动态填充的数据对象名要一致,imageList 作为一个遍历的对象名,等于将loopImageList的内容赋值给imageList ,获取对象中的属性值,通过imageList.attr 获取
(3)上面的 w:name