1. 当Excel遇上大数据:内存溢出的噩梦
第一次处理百万行Excel文件时,我的服务器直接崩溃了。控制台疯狂输出"OutOfMemoryError",JVM堆内存瞬间爆满,就像往小杯子里倒一桶水那样狼狈。这种场景在数据导入、报表分析等后台服务中太常见了——用户上传的Excel可能包含几十万行数据,传统的XSSFWorkbook会一次性把整个文件加载到内存,相当于把整本字典塞进大脑而不是需要时再查。
内存溢出报错通常长这样:
java复制Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at org.apache.poi.util.IOUtils.toByteArray(IOUtils.java:241)
at org.apache.poi.openxml4j.util.ZipArchiveFakeEntry.<init>(ZipArchiveFakeEntry.java:47)
更棘手的是遇到数组长度限制的错误:
java复制Tried to allocate an array of length 260,008,239,
but the maximum length for this record type is 100,000,000
这时候很多人第一反应是调大JVM参数(-Xmx),或者像原始文章提到的用IOUtils.setByteArrayMaxOverride()临时扩容。但这些都是治标不治本——当数据量持续增长,内存再大也会被吃光。就像用越来越大的桶接水,不如直接接根水管来得聪明。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 流式处理:用"水管"代替"水桶"
2.1 StreamingReader:像读小说一样读Excel
Apache POI的StreamingReader采用了SAX解析思想,它的工作方式就像我们读小说:
- 传统方式(XSSFWorkbook):必须把整本书背下来才能讲内容
- 流式方式(StreamingReader):边看边讲,看完一页就扔一页
实测配置示例:
java复制Workbook workbook = StreamingReader.builder()
.rowCache
