在日常开发中,我们经常需要将数据导出到 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. 运行效果
- 访问
http://localhost:8080/report/download
- 浏览器会自动下载
report.docx
文件 - 打开
report.docx
,内容如下:
姓名:张三
年龄:28
7. 总结
功能 |
方案 |
生成 Word 报表 |
使用 POI-TL |
变量填充 |
|
动态表格填充 |
|
Web 下载 Word |
SpringBoot Controller |
通过 SpringBoot + POI-TL,我们可以快速实现 Word 报表生成,相比传统的 POI 操作更加直观、简单高效。
希望这篇文章能帮助你更好地理解 POI-TL,如有问题,欢迎交流!????