Java 将xml模板动态填充数据转换为word文档

本文介绍了如何使用Java结合Freemarker和Jacob库,将XML模板动态填充数据并转换为Word文档。首先,将Word文档另存为XML模板,然后通过Freemarker处理模板中的变量。接着,利用Jacob将处理后的XML转换为docx格式。详细步骤包括模板编辑、Java后台代码实现,以及转换图片和文档格式的方法。
摘要由CSDN通过智能技术生成

https://blog.csdn.net/abc231218/article/details/80512463

需要用到的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= 后面是图片的名称,不能一致,必须存不同的文件名,所以,这个需要改动,否则一旦所有文件名称一致,则会出现问题。

        (4)如果需要合并第一列的单元格,需要在tr加入标签:

            具体合并方法:<#if imageList_index == 0><w:vmerge w:val="restart"/><#else><w:vmerge/></#if>

                    a、开始合并的行:<w:vmerge w:val="restart"/>

                    b、需要合并的行:<w:vmerge/>

            上面的语句中,_index为imageList 的索引写法,因为需要合并,所以通过判断的方式,将第一个单元格作为合并起始行,其余需要合并的行需要添加结束标签。

        (5)如果不需要合并,则不用添加(4)中的语句

二、Java后台代码实现

    (1)创建一个封装图片对象的ImageBean类:

(由于list遍历中存了两张不同的图片,所以参数设计不太合理,可参考例子,自己进行优化)

package testXML;
/**
 * 图片bean
 */
public class ImageBean {

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值