业务需要我们进行百万级别的数据量上传。但中间又涉及到表头、空行的判断,所以我们决定考虑先解析拿到文档中的所有数据。
最初方案:EasyExcel
EasyExcel原理是一条一条数据读取,对内存很友好,但是EasyExcel在处理时会自动忽略空行。导致我们没办法进行空行校验。
后续方案:EasyPoi
EasyPoi提供了一整套的工具处理方案。也提供了Excel、Csv文件的大批量数据处理方法。但是,我们在读取30W条数据(6M左右)的Excel文件时,内存瞬间涨到4G以上。
最终方案:Excel_Stream_reader
经最终测试,30w数据量在处理下降到1.5G左右,而更大批量数据的文件连续上传,也未见内存有显著变化。
pom文件
<dependency> <groupId>com.monitorjbl</groupId> <artifactId>xlsx-streamer</artifactId> <version>2.1.0</version> </dependency>
Test类
InputStream is = null;
try {
is = new FileInputStream(new File());
Workbook workbook = StreamingReader.builder()
.rowCacheSize(100) // number of rows to keep in memory (defaults to 10)
.bufferSize(4096) // buffer size to use when reading InputStream to file (defaults to 1024)
.open(is);
for (Sheet sheet : workbook){
/**每个sheet页*/
for (Row row : sheet) {
/**可以理解为每行的数据*/
for (Cell cell: row) {
/**cell为每一行的具体列数据*/
}
}
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
if(is!=null){
is.close();
}
}