内存刷新:sheet.getRow方法返回值NullPointException

问题:

Sheet sheet = workbook.getSheetAt(0);

获取sheet时,发现sheet.getRow(row),row的值小于lastFlushedRowNumber时,获取的都是NULL

查阅资料:

lastFlushedRowNumber 是一个与写缓存相关的值,用于指定使用 SXSSF (Streaming Usermodel API) 时上次写入磁盘的行号。SXSSF是Apache POI库中的一部分,它是XSSF的流式版本,设计用来处理大型的Excel文件(.xlsx)

当使用SXSSF时,为了减少内存的消耗,只有部分行数据会被保存在内存中,而其他的会被写入到临时文件中。lastFlushedRowNumber就是用来追踪哪些行已经被写入磁盘,从而不再保存在内存中。

如果你尝试获取一个已经被写入磁盘的行(即行号小于等于lastFlushedRowNumber),那么sheet.getRow将会返回null,因为那部分行数据已经不在内存中了。

例如,假设lastFlushedRowNumber是100,那么尝试通过sheet.getRow(99)获取第100行(行索引从0开始)的数据时,将会返回null,因为那行数据已经不在内存中了。

要处理这个问题,你可以:

避免访问已经刷新的行: 确保在处理行数据时不会尝试访问那些已经被写入磁盘的行。

适当设置窗口大小: 当创建SXSSFWorkbook实例时,你可以设置窗口大小,它决定了可以保持在内存中的行数。如果你需要访问更多的行,可以考虑增加这个值(但要注意内存消耗)。

int windowSize = 200; // 保持在内存中的行数
SXSSFWorkbook workbook = new SXSSFWorkbook(windowSize);

及时处理数据: 如果可以尽量在数据被刷新到磁盘前处理完它们,以避免需要回溯到之前的行。
如果你遇到的问题正是由lastFlushedRowNumber引起的,你可能需要重新考虑你的数据处理策略,确保在数据被刷新到磁盘之前,你已经完成了所有必要的操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

细水长流永不粹

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值