使用SheetContentsHandler读取大Excel时Apache POI抛出NPE
解决XSSFSheetXMLHandler解析Excel时的空指针异常
你遇到的空指针异常,核心原因是初始化XSSFSheetXMLHandler时没有传入SharedStringsTable实例。Excel的XLSX格式会将重复字符串存入共享字符串表,单元格仅存储索引,解析时必须通过该表获取实际字符串,空的实例会导致调用getItemAt方法时触发空指针。
修改后的主代码
OPCPackage pkg = OPCPackage.open(file); XSSFReader reader = new XSSFReader(pkg); // 关键步骤:获取共享字符串表实例 SharedStringsTable sst = reader.getSharedStringsTable(); InputStream sheet = reader.getSheet("rId1"); XMLReader parser = XMLHelper.newXMLReader(); CustomXSSFSheetHandler sheetHandler = new CustomXSSFSheetHandler(); // 初始化XSSFSheetXMLHandler时传入sst(第二个参数) parser.setContentHandler(new XSSFSheetXMLHandler(null, sst, sheetHandler, false)); InputSource sheetSource = new InputSource(sheet); parser.parse(sheetSource); recordList = sheetHandler.getRecords(); // 关闭资源,避免泄漏 sheet.close(); pkg.close();
补充说明
- SharedStringsTable的作用:XLSX文件会把重复出现的字符串统一存储,单元格仅记录索引,解析时必须通过该表把索引转换为实际文本,不传的话遇到这类单元格就会报错。
- 资源关闭:新增
pkg.close()确保OPCPackage资源被释放,避免文件被占用。 - 格式兼容:当前代码中
formattedValue已经是Excel显示的格式化字符串,你的类型转换逻辑(转Long/Double)需要确保对应列的内容确实是数字,否则会抛出NumberFormatException,可以根据实际情况添加异常处理。
内容的提问来源于stack exchange,提问作者Asim
相关产品推荐
相关产品推荐

