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

使用SXSSFWorkbook生成Excel报表超100条数据时表头丢失问题

问题原因
  • 核心原因是SXSSFWorkbook的流式处理特性:你初始化时传入的参数100是内存行缓存窗口大小,当生成的总行数超过100时,最早生成的行(即你写在第0行的表头)会被自动刷入磁盘临时文件,从JVM内存中移除。
  • 你自定义的writeWorkbookAsCSVToOutputStream方法使用的rowIterator默认只能遍历内存中留存的行,无法读取已经刷到磁盘的历史行:
    • 当数据量少于100条时,表头+数据的总行数≤100,所有行都在内存中,遍历时能正常读取表头
    • 当数据量超过100条时,表头行已经被刷入磁盘不在内存中,遍历不到自然就缺失表头
  • 额外的小bug:你创建表头第一列(Username)后没有给cellValueCount执行自增,导致第二列(First Name)直接覆盖了第一列的内容,也会导致表头第一列显示异常。
修复方案
  1. 先修复表头列索引问题:创建完Username单元格后添加cellValueCount++;,避免列内容覆盖。
  2. 解决SXSSF历史行读取问题,推荐以下几种方案:
    • 方案1(推荐,无额外内存开销):生成CSV不需要先写完整个Workbook再遍历转存,可以在逐行写入Workbook的同时,直接把行内容写入CSV输出流,不需要二次遍历Workbook。
    • 方案2(实现最简单):生成CSV时先手动写入固定的表头内容,再遍历数据行,不需要读取Workbook的第0行,从根源避开读取历史行的问题。
    • 方案3(不推荐,有内存压力):遍历Workbook前调用((SXSSFSheet)sheet).bufferRows(),把所有刷到磁盘的行重新读回内存,但是大数据量下会触发内存溢出,回到你最初的性能问题。
  3. 兼容性优化:HSSFRichTextString是旧版.xls格式的专用类,你用SXSSF处理的是.xlsx格式,建议替换为XSSFRichTextString避免兼容问题;导出Excel时建议把文件后缀改为.xlsx,避免格式不匹配导致Excel解析异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 19:06:08