思路来源:https://blog.youkuaiyun.com/qq_41253573/article/details/83545536
本文章采用 freemarker 将word转xml再转ftl方法
引用FreeMarker的jar包。
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.31</version>
</dependency>
准备自己的word模板
批注:(${yhxx} 下面是有一张图片的,主要功能就是进行双重循环)
制作模板
将word转换为xml(一定要2003 XML文档类型,我这是word2010版本,wps是没有这个类型的)
使用Firstobject free XML editor工具,将转换的xml丢进去(左边类似目录,右边是源码),F8调整格式,我们只需要看body部分,点击body,看右边源码
找到自己模板中需要替换的地方,查看是否被分离,如果被分离了,将中间的删除即可
找到图片位置,为base64,手动改为替换{}类型
至此模板准备基本就OK啦,只需要在Firstobject free XML editor里另存为flt格式就行了,注意flt不要再用word打开了,如果你打开了,那么恭喜你,模板从头再来一次吧。
关键部分来了,请打起精神
导出来的图片大小就是你模板的大小,基本就是变形+严重缩小,因此还需要对图片大小进行替换。如:<v:shape id=“_x0000_i1030” type=“#_x0000_t75” style=“width:60pt;height:60pt”>中的60pt整体替换为你输入的值,控制导出图片的长和宽
因为我们要做循环导出,所以要加上<#list maps as map></#list> maps是Map<String, Object>中key,值为数组,map为自定义;
我这是mapList 所以我的循环写法是<#list mapList as mpas></#list>
取值
在里面还需要一个yhxx对应多张图片,所以也需要将图片循环,注意:是在<#list mapList as mpas></#list>添加图片循环的list
images就是上面我们自己代码里面put进去的值
最后别忘了两个list结束
到这我们的模板最终完成了,将xml另存为ftl文件
最后给模板赋值的代码我这就不添加了请点击该博主地址有完整代码
到这基本大家都够用了
但是如果有人跟我是一样的功能需要一段文字对应多个图片,需要改一小块上面ftl文件(此地方影响了半天的时间,感谢我的老大)
如果不修改会出现每条对应第一张的图片是同一个!!
将这个word用Notepad++打开会发现,两个图片的base64是不相同的,就是下面的将上面覆盖掉了
到这里,相信已经看出来了两个图片的name和src相同了,所以下面的这个图片将上面的覆盖掉了
解决办法,在name和src再加值,让它们不相同就行了
最后还有一个坑,如果要把你的项目部署到liunx上,上面博主地址的代码需要改一个小地方,不然会报错找不到xxx.ftl模板(就是我们的word模板)(此地方让我部署时又花了几个小时时间,在此再次感谢我的老大 !!!)
第一步:将ftl模板放到resources/template包下
代码处需要修改的地方:
修改为
到此,在liunx上能成功部署
最后有一个小问题:因为循环是在表格中进行,所以导出文件的时候有表格不好看,所以这里给出去掉表格的方法
右键表格:选择“边框和底纹”-选择“无”
到这步就去掉了表格,但可能会是变为了虚线,去掉虚线
点击工具类“视图”,选择取消“表格虚框”(完成)
批注(该word导出是直接输出并且是.doc类型,如需转二进制返回给前端(做预览功能),需要转为docx类型,我没能写出,转换完成返回前端展示出现图片丢失,如各位能有方法,望告知)
批注(第一次写这么长博客,如有错误,望指出)
思路来源:https://blog.youkuaiyun.com/qq_41253573/article/details/83545536 给模板赋值代码该博主是完整的
如没有图片或者固定图片导出 参照该博主简单快捷