liaochong / myexcel

MyExcel, a new way to operate excel!
https://github.com/liaochong/myexcel/wiki
Apache License 2.0
1.66k stars 325 forks source link

在有大量单元格合并的情况下,导出excel非常的慢 #338

Closed sunxiang0918 closed 2 years ago

sunxiang0918 commented 2 years ago

Bug描述 描述Bug产生的现象(A clear and concise description of what the bug is.) 在有大量单元格合并的情况下,导出excel非常的慢.

Bug复现 按如下步骤复现(Steps to reproduce the behavior):

  1. 使用10000条数据构造 sheet: DefaultExcelBuilder.of(xxxx).build(sheetData), 大概130个列
  2. 调用 sheet.addMergedRegionUnsafe(mergeCell) 进行单元格合并, 最后合并成500行
  3. 非常的慢, 构造sheet差不多20秒, 合并单元格用时80秒左右.

期望的结果 期望的结果是什么(A clear and concise description of what you expected to happen.) 性能增加.

分析过程 因为发现合并单元格用时非常的久, 在这个页面找到了点眉目: https://bz.apache.org/bugzilla/show_bug.cgi?id=60397 也就是在poi4.x里面存在这个问题, 并在poi5.x中进行了修复. 因此,尝试升级到了poi5.1.0, 但myexcel依赖了部分poi4的东西,在poi5.1.0中已经没了,比如(org.apache.poi.util.POILogFactory,org.apache.poi.util.POILogger).

通过补齐代码的方式, 能大致跑起来了. 进行了测试 , 构造sheet基本没有变化,还是20秒. 但是合并单元格从80秒减少到了3秒左右. 性能得以提升.

BTW:我看 feature/3.12.0 分支其实是把poi升级到了5.0.0,不知道是什么原因,并没有合并到主分支上. 主分支版本都已经是3.12.0了....

liaochong commented 2 years ago

感谢,feature/3.12.0分支暂时被放弃了,原因在于poi 5.x版本存在较多的原有特性无法兼容,还在寻找解决方案的过程中

liaochong commented 2 years ago

另外,超过2K数据导出,建议使用DefaultStreamExcelBuilder导出,性能会有较大的提升

sunxiang0918 commented 2 years ago

哦. 我看了 poi5 是改动比较大.

改用DefaultStreamExcelBuilder 是可以加速sheet的构建速度. 但是合并单元格由于是poi4本身的问题,性能还是会卡在那里.

liaochong commented 2 years ago

元旦前会出一个5版本支持poi 5.x版本,牺牲一小部分能力,留待后续改进

sunxiang0918 commented 2 years ago

感谢,感谢

liaochong commented 2 years ago

4.0.0.RC版本已发布,POI升级为5.1.0

sunxiang0918 commented 2 years ago

4.0.0.RC版本已发布,POI升级为5.1.0

感谢~~ 之前说的"牺牲一小部分能力"具体是指哪些呢?

liaochong commented 2 years ago

没有牺牲,偶然间都解决了

sunxiang0918 commented 2 years ago

👍🏻👍🏻👍🏻