生成标准格式word请戳这里==>java使用freemarker导出word(标准格式版)
需求背景:根据模板的样式,导出不同内容的word。内容包括文字,图片,页眉等。
经过不同的尝试,最终选择使用freemarker来实现。
选择的原因:支持多图片,可以根据编辑的word模板导出,样式不会错乱。
主要分为以下几步:
- 创建一个docx的word文档,编辑好模板,比如trip.docx。
- trip.docx另存为trip.xml
- 格式化trip.xml(方便阅读和替换里面的变量)
- 替换变量,更改为trip.ftl放入项目中
- java代码填充数据,并保存word
具体操作如下:
-
第一步:创建word文档trip.docx
如图:
从图中可以看出,这个文档包含的内容。对于数据结构相同的内容在模板中可以只写一次。
比如:图中的日期和城市,只要写出第一天就行。
图中的行程设计也只需要写DAY1的全部内容即可。其他相同数据结构,在freemarker中进行循环遍历。 -
第二步:把trip.docx另存为trip.xml
-
使用文本编辑工具打开trip.xml,可以notepad++或者sublime text3或者其他编辑器打开。我使用的是sublime text3。打开后会发现xml格式是压缩的,可以进行格式化一下(百度xml格式化或者使用编辑器的插件)。如图:
格式化前:
格式化后:
-
第四步,找到对应的内容用变量替代。
我们在模板中可以看到,需要替换的内容主要包含:文字内容,表格内容,页眉,单个的图片,列表图片。 这当中比较复杂的就是列表图片。 这里给出一个mock数据结构:
{
"title": "西班牙10日精彩游",
"desc": "共8天, 1个国家, 10个城市",
"coverImg": "https://dpic.tiankong.com/39/x9/QJ8302262920.jpg",
"qrCode": "https://dpic.tiankong.com/5a/we/QJ6256685144.jpg",
"userName": "兴国",
"levelName": "旅行定制师",
"dayBrief": [
{
"date": "DAY1",
"cities": [
"马德里"
]
},
{
"date": "DAY2",
"cities": [
"马德里"
]
},
{
"date": "DAY3",
"cities": [
"马德里",
"塞哥维亚",
"马德里"
]
}
],
"googleMap": "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1548689372&di=bc427f35f193dcae40177e4cf8b0e2e9&imgtype=jpg&er=1&src=