使用模板引擎生成复杂Word文档

    当使用java代码生成word文档,要进行一些复杂的排版操作时比较困难,这时可以通过模板引擎(如 freemarker、velocity等)来生成想要的word文档。

步骤:

1.先准备好word文档模板,进行排版等操作,在需要替换填写变量字符,然后保存为xml格式。

例如在word中写入以下信息

使用模板引擎生成复杂Word文档

2.另存为xml格式(个人使用时都是保存为2003的xml,最好别用wps,生成的xml可能会有些出入)

使用模板引擎生成复杂Word文档

3.打开xml,找到需要替换的变量,用模板引擎定义的变量格式替换。我使用的是velocity,所以将var替换为${var}。

使用模板引擎生成复杂Word文档

4.然后将文件后缀改为模板引擎能识别文件,velocity使用的模板后缀为.vm,所以我将文件保存为test.vm

5.接下来的操作就是使用模板引擎将变量替换,输出文件时将文件后缀改回.doc就行了。

以上是生成简单文档的做法-----------------------------------------------------------------------------------

有时添加某些特殊元素,如:表格、图片、分页。我们可以根据word生成xml进行改造,利用模板引擎生成想要元素

-图片:在xml中图片元素为<w:pict>,找到该元素的位置,根据模板引擎的语法进行改写

使用模板引擎生成复杂Word文档

word中图片使用base64编码,将图片的base64编码填写入<w:binData>元素的位置就能显示图片了;

-表格:先编辑一个表格,再在xml中拷贝表格中的一行,进行输入数据的行数循环输出就行

-分页:将生成的word xml数据放入数组中,在页与页之间用word的分页符间隔即可。(注意:以下变量$pageContent的内容应当是word xml里<wx:sect>文档体元素中包含的数据,其中还要排除<w:sectPr>尾部信息元素的数据

使用模板引擎生成复杂Word文档


Word的xml中相关定义:

<w:br w:type="page"/> 分页符号

<w:pict>图片资源

<wx:sect> 文档体

<w:sectPr> 尾部信息

</w:tbl>表格

<w:tr>表格行

分页符(这是我自己在xml截取出的,你们可以自己保存一个多页的文档,在xml里找到它的分页符并使用它)

<w:p wsp:rsidR="001E05E9"wsp:rsidRDefault="001E05E9">

       <w:pPr>

       <w:widowControl/>

       <w:jc w:val="left"/>

       </w:pPr>

       <w:r>

       <w:br w:type="page"/>

       </w:r>

  </w:p>

 换页符:(有时在表格后添加不起作用)

<w:br w:type="page"/>