You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 06:17:45