【工作应用】Java根据word模板动态生成word文档(SpringBoot项目)

需求

需求:根据 word 模板,动态填充模板内容,生成新的 word。实现:获取数据库数据,根据 word 模板填充内容,生成新的 word 文档。

应用场景:笔者的应用场景是生成客户合同,根据用户提交的具体合同内容,填充进合同模板内,生成新的 word 即填充了内容的完整合同。

使用技术

1、poi-tl

poi-tl(poi template language)是基于 Apache POI 的 Word 模板引擎,纯 Java 组件,跨平台,代码短小精悍,通过插件机制使其具有高度扩展性。官方文档:poi-tl 官方文档(http://deepoove.com/poi-tl/)

2、poi-tl 的优点

根据官方文档介绍,poi-tl 具有以下优点:A、支持动态填充文本、图片、表格、列表、文档B、支持 DOCX 格式,所有的模板标签都是以 {{开头,以}} 结尾,模板标签可以出现在任何非文本框的位置,包括页眉,页脚,表格内部等等。C、poi-tl 的一个核心特点是数据模型与样式的分离,同样的数据模型可以用来渲染各种不同样式的模板。D、文档的样式继承模板标签的样式,即如果模板 {{title}} 是蓝色微软雅黑加粗四号字体,则替换后的文本也是蓝色微软雅黑加粗四号字体。

具体应用

1、依赖

<dependency>
    <groupId>com.deepoove</groupId>
    <artifactId>poi-tl</artifactId>
    <version>1.5.0</version>
</dependency>

2、Java 类

import com.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.data.PictureRenderData;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.Assert;

import java.io.File;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * @author Jerry
 * @Title: WordUtil
 * @Description: Word工具类
 * @date 219/10/6 9:09
 */
public class WordUtil {

    private static Logger logger = LoggerFactory.getLogger(WordUtil.class);

    /**
     * 根据模板填充内容生成word
     * 调用方法参考下面的main方法,详细文档参考官方文档
     * Poi-tl模板引擎官方文档:http://deepoove.com/poi-tl/
     *
     * @param templatePath word模板文件路径
     * @param fileDir      生成的文件存放地址
     * @param fileName     生成的文件名,不带格式。假如要生成abc.docx,则fileName传入abc即可
     * @param paramMap     替换的参数集合
     * @return 生成word成功返回生成的文件的路径,失败返回空字符串
     */
    public static String createWord(String templatePath, String fileDir, String fileName, Map<String, Object> paramMap) {
        Assert.notNull(templatePath, "word模板文件路径不能为空");
        Assert.notNull(fileDir, "生成的文件存放地址不能为空");
        Assert.notNull(fileName, "生成的文件名不能为空");

        // 生成的word格式
        String formatSuffix = ".docx";
        // 拼接后的文件名
        fileName = fileName + formatSuffix;

        // 生成的文件的存放路径
        if (!fileDir.endsWith("/")) {
            fileDir = fileDir + File.separator;
        }

        File dir = new File(fileDir);
        if (!dir.exists()) {
            logger.info("生成word数据时存储文件目录{}不存在,为您创建文件夹!", fileDir);
            dir.mkdirs();
        }

        String filePath = fileDir + fileName;
        // 读取模板templatePath并将paramMap的内容填充进模板,即编辑模板+渲染数据
        XWPFTemplate template = XWPFTemplate.compile(templatePath).render(paramMap);
        try {
            // 将填充之后的模板写入filePath
            template.writeToFile(filePath);
            template.close();
        } catch (Exception e) {
            logger.error("生成word异常", e);
            e.printStackTrace();
            return "";
        }
        return filePath;
    }

    public static void main(String[] args) {
        Map<String, Object> params = new HashMap<>();
        // 渲染文本
        params.put("projectName", "XXX工程");
        ...
        // 渲染图片
        params.put("picture", new PictureRenderData(120, 120, "D:\\wx.png"));
        // TODO 渲染其他类型的数据请参考官方文档
        String templatePath = "D:\\zdd.docx";
        String fileDir = "D:\\template";
        String fileName = "zdd2";

        String wordPath = WordUtil.createWord(templatePath, fileDir, fileName, params);
        System.out.println("生成文档路径:" + wordPath);
    }
}

3、word 模板格式

4、最终生成 word 的效果

开发时遇到的问题

poi-tl 依赖的是 poi 3.16 版本,包括 poi-ooxml、poi、poi-ooxml-schemas 三个依赖,如果项目中有这三个依赖的其他版本可能会导致上面的代码报错,因此最好是使用 3.16 版本的这三个依赖。


作者:Jerry_1998

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

来源链接:

https://blog.csdn.net/weixin_44605704/article/details/102571324

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值