https://mp.weixin.qq.com/s/agc8DtKPeaMrcNWuPgBp9w

POI-TL (POI Template Language) 是基于 Apache POI 的 Word 模板引擎,可以通过 模板 + 变量 的方式生成 Word 文档。它支持:

文本替换(支持动态填充数据)
图片插入(支持动态图片填充)
表格数据填充
段落和页眉页脚处理
样例代码:https://gitee.com/lhdxhl/springboot-example.git
相较于直接使用 Apache POI,POI-TL 更加简洁易用,适用于 批量生成 Word 文档 的场景,如:

合同生成
报告自动化
通知模板填充

🧰 2、集成 POI-TL
引入 Maven 依赖,在 pom.xml 添加:

<dependencies>
    <!-- Spring Boot Web 依赖 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <!-- POI-TL 依赖 -->
    <dependency>
        <groupId>com.deepoove</groupId>
        <artifactId>poi-tl</artifactId>
        <version>1.12.0</version>
    </dependency>

    <!-- POI 支持(用于处理 Word) -->
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-ooxml</artifactId>
        <version>5.2.3</version>
    </dependency>
</dependencies>

📌 POI-TL 依赖 poi-ooxml,因此需要一起引入。

🛠️ 3. 关键功能示例
3.1 基本的 Word 文本替换
1️⃣ 创建 Word 模板

在 src/main/resources/templates/ 目录下创建 template.docx,内容如下:

尊敬的 {{name}}:

您于 {{date}} 在我公司购买了 {{product}},金额为 {{price}} 元。

感谢您的支持!

签名:{{signature}}
📌 变量格式:{{name}},{{date}},{{product}} 等,POI-TL 会自动替换这些占位符。

2️⃣Spring Boot 代码填充模板

创建 WordGeneratorService.java:

package com.lm.poitl.service;

import com.deepoove.poi.XWPFTemplate;
import lombok.var;
import org.springframework.stereotype.Service;

import java.io.FileOutputStream;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;

@Service
public class WordGeneratorService {

    public void generateWord() throws Exception {
        // 定义动态数据
        Map<String, Object> data = new HashMap<>();
        data.put("name", "张三");
        data.put("date", "2025年3月12日");
        data.put("product", "MacBook Pro 16寸");
        data.put("price", "19999");
        data.put("signature", "张三公司");

        // 使用类路径加载资源文件
        InputStream templateStream = WordGeneratorService.class.getClassLoader()
                .getResourceAsStream("templates/template.docx");

        if (templateStream == null) {
            throw new IllegalArgumentException("模板文件未找到!");
        }

        XWPFTemplate template = XWPFTemplate.compile(templateStream).render(data);

        // 另存生成的文件
        template.writeToFile("output.docx");
        template.close();
    }
}

📌 核心代码解析

通过 XWPFTemplate.compile(“template.docx”) 加载 Word 模板。
通过 render(data) 进行动态填充。
通过 FileOutputStream 输出生成的 Word 文件。

3.2 通过 Spring Boot 提供下载 API

创建 WordController.java:

package com.example.worddemo.controller;

import com.example.worddemo.service.WordGeneratorService;
import org.springframework.core.io.InputStreamResource;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.io.File;
import java.io.FileInputStream;

@RestController
@RequestMapping("/word")
public class WordController {

    private final WordGeneratorService wordService;

    public WordController(WordGeneratorService wordService) {
        this.wordService = wordService;
    }

    @GetMapping("/download")
    public ResponseEntity<InputStreamResource> downloadWord() throws Exception {
        // 生成 Word 文件
        wordService.generateWord();

        // 读取文件
        File file = new File("output.docx");
        FileInputStream fis = new FileInputStream(file);

        return ResponseEntity.ok()
                .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=output.docx")
                .contentType(MediaType.APPLICATION_OCTET_STREAM)
                .body(new InputStreamResource(fis));
    }
}

📌 测试 API启动 Spring Boot,访问:

http://localhost:8080/word/download
浏览器会自动下载 output.docx。

📚 4. 进阶功能
4.1 动态插入图片
1️⃣ 修改 Word 模板
在 template.docx 中添加:

尊敬的 {{name}}:

请查看您的电子签名:
{{@signature}}
📌 {{@signature}} 表示该字段是 图片。

2️⃣ 代码填充图片

import com.deepoove.poi.data.PictureRenderData;

data.put("signature", new PictureRenderData(100, 50, "src/main/resources/images/signature.png"));

📌 生成的 Word 会插入 签名图片。

4.2 表格填充
1️⃣ 修改模板
在 template.docx 中创建一个 表格:

产品名称 价格
{{products.name}} {{products.price}}
📌 products 是一个列表,每行都会填充数据。

2️⃣ 代码填充表格

import com.deepoove.poi.data.RowRenderData;
import com.deepoove.poi.data.TextRenderData;

List<RowRenderData> productList = new ArrayList<>();
productList.add(RowRenderData.build(new TextRenderData("MacBook Pro"), new TextRenderData("19999")));
productList.add(RowRenderData.build(new TextRenderData("iPhone 15"), new TextRenderData("8999")));

data.put("products", productList);

📌 效果:表格将填充多个产品数据。

🔚 5. 总结
✅ Spring Boot + POI-TL 生成 Word 文档,主要步骤如下:

定义 Word 模板
使用 POI-TL 进行数据填充
通过 Spring Boot 提供下载 API
支持高级功能:图片、表格、页眉页脚
✅ 适用场景

合同、通知、报告自动生成
数据批量填充
自动化办公

文档更新时间: 2025-07-13 07:43   作者:admin