基础:
Apache POI基于DOM方式进行解析,将文件直接加载内存,所以速度较快,适合Excel文件数量不大的应用场景。
Alibaba EasyExcel采用逐行读取的解析模式,将每一行的解析结果以观察者模式通知处理(AnalyEventListener),所以比较适合数据体量较大的Excel文件解析。
当前问题:
导出慢、OutOfMemoryError内存溢出
解决思路:
使用批量写入或导出,不要一次性将数据读取到内存或一次性读写数据库
导出:将数据分页读取,每次读取1万条数据,在读取数据的过程中,将数据转换成CSV格式,然后到了一定大小,就写入到CSV文件,这样就可以避免内存溢出。
导入: Apache POI是直接一次性读取到内存, 所以建议使用阿里的EasyExcel,它是采用逐行读取模式
EasyExcel读取示例
EasyExcel.read("test.xlsx", Test.class,new AnalysisEventListener<Test>() {
@Override
public void invoke(Test test, AnalysisContext arg1) {
// 读取每条数据
orderList.add(order);
}
@Override
public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {
// 读取到列头
System.out.println(headMap);
}
@Override
public void doAfterAllAnalysed(AnalysisContext arg0) {
// 读取完毕
System.out.println("END");
}
}).sheet().doRead();