Apache POI读取Excel活动单元格遇空指针问题求助
解决Apache POI读取Excel默认活动单元格返回null的问题
这是个Apache POI操作Excel时很容易踩的小坑,我来帮你理清楚问题根源和解决思路:
为什么getActiveCell()返回null?
Excel的文件格式规范里,只有当活动单元格不是默认的A1时,才会在文件中主动记录这个单元格的位置。哪怕你手动把光标移回A1再保存,Excel也不会多此一举写入这个默认值——因为它默认就该是A1。所以当POI读取这类文件时,getActiveCell()自然会返回null,因为文件里根本没存这个信息。
怎么验证默认光标在A1?
既然默认行为就是打开时光标定位在A1,那我们可以调整测试逻辑:先尝试获取活动单元格,如果返回null,就默认它是A1。这样既符合Excel的实际行为,也能通过测试验证需求。
修改后的测试代码如下:
val filePath = '<filepath>' val myFile = new File(filePath) val workbook = new XSSFWorkbook(myFile) behavior of "An excel template doc" in { it should "open to the first tab" in { assert(workbook.getActiveSheetIndex == 0) } it should "open with the cursor cell at cell A1" in { val activeCell = Option(workbook.getSheetAt(0).getActiveCell).getOrElse(CellAddress.A1) assert(activeCell == CellAddress.A1) } }
补充说明
你手动调用setActiveCell(CellAddress.A1)后测试能通过,是因为POI会在内存中主动添加这个活动单元格的记录,但这并不是读取原有文件的真实状态。上面的方案才是贴合Excel实际存储逻辑的正确做法——默认情况下没有记录就等同于A1。
内容的提问来源于stack exchange,提问作者franklin
相关产品推荐
相关产品推荐

