简要说明:
大数据导出导入excel,网上许多使用EasyExcel进行实现,但EasyExcel是基于Apache poi进行封装的所以存在一个共病【占用内存过大】,在找了许多个poi框架如AutoExcel、MyExcel... 最终选型eec,文档写的很不错,简单易用,更新维护频繁,导出导入的性能完全可以说是极强!
eec开源框架地址 https://github.com/wangguanquan/eec
本人用18年的笔记本电脑, 本地测试并发StatementSheet流式导出5个excel,每个excel2千万数据,总耗时在8分钟,占用内存峰值在1300M,cpu80%
StatementSheet 的使用方式可见:GitHub - wangguanquan/eec-example: eec使用事例
针对目前还不支持add模板【addSheet时能不能添加模板,好像不支持模板+addSheet的结合使用 · Issue #256 · wangguanquan/eec · GitHub】,基于0.5.3版本提供的【多行表头】,临时自己手动绘制模板,解决 【汇总+明细】的excel需求
以下是实现过程
依赖
<dependency>
<groupId>org.ttzero</groupId>
<artifactId>eec</artifactId>
<version>0.5.3</version>
</dependency>
堆栈配置参考 -Xms32m -Xmx2048m , 如果需要并发导出多份excel, -Xms 建议根据机器进行评估进行配置,合理配置-Xms可以达到意想不到的效果
首先我们先看实现多行表头的过程,简单看看即可
@Test
public void dome() throws Exception {
String start = DateUtilss.format(new Date(),DateUtilss.YYYY_MM_DD_HH_MM_SS);
ArrayList<Object> objects = new ArrayList<>();
objects.add(new HashMap<>());
Workbook wb = new Workbook();
Styles style = wb.getStyles();
String titleName = "XXX大药房医药连锁有限公司委托服务12月 应收账款汇总表-华南荔湾仓";
wb.addSheet(new ListSheet(objects
, new Column(titleName) //相同字符串会合并
.addSubColumn(new Column("数据统计时间:"))
.addSubColumn(new Column("一、仓储作业费:"))
.addSubColumn(new Column("名称"))
.addSubColumn(new Column("","key"))
.addSubColumn(new Column("","key"))
.addSubColumn(new Column("","key"))
.addSubColumn(new Column("","key"))
.addSubColumn(new Column("","key"))
, new Column(titleName)//相同字符串会合并
.addSubColumn(new Column("2021年12月1日-12月31日" ))
.addSubColumn(new Column("","key"))
.addSubColumn(new Column("","key"))
.addSubColumn(new Column("","key"))
.addSubColumn(new Column("","key"))
.addSubColumn(new Column("","key"))
.addSubColumn(new Column("","key"))
.addSubColumn(new Column("","key"))
, new Column(titleName)//相同字符串会合并
.addSubColumn(new Column("2021年12月1日-12月31日"))
.addSubColumn(new Column("","key"))
.addSubColumn(new Column("","key"))
.addSubColumn(new Column("","key"))
.addSubColumn(new Column("","key"))
.addSubColumn(new Column("","key"))
.addSubColumn(new Column("","key"))
.addSubColumn(new Column("","key"))
, new Column(titleName)//相同字符串会合并
.addSubColumn(new Column("XXXX集团XX有限公司制"))
.addSubColumn(new Column("","key"))
.addSubColumn(new Column("","key"))
.addSubColumn(new Column("","key"))
.addSubColumn(new Column("","key"))
.addSubColumn(new Column("","key"))
.addSubColumn(new Column("","key"))
.addSubColumn(new Column("","key")) //size()
)).writeTo(new File("E://excel//模板dome.xlsx"));
System.out.println(start+"---"+DateUtilss.format(new Date(),DateUtilss.YYYY_MM_DD_HH_MM_SS));
}
导出的excel效果如下
可见代码实现是每列往下衍生的,由此可见代码量会比较多,以及不好维护
如何减小代码量,并更易维护,实现以下表格内容
即变成以下封装方式
表绘制实体类
import lombok.Data;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import org.ttzero.excel.entity.style.Styles;
import java.util.ArrayList;
import java.util.Li