java中用try-with-resources读写excel文件的核心是让apache poi资源自动关闭:读取推荐workbookfactory.create(inputstream)识别格式,写入需先声明workbook再声明fileoutputstream以确保write()后关闭。

Java 中用 try-with-resources 读写 Excel 文件,核心是让 Apache POI 的资源(如 Workbook、FileInputStream、FileOutputStream)自动关闭,避免手动调用 close(),防止资源泄漏和文件锁问题。
读取 Excel 文件(.xlsx)
使用 XSSFWorkbook(或更推荐的 WorkbookFactory)配合 FileInputStream,二者都实现 AutoCloseable,可直接用于 try-with-resources:
- 推荐用
WorkbookFactory.create(InputStream),它能自动识别 .xls 或 .xlsx 格式 - 不要用
new XSSFWorkbook(new FileInputStream(...))手动嵌套,容易漏关流 - 读取后无需显式
close(),try 块结束自动释放
示例代码:
try (FileInputStream fis = new FileInputStream("data.xlsx");
Workbook workbook = WorkbookFactory.create(fis)) {
Sheet sheet = workbook.getSheetAt(0);
for (Row row : sheet) {
for (Cell cell : row) {
System.out.print(cell.toString() + "\t");
}
System.out.println();
}
} catch (IOException | InvalidFormatException e) {
e.printStackTrace();
}
写入 Excel 文件(.xlsx)
写入需用 FileOutputStream,注意它必须在 workbook.write() 之后才关闭(否则内容可能未刷出),而 try-with-resources 会按声明逆序关闭——所以要把 FileOutputStream 放在 Workbook 之后声明,确保先写再关流:
- 创建
XSSFWorkbook(或用WorkbookFactory.create(new ByteArrayInputStream(new byte[0]))获取空工作簿) - 在 try 括号中先声明
Workbook,再声明FileOutputStream - 调用
workbook.write(outputStream)完成写入,系统会自动 flush 并关闭流
示例代码:
try (Workbook workbook = new XSSFWorkbook();
FileOutputStream fos = new FileOutputStream("output.xlsx")) {
Sheet sheet = workbook.createSheet("数据");
Row row = sheet.createRow(0);
row.createCell(0).setCellValue("Hello");
row.createCell(1).setCellValue(123);
workbook.write(fos); // 必须显式调用 write()
} catch (IOException e) {
e.printStackTrace();
}
注意事项与常见坑
-
不能混用 InputStream 和 OutputStream:读写不能共用同一个文件句柄;写入时若文件已打开(如被 Excel 程序占用),会抛
IOException -
POI 5.2+ 推荐用
WorkbookFactory替代硬编码HSSFWorkbook/XSSFWorkbook,更健壮 -
大数据量慎用 try-with-resources + 内存版 Workbook:
XSSFWorkbook全部加载到内存,建议大文件改用SXSSFWorkbook(流式写入),它也支持 try-with-resources -
写入后务必调用
workbook.write(outputStream),否则文件为空——这是初学者最常忽略的一步
依赖配置(Maven)
确保引入正确版本的 Apache POI(建议 5.2.4+)及必要模块:
<dependency><groupid>org.apache.poi</groupid><artifactid>poi</artifactid><version>5.2.4</version></dependency><dependency><groupid>org.apache.poi</groupid><artifactid>poi-ooxml</artifactid><version>5.2.4</version></dependency>
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











