SpringBoot整合poi-tl实现导出多张数据表结构和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 Boot 是一个流行的 Java 基础框架,它简化了基于 Spring 的应用开发过程。而 Apache POI 是一个 Java 库,用于处理 Microsoft Office 文档格式。poi-tl 是基于 Apache POI 的一个扩展库,它提供了更简洁的API和更多的功能来处理Office文档。 在 Spring Boot 项目中使用 poi-tl 下载 Word 文档通常涉及到以下几个步骤: 1. 添加依赖:首先需要在项目的 pom.xml 文件中添加 poi-tl 相关的依赖。 ```xml <dependency> <groupId>com.deepoove</groupId> <artifactId>poi-tl</artifactId> <version>最新版本号</version> </dependency> ``` 2. 创建Word文档:使用 poi-tl 提供的 API 来创建 Word 文档,你可以通过编写 Java 代码来构建文档的内容。 3. 文件下载:创建好文档后,可以通过 Spring MVC 提供的 Controller 方法来响应 HTTP 请求,并将生成的 Word 文档作为 HTTP 响应体返回给客户端。 下面是一个简单的示例代码: ```java @RestController @RequestMapping("/download") public class WordDownloadController { @GetMapping("/word") public void downloadWord(HttpServletResponse response) { // 创建Word文档 WTDocument document = new WTDocument(); document宋体(); document.body().addParagraph("这是一个使用poi-tl创建的Word文档。"); // 设置响应头 response.setContentType("application/octet-stream"); response.setHeader("Content-Disposition", "attachment;filename=example.docx"); // 将文档内容写入响应流中 try { document.write(response.getOutputStream()); response.flushBuffer(); } catch (IOException e) { // 异常处理 e.printStackTrace(); } } } ```
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值