使用 SpringBoot + POI-TL 操作 Word,实现快速生成报表

时间:2025-03-17 15:14:16

在日常开发中,我们经常需要将数据导出到 Word 进行展示,比如生成合同、报告、发票等。相比传统的 POI 方式,POI-TL(POI Template Language) 提供了一种更加简洁和高效的方式来填充 Word 模板,实现快速生成报表。

本文将介绍如何在 SpringBoot 项目中使用 POI-TL 生成 Word 报表,帮助你提高开发效率。

1. POI-TL 简介

POI-TL 是基于 Apache POI 开发的模板引擎,它通过简单的 {{}} 语法占位符,在 Word 模板中插入动态数据,实现高效的文档填充。

POI-TL 主要特点:

  • 通过 Word 模板 进行填充,开发更直观
  • 支持 文本、表格、图片、循环列表 等复杂数据填充
  • 兼容 docx 格式,适用于办公文档生成

2. 项目环境准备

2.1 添加依赖

SpringBoot 项目的 pom.xml 文件中添加 POI-TL 依赖:

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

3. 编写 Word 模板

首先,我们需要准备一个 Word 模板(.docx) 文件,在模板中使用 {{变量名}} 来占位,例如:

姓名:{{name}}
年龄:{{age}}

如果需要动态填充表格,可以使用:

{{#table}}
| 姓名  | 年龄 |
| {{name}} | {{age}} |
{{/table}}

4. 代码实现

4.1 创建数据模型

import java.util.HashMap;
import java.util.Map;

public class ReportData {
    public static Map<String, Object> getData() {
        Map<String, Object> data = new HashMap<>();
        data.put("name", "张三");
        data.put("age", 28);
        return data;
    }
}

4.2 生成 Word 报表

import com.deepoove.poi.XWPFTemplate;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Map;

public class WordReportGenerator {
    public static void main(String[] args) throws IOException {
        // 读取模板文件
        XWPFTemplate template = XWPFTemplate.compile("template.docx");
        
        // 获取填充数据
        Map<String, Object> data = ReportData.getData();
        
        // 进行填充
        template.render(data);
        
        // 生成新 Word 文件
        try (FileOutputStream out = new FileOutputStream("output.docx")) {
            template.write(out);
        }
        
        // 关闭资源
        template.close();
        System.out.println("Word 报表生成成功!");
    }
}

5. 在 SpringBoot 控制器中生成 Word 文件

如果需要在 SpringBoot Web 项目中提供 下载 Word 功能,可以创建一个 Controller:

import com.deepoove.poi.XWPFTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletResponse;
import java.io.OutputStream;
import java.util.Map;

@RestController
@RequestMapping("/report")
public class ReportController {
    @GetMapping("/download")
    public void downloadReport(HttpServletResponse response) throws Exception {
        // 设置响应头,指定文件名
        response.setContentType("application/vnd.openxmlformats-officedocument.wordprocessingml.document");
        response.setHeader("Content-Disposition", "attachment; filename=report.docx");
        
        // 加载模板
        XWPFTemplate template = XWPFTemplate.compile("template.docx");
        
        // 获取填充数据
        Map<String, Object> data = ReportData.getData();
        
        // 渲染模板
        template.render(data);
        
        // 输出到客户端
        OutputStream out = response.getOutputStream();
        template.write(out);
        out.flush();
        out.close();
        template.close();
    }
}

6. 运行效果

  1. 访问 http://localhost:8080/report/download
  2. 浏览器会自动下载 report.docx 文件
  3. 打开 report.docx,内容如下:
姓名:张三
年龄:28

7. 总结

功能

方案

生成 Word 报表

使用 POI-TL

变量填充

{{变量名}}

动态表格填充

{{#table}} ... {{/table}}

Web 下载 Word

SpringBoot Controller

通过 SpringBoot + POI-TL,我们可以快速实现 Word 报表生成,相比传统的 POI 操作更加直观、简单高效。

希望这篇文章能帮助你更好地理解 POI-TL,如有问题,欢迎交流!????