Java使⽤FreeMarker⾃动⽣成Word⽂档(带图⽚和表单)
Java使⽤FreeMarker⾃动⽣成Word⽂档(带图⽚和表单)
1 背景
xml文件怎么打开近期⼯作中需要编写⼤量格式相同但数据不同的Word⽂档,因此研究了⼀下Java⾃动⽣成Word⽂档的技术。
Java⾃动⽣成Word⽂档的技术⽅案较多,本⽂使⽤的是Java + FreeMarker的⽅案,该⽅案分为两个步骤:创建FreeMarker格式的Word模板、FreeMarker根据模板⽣成Word⽂档。
2 ⽬标效果
本⽂要使⽤Java + FreeMarker⾃动⽣成的Word⽂档的效果如下图所⽰:
3 创建Word模板
3.1 创建模板⽂档
使⽤Word创建⼀个名为WordTemplate.docx的⽂档,并按下图所⽰编辑模板⽂档的内容和样式
说明:
说明1:模板⽂档中${}是占位符,即⽣成Word⽂档时占位符会被真实的数据替换。例如${name}在⽣成⽂档时会被name这个属性的值替换 ,${}在⽣成⽂档时会被userObj这个对象的name属性的值替换。
说明2:由于要在⽣成的Word⽂档中⾃动插⼊⼀张图⽚,因此,需要在模板⽂档中插⼊⼀张图⽚作为占位符,如上图所⽰。
3.2 转换模板⽂档
使⽤Word将模板⽂档另存为Word XML ⽂档(*.xml)格式,如下图所⽰:
3.3 处理模板⽂档中的占位符
转换后⽣成的是⼀个l模板⽂档,使⽤EditPlus等软件打开l⽂档(如下图),可以发现很不⽅便阅读,可以借助xml在线格式化⼯具( 将l⽂档的内容进⾏格式化。
打开格式化后的l⽂档可以发现,Word在转换时会⾃动的将占位符分开(如下图1),因此需要把占位符之间多余的部分删除掉(如下图2)。每个占位符如果被分开了,就需要进⾏这样的处理,但是如果是⼀段⽂字被分开了,就不需要进⾏处理:
3.4 处理模板⽂档中的图⽚
模板⽂档在转换成xml格式时,图⽚的内容会被转换成很长的16进制的字符串,如下图所⽰:
将<pkg:binaryData></pkg:binaryData>标签中16进制字符串形式的图⽚内容替换成${userObj.photo}占位符(这⾥的userObj.photo是与Java程序中保持⼀致),替换后的效果如下图所⽰:
3.5 处理模板⽂档中的表单
在⾃动⽣成Word⽂档中的表单时,由于表头那⼀⾏只⽣成⼀次,⽽表单中的数据是循环⽣成的,因此,需要在xml格式的模板⽂档中表头那⼀⾏的后⾯添加如下的内容:
<#list userList as user>
并在对应的地⽅添加如下的内容: