超大Excel读取和写出(支持50万+)(一)

超大Excel读取和写出(支持50万+)

一、现状

假设我们的测试或生产环境的内存条件有限,比如说2GB(当然小数据的导入和导出不在本文的讨论范围,因为导入和导出它们几乎不存在内存溢出问题)。

这里,我们假如:项目中有50W条及以上数据需要进行excel导入和导出。使用普通的POI包中HSSFWorkbook(2003版及以前的版本)和XSSFWorkbook(2007版及以后的版本),
很容易造成内存溢出,从而无法实现正确的导入导出功能。

这个时候我们应该应该怎么办呢?

  • 增加测试或生产环境的内存大小,比如说分配100GB甚至是更大的内存
  • 使用POI的事件驱动模式实现消耗较低地内存大小实现导入10w、50w、甚至更多的数据

当然本文主要探讨的是第二种方案的实现及细节问题。第一个解决方案往往因为我们的客观限制并不是那么容易实现,所以我个人也比较推荐遇到这类问题,使用
第二种方法解决此类问题。

二、技术前瞻

POI提供了HSSF和XSSF的API可以自JAVA中读取修改xls/xlsx文件,但是自面对大文件时就容易报出OOM,
因此提供了接口可以以流式的方式读取/写入(xls/xlsx)。

excel类型 普通数据量 超大数据量
xls 读写均支持(HSSF即可) 仅支持流式读取
xlsx 读写均支持(XSSF即可) 读写均支持(sax流式读取;SXSSF流式写出)

鉴于目前我们项目中使用的均是office2007以后的版本,所以xls的读写在这里就不做过多演示和说明。

三、超大数据量导入和导出

  • 超大Excel文件读取(支持50w+)
  • 超大Excel文件写出(支持50w+)

你可能感兴趣的:(Java基础)