使用Apache POI将MySQL数据导出至Excel文件后无法打开文件的问题
解决Apache POI生成Excel无法打开的问题
你遇到的问题核心在于错误使用了追加模式的FileOutputStream,这直接破坏了Excel文件的二进制结构,导致文件损坏无法正常打开。下面我帮你拆解问题并修复代码:
问题根源分析
Excel是结构化的二进制格式文件,并非纯文本,绝对不能用追加(true参数)的方式写入数据。你的代码中这一行是关键错误:
FileOutputStream output_file = new FileOutputStream(new File("Tracker.xlsx"),true);
追加模式会把新生成的Excel数据直接拼在原文件末尾,彻底打乱了Excel的格式结构,自然会导致打开时报错。
另外,你的流关闭顺序也存在问题,正确的操作顺序应该是先完成工作簿写入,再刷新并关闭输出流,最后关闭工作簿。
修复后的核心代码片段
修改流的写入模式并调整操作顺序:
// ... 原有数据读取、Excel填充逻辑保持不变 fis.close(); // 移除第二个参数true,使用覆盖模式写入文件 FileOutputStream output_file = new FileOutputStream(new File("Tracker.xlsx")); // 先将工作簿写入输出流 workbook.write(output_file); // 刷新并关闭输出流,再关闭工作簿 output_file.flush(); output_file.close(); workbook.close(); System.out.println("SUCCESS"); // ... 后续代码保持不变
额外优化建议
推荐使用try-with-resources语法自动管理流资源,避免手动关闭时因异常导致资源泄漏:
// 用try-with-resources包裹所有流操作,自动关闭资源 try (FileInputStream fis = new FileInputStream(new File("Tracker.xlsx")); XSSFWorkbook workbook = new XSSFWorkbook(fis); FileOutputStream output_file = new FileOutputStream(new File("Tracker.xlsx"))) { // 在这里执行Excel工作表获取、数据填充逻辑 XSSFSheet worksheet = workbook.getSheetAt(0); // ... 你的数据写入代码 workbook.write(output_file); System.out.println("SUCCESS"); } catch (Exception e) { e.printStackTrace(); }
这种方式会自动关闭所有实现了AutoCloseable接口的资源,代码更简洁安全。同时也要确保你的Tracker.xlsx模板文件本身是完好无损坏的。
内容的提问来源于stack exchange,提问作者Arundhati
相关产品推荐
相关产品推荐

