SpringBoot整合poi-tl实现导出多张数据表结构和word文本

本文介绍如何利用SpringBoot结合poi-tl模板引擎,在Java环境下生成包含多张表格及文本的Word文档,详细解析核心代码与实现步骤。

我太难了

作为一个伟大又渺小的猿,竟然被这个问题困扰了接近三天,我太难了。
  导出word生成文本数据、生成一张表都是soeasy,今天我这里记录的是生成文本和多张表。
  废话不多说,先看看效果图:
  在这里插入图片描述

这里使用的技术是SpringBoot + poi-tl ,poi-tl(poi template language)是基于Apache POI的Word模板引擎,纯Java组件,跨平台,代码短小精悍,通过插件机制使其具有高度扩展性。
  实现这个操作运用了poi-tl的表格模板文档模板。详情请看:官方文档
  核心思想:文档模板就相当于一张纸,表格模板就相当于一个表格,我们在纸上画多个表格、写多个文字,文档模板将表格模板包裹住,相当于外包装。
 导出之前,我们先创建两个word模板,这两个模板一定要区分清楚:
 1.表格模板
 {图片}
::::标准名称是文本信息,{{#table}},这里的表达式类似于一个定位符,告诉程序我们要在这里开始画表,对应的java代码看后面
 2.文档模板
 {图片}
::::其他都是描述性文本,{{+standardInfo}}是生成多张表的关键。作用于{{#table}}类似
上代码:

controller这些我就不写了,关键看看ServiceImpl中的逻辑
{图片}
说明: RowRenderData.build()是一个构建函数,帮助我们构建表的结构,包括表头header,style,行数据等等。一个RowRenderData相当于一行数据,这里我将数据转换成一个List<RowRenderData>的集合,一个集合就相当于一张表格的数据,最后放在map中。
注意: map.put(“standardName”,standard.getName()); key:standardName一定要和表格模板上的名称{{standardName}}一致,
同样: map.put(“table”,new MiniTableRenderData(header,listOne)); table要个表格模板中的{{#table}}一致
{图片}

说明: 传过来的数据dataList是用于填充表格模板的,新建的map集合是用来填充文档模板的,最后将表格封装好的DocxRenderData对象加入map,map.put(“standardInfo”, standardInfo);注意:这里的key:standardInfo一定要和文档模板中的:{{+standardInfo}}名称一致
{图片}
最后收尾工作,输出到浏览器实现,访问我们controller层写的接口,就能实现下载一个word文档。

使用Spring BootPOI-TLWord模板导出数据表格可按以下步骤进行: ### 引入依赖 在`pom.xml`文件中引入POI-TL的Maven依赖: ```xml <dependency> <groupId>com.deepoove</groupId> <artifactId>poi-tl</artifactId> <version>1.5.1</version> </dependency> ``` 此依赖为后续使用POI-TL功能提供基础支持[^3]。 ### 准备Word模板 模板文件必须是`.docx`格式。在模板中设置用于替换数据的标签,POI-TL提供了大量的标签,如用于表格、文字等的标签,可通过这些标签实现数据的动态替换[^2][^3]。 ### 编写代码实现导出功能 以下是一个简单的示例代码: ```java import com.deepoove.poi.XWPFTemplate; import com.deepoove.poi.config.Configure; import com.deepoove.poi.data.RowRenderData; import com.deepoove.poi.data.TableRenderData; import java.io.FileOutputStream; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class WordTableExport { public static void main(String[] args) { // 模拟表格数据 List<RowRenderData> rows = new ArrayList<>(); RowRenderData header = RowRenderData.build("列1", "列2", "列3"); rows.add(header); for (int i = 0; i < 5; i++) { RowRenderData row = RowRenderData.build("数据" + i + 1, "数据" + i + 2, "数据" + i + 3); rows.add(row); } TableRenderData table = new TableRenderData(rows); // 准备数据模型 Map<String, Object> data = new HashMap<>(); data.put("table", table); // 配置POI-TL Configure config = Configure.newBuilder().build(); // 加载模板 try (XWPFTemplate template = XWPFTemplate.compile("path/to/your/template.docx", config) .render(data)) { // 导出文件 try (FileOutputStream out = new FileOutputStream("path/to/output/exported.docx")) { template.write(out); } } catch (IOException e) { e.printStackTrace(); } } } ``` 上述代码首先模拟了表格数据,然后将数据封装到`TableRenderData`对象中。接着创建一个数据模型`Map`,将表格数据放入其中。之后配置POI-TL并加载模板文件,将数据渲染到模板中,最后将渲染后的文档输出到指定文件中。 POI-TL还支持在标签中使用Spring EL表达式进行渲染,为数据处理提供了更多的灵活性[^2]。
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值