XSSFWorkbook调用close()方法报找不到符号运行时错误求助
解决XSSFWorkbook找不到close()方法的问题
嘿,我来帮你搞定这个报错!你遇到的cannot find symbol: method close()问题,核心原因是Apache POI版本的差异导致XSSFWorkbook是否支持close()方法有所不同,下面给你具体的解决方案:
为什么会出现这个错误?
在Apache POI的版本迭代中:
- POI 3.x及更早版本:
XSSFWorkbook并没有提供close()方法,这个方法是在POI 4.0之后才被添加到Workbook接口中,由XSSFWorkbook实现的。 - 如果你当前依赖的是旧版POI,调用
workbook.close()自然会找不到这个方法。
具体解决方案
方案1:升级到POI 4.0+版本(推荐)
如果你可以升级POI版本,建议直接升级到4.0或更高版本,这样XSSFWorkbook就支持close()方法了。同时更推荐使用try-with-resources语法,它会自动实现资源的关闭(包括流和workbook),避免手动关闭可能带来的遗漏:
private void createHandBackFile(XSSFSheet sheet, String programId, XSSFWorkbook workbook) throws IOException { String output = "C:\\Users\\muddassirr\\Downloads\\Personal\\STORE\\Output"; File file = new File(output + File.separator + programId); if (!file.exists()) { file.mkdirs(); } int noOfColumns = sheet.getRow(0).getPhysicalNumberOfCells(); for(int i = 0; i < noOfColumns; i++) { sheet.autoSizeColumn(i); } // 使用try-with-resources自动管理输出流,无需手动close try (FileOutputStream outputStream = new FileOutputStream( new File(output + File.separator + programId + File.separator + "HAND_BACK.xlsx"))) { workbook.write(outputStream); } // POI 4.0+中,workbook实现了AutoCloseable,也可以把它加入try-with-resources自动关闭 // 或者需要手动调用的话,直接workbook.close()即可 }
方案2:保留旧版POI(3.x)的处理方式
如果你无法升级POI版本,只需要移除代码中的workbook.close()调用,换成旧版POI支持的资源释放方式:
- 如果你是通过输入流创建的
XSSFWorkbook,一定要确保关闭那个输入流; - 调用
workbook.dispose()方法来释放POI内部的底层资源(这个方法在3.x版本中是存在的)。
修改后的代码示例:
private void createHandBackFile(XSSFSheet sheet, String programId, XSSFWorkbook workbook) throws IOException { String output = "C:\\Users\\muddassirr\\Downloads\\Personal\\STORE\\Output"; File file = new File(output + File.separator + programId); if (!file.exists()) { file.mkdirs(); } int noOfColumns = sheet.getRow(0).getPhysicalNumberOfCells(); for(int i = 0; i < noOfColumns; i++) { sheet.autoSizeColumn(i); } FileOutputStream outputStream = new FileOutputStream( new File(output + File.separator + programId + File.separator + "HAND_BACK.xlsx")); workbook.write(outputStream); outputStream.close(); // 替换close()为dispose()来释放资源 workbook.dispose(); }
内容的提问来源于stack exchange,提问作者Muddassir Rahman
相关产品推荐
相关产品推荐

