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

时间:2024-05-22 19:30:24

我太难了

作为一个伟大又渺小的猿,竟然被这个问题困扰了接近三天,我太难了。
  导出word生成文本数据、生成一张表都是soeasy,今天我这里记录的是生成文本和多张表。
  废话不多说,先看看效果图:
  SpringBoot整合poi-tl实现导出多张数据表结构和word文本

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

controller这些我就不写了,关键看看ServiceImpl中的逻辑
SpringBoot整合poi-tl实现导出多张数据表结构和word文本
说明: 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}}一致
SpringBoot整合poi-tl实现导出多张数据表结构和word文本

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