使用Apache POI Java读取Excel时工作表数量异常问题求助
解决Apache POI读取Excel时工作表数量为0的问题
嘿,我一眼就发现问题所在了!你遇到的这个“工作表数量为0,访问索引0报错”的问题,根源是你根本没把要读取的Excel文件流传入HSSFWorkbook。
先看看你代码里的关键错误行:
HSSFWorkbook wb = new HSSFWorkbook();
你现在是直接新建了一个空的工作簿对象,完全没有关联你前面打开的fs文件输入流,自然读不到test.xlsx里的3个工作表,所以wb.getNumberOfSheets()返回0,访问索引0的工作表就会抛出那个IllegalArgumentException。
修正后的代码
把文件流传入HSSFWorkbook的构造方法,同时补充一些资源管理和格式兼容的优化:
// 推荐用try-with-resources自动关闭流,避免资源泄漏 try (FileInputStream fs = new FileInputStream(new File("C:/Users/TO124415/Desktop/test.xlsx"))) { // 注意:HSSFWorkbook对应xls格式,如果你的文件是xlsx,应该用XSSFWorkbook // 也可以用WorkbookFactory创建通用实例,兼容两种格式 // Workbook wb = WorkbookFactory.create(fs); HSSFWorkbook wb = new HSSFWorkbook(fs); int number = wb.getNumberOfSheets(); System.out.println("工作表数量:" + number); HSSFSheet hs = wb.getSheetAt(0); FormulaEvaluator form = wb.getCreationHelper().createFormulaEvaluator(); // 先判断工作表和行是否为空,避免空指针 if (hs != null) { for (Row rw : hs) { for (Cell cell : rw) { switch (form.evaluateInCell(cell).getCellType()) { case Cell.CELL_TYPE_NUMERIC: System.out.println(cell.getNumericCellValue()); break; // 别忘了加break,不然会执行后续case case Cell.CELL_TYPE_STRING: System.out.println(cell.getStringCellValue()); break; } } } } } catch (IOException e) { e.printStackTrace(); }
额外注意点
- 文件格式匹配:
HSSFWorkbook仅支持旧版的.xls格式Excel文件,如果你要读取的是.xlsx(新版Office格式),请改用XSSFWorkbook,或者使用WorkbookFactory.create(fs)来自动适配格式,更灵活。 - 空指针防护:读取行和单元格时最好先判断是否为
null,避免因Excel中存在空白行/单元格导致的空指针异常。 - switch的break:你原来的switch代码里没有加
break,会导致一个case执行完后继续执行下一个case,这会让输出结果混乱,记得补上。
你原来的报错信息:
Exception in thread "main" java.lang.IllegalArgumentException: Sheet index (0) is out of range (no sheets)
就是因为空工作簿没有任何工作表,所以访问索引0自然越界啦,修正后应该就能正常读取到3个工作表了。
内容的提问来源于stack exchange,提问作者Dev web
相关产品推荐
相关产品推荐

