框架背景:
<dependency>
<groupId>cn.afterturn</groupId>
<artifactId>easypoi-base</artifactId>
<version>4.0.0</version>
</dependency>
<dependency>
<groupId>cn.afterturn</groupId>
<artifactId>easypoi-annotation</artifactId>
<version>4.0.0</version>
我在前文,如何解决easypoi导出大数据量的问题中说调用easypoi自带的导出大数据量的方法,分批导出后合并成一个sheet 导出。
for (int i = 0; i < remoteCount; i++) {
//组装导出信息
List<ContractExcelVO> contractExcelVOS = new ArrayList<>();
ExportParams exportParams = new ExportParams();
exportParams.setType(ExcelType.XSSF);
exportParams.setTitle("合同信息");
//导出多个表格
workbook = ExcelExportUtil.exportBigExcel(exportParams, ContractExcelVO.class, contractExcelVOS);
}
那么它是怎么实现的呢?? ?
1.使用ThreadLocal把导出的类通过线程的维度记录下来,这样就能使得每次调用的上下文都保持一致,而这时导出的workbook 对象就可以重复设置。
2.在获取ExcelBatchExportService 对象时,如果是第一次获取则初始化上下文的一些数据,这时WorkBook 也会被创建。之后每次用到的都是这个workBook。
3.获取到ExcelBatchExportService对象后,调用appendData 方法,而在这里可以看到,开头就是对sheet 的长度判断,如果大于sheet的最大长度,则重新创建一个新的sheet 来导出对应的数据。
4.至此我们就弄清楚了为什么我们只需要循环调用这个方法就能自动的将所有的数据导入到一个表格里面输出了。
workbook = ExcelExportUtil.exportBigExcel(exportParams, ContractExcelVO.class, contractExcelVOS);