POI 4.1.2导出XML映射时遇Cannot get a NUMERIC value from a BOOLEAN cell异常,是否为框架bug?
POI 4.1.2 XML映射导出布尔公式单元格异常问题分析
你的判断完全正确,这确实是Apache POI 4.1.2版本中XSSFExportToXml组件的一个bug,你的分析精准戳中了问题的核心。
问题根源拆解
从你贴出的mapCellOnNode源码可以看到:
当单元格类型为FORMULA时,代码仅处理了缓存结果为STRING的情况,其余所有情况(包括BOOLEAN、NUMERIC、ERROR)都直接进入了后续的日期判断/数值处理逻辑。而你的公式单元格缓存结果是BOOLEAN类型,走到DateUtil.isCellDateFormatted(cell)时,这个方法内部会调用cell.getNumericCellValue()——但布尔类型单元格根本无法返回数值,因此触发了类型不匹配的异常。
正确的逻辑应该在FORMULA分支中,针对cell.getCachedFormulaResultType()的所有可能类型做分支处理,比如:
case FORMULA: switch (cell.getCachedFormulaResultType()) { case STRING: value = cell.getStringCellValue(); break; case BOOLEAN: value += cell.getBooleanCellValue(); break; case NUMERIC: if (DateUtil.isCellDateFormatted(cell)) { value = getFormattedDate(cell); } else { value += cell.getNumericCellValue(); } break; case ERROR: value = cell.getErrorCellString(); break; default: break; } break;
临时解决方案
自定义导出类修复逻辑
你可以继承XSSFExportToXml,重写mapCellOnNode方法,补上BOOLEAN类型的处理分支,覆盖原有的有问题逻辑。预处理单元格类型
在导出XML之前,遍历所有公式单元格,若其缓存结果为BOOLEAN类型,可以将其转换为普通布尔单元格(注意:这会修改原工作簿内容,需谨慎):// 遍历工作表中的单元格 for (Row row : sheet) { for (Cell cell : row) { if (cell.getCellType() == CellType.FORMULA && cell.getCachedFormulaResultType() == CellType.BOOLEAN) { boolean boolValue = cell.getBooleanCellValue(); cell.setCellValue(boolValue); } } }升级POI版本
最彻底的解决方式是升级到Apache POI 5.x及以上版本,这个bug在后续版本中已经被官方修复,无需手动修改逻辑。
内容的提问来源于stack exchange,提问作者Abid
相关产品推荐
相关产品推荐

