Apache POI MissingCellPolicy在Excel读写操作中失效问题
解决Apache POI读取空单元格时的空指针异常问题
嘿,这个问题我之前踩过坑!核心原因很简单:Apache POI默认不会为Excel里的空单元格创建XSSFCell实例——当你读取一个没有数据的单元格时,row.getCell(cellIndex)会直接返回null,这时候你直接调用getCellData(或者对应的值获取方法)自然就触发空指针异常了。而有数据的单元格会被POI正常实例化,所以操作起来完全没问题。
下面给你两种靠谱的解决办法:
方法一:手动检查null并处理空值
直接在代码里先判断行、单元格是否为null,再根据单元格类型处理值,从根源避免NPE:
import java.io.File; import java.io.FileInputStream; import org.apache.poi.xssf.usermodel.XSSFCell; import org.apache.poi.xssf.usermodel.XSSFRow; import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.xssf.usermodel.XSSFWorkbook; public class ExcelReader { public static void main(String[] args) throws Exception { FileInputStream fis = new FileInputStream(new File("test.xlsx")); XSSFWorkbook workbook = new XSSFWorkbook(fis); XSSFSheet sheet = workbook.getSheetAt(0); int rowIndex = 0; int cellIndex = 1; // 假设这个位置是无数据的空单元格 XSSFRow row = sheet.getRow(rowIndex); String cellValue = ""; // 先判断行是否存在(整行空的话row也会是null) if (row != null) { XSSFCell cell = row.getCell(cellIndex); // 判断单元格是否存在 if (cell != null) { // 根据单元格类型获取对应值 switch (cell.getCellType()) { case STRING: cellValue = cell.getStringCellValue(); break; case NUMERIC: cellValue = String.valueOf(cell.getNumericCellValue()); break; case BOOLEAN: cellValue = String.valueOf(cell.getBooleanCellValue()); break; case FORMULA: // 公式单元格可以根据需要处理,比如获取计算结果 cellValue = cell.getCellFormula(); break; default: cellValue = ""; } } } System.out.println("单元格值:" + cellValue); // 空单元格会输出空字符串,不会NPE workbook.close(); fis.close(); } }
方法二:使用MissingCellPolicy自动处理空单元格
POI提供了Row.MissingCellPolicy枚举,可以让框架帮你自动处理空单元格,避免返回null:
import java.io.File; import java.io.FileInputStream; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.xssf.usermodel.XSSFCell; import org.apache.poi.xssf.usermodel.XSSFRow; import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.xssf.usermodel.XSSFWorkbook; public class ExcelReader { public static void main(String[] args) throws Exception { FileInputStream fis = new FileInputStream(new File("test.xlsx")); XSSFWorkbook workbook = new XSSFWorkbook(fis); XSSFSheet sheet = workbook.getSheetAt(0); int rowIndex = 0; int cellIndex = 1; XSSFRow row = sheet.getRow(rowIndex); String cellValue = ""; if (row != null) { // 使用CREATE_NULL_AS_BLANK策略:空单元格会被创建为空白单元格,不会返回null XSSFCell cell = row.getCell(cellIndex, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK); // 现在可以安全调用值获取方法,空白单元格会返回对应类型的默认值 cellValue = cell.getStringCellValue(); // 空单元格返回空字符串 } System.out.println("单元格值:" + cellValue); workbook.close(); fis.close(); } }
这个策略还有其他选项,比如RETURN_NULL_AND_BLANK(返回null或者空白单元格)、RETURN_BLANK_AS_NULL(把空白单元格转为null),你可以根据自己的需求选就行。
另外要注意:如果整行都是空的,sheet.getRow(rowIndex)也会返回null,所以一定要先判断行是否为null,不然调用row.getCell()也会触发NPE哦!
内容的提问来源于stack exchange,提问作者Jagadish Dabbiru
相关产品推荐
相关产品推荐

