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

使用POI生成Excel时行数少于135行无法打开的异常问题

解决POI+spoiwo生成小行数Excel无法打开的问题

我之前踩过类似的POI与spoiwo组合的坑,结合你贴的代码来看,问题根源几乎可以确定是流的关闭顺序冲突导致的!

问题分析

你自己创建了ByteArrayOutputStream,但调用spoiwo的writeToOutputStream方法时,它的内部实现会直接调用stream.close()——这就出问题了:

  • 当生成的行数较少时,数据还停留在缓冲区里没完全写入,就被spoiwo提前关闭了流,最终out.toByteArray拿到的是不完整的文件内容,Excel自然解析报错。
  • 当行数较多时,缓冲区被数据填满自动触发flush,完整内容已经写入到流里,所以即使之后流被关闭,生成的文件依然是完整的,能正常打开。

修复方案

最稳妥的方式是跳过spoiwo的writeToOutputStream方法,直接调用POI原生的写入逻辑,自己掌控流的生命周期:

val out = new ByteArrayOutputStream()
try {
  wb = createWorkbook()
  // 直接用POI的XSSFWorkbook写流,绕过spoiwo的封装方法
  wb.convertAsXlsx().write(out)
  out.flush()
  out.toByteArray
} finally {
  IOUtils.closeQuietly(out)
}

额外验证建议

你可以把生成的字节数组保存成本地文件,然后用解压工具打开XLSX文件(本质是压缩包),查看里面的XML内容:

  • 无法打开的小行数文件,对应的XML大概率是不完整的标签结构
  • 能正常打开的大行数文件,XML结构是完整闭合的

这也能进一步验证流提前关闭导致文件损坏的问题。

内容的提问来源于stack exchange,提问作者pme

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 05:08:44