使用Apache POI校验Excel C3单元格是否存在“Numero”字符串报错咨询
错误原因
- 类型匹配逻辑错误:直接将
Cell类型的对象teste和String类型的pedidoExcel用==比较,两者类型完全不同,永远不可能返回预期的相等结果。同时==用于对象比较时比对的是内存地址,不是内容值,就算同是字符串也不能这么用来判断内容相等。 - 单元格定位逻辑漏洞:
new CellReference("C3").getCol()只能获取到C列对应的列索引(0基为2),但row.getCell()仅传入列索引时,获取的是当前传入row对应的行的C列单元格,并不是你期望的第3行C3单元格,如果传入的row不是工作表的第3行(0基索引为2),取到的单元格完全错误。 - 内容读取逻辑缺失:没有将
Cell对象的内容读取为字符串,直接拿对象和字符串比对完全不符合逻辑,是触发运行时错误的核心原因。 - 版本兼容问题:
Cell.CELL_TYPE_BLANK是Apache POI 3.15版本前的旧常量,更高版本的POI中该常量已被废弃,替换为CellType.BLANK枚举,部分版本会触发编译警告或报错。
修复方案
首先确认需求:如果是要校验传入行的C列单元格内容,直接用下方的修复代码即可;如果是固定校验整个工作表的C3单元格,需要先定位到工作表的第3行(0基索引为2)再走后续校验逻辑。
private int validaLinha(Row row) { String pedidoExcel = "Numero"; // C列的列索引固定为2,也可以保留原有CellReference的写法 int cColIndex = new CellReference("C3").getCol(); Cell teste = row.getCell(cColIndex); try{ if (teste == null || teste.getCellType() == CellType.BLANK) { return 0; } // 兼容不同单元格类型读取内容为字符串 String cellValue; if (teste.getCellType() == CellType.STRING) { cellValue = teste.getStringCellValue(); } else if (teste.getCellType() == CellType.NUMERIC) { cellValue = String.valueOf(teste.getNumericCellValue()); } else if (teste.getCellType() == CellType.FORMULA) { // 公式类型取计算结果 cellValue = teste.getRichStringCellValue().getString(); } else { // 其余类型默认不匹配 return 0; } // 用equals判断字符串内容相等,trim去除首尾空格干扰 if (pedidoExcel.equals(cellValue.trim())) { return 1; } return 0; }catch (Exception e){ return -1; } }
如果是固定校验整个工作表的C3单元格,只需要在校验前先获取对应行即可:
// 先获取工作表的第3行,0基索引为2 Row row3 = sheet.getRow(2); if (row3 == null) { return 0; } // 后续调用validaLinha(row3)或者直接复用上面的校验逻辑即可
内容的提问来源于stack exchange,提问作者johny campos
相关产品推荐
相关产品推荐

