dreamzy996

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
  12 随笔 :: 0 文章 :: 0 评论 :: 36325 阅读

我在使用easycel导出到zip包中时,出现了这个问题。各种文件输出时产生的问题其实大同小异

查看了一些网上的文章,还有github上关于此bug的issue,总算是理清并解决了。

解决方法一

主要原因是输出流过早关闭,导致执行 excelWriter.finish() 时会出错。

excelWriter是在我们创建输出表格的时候建立的对象,里面包含了IO对象;

正常单个导出的时候调用 finish() 才是正常关流,但是在输出到zip时我们采用了其它方式 

workbook.write(zos); // 此方法也会关流,当第二次使用的时候会报异常

所以不用调用 finish() 方法就可以解决这个bug了

解决方法二

之前

// 直接用workbook.write(zos),
workbook.write(zos);

中间采用 ByteArrayOutputStream 解决

复制代码
// workBook.write会指定关闭数据流,
// 直接用workbook.write(zos), 下次就会抛出zos已被关闭的异常,所以用ByteArrayOutputStream来拷贝一下。
ByteArrayOutputStream bos = new ByteArrayOutputStream();

// workbook写入bos
workbook.write(bos);

// bos写入zos
bos.writeTo(zos);   
复制代码

 

解决方法三

如果前端页面响应时间过短,那就会断开连接,断开连接的话,响应流都没有了,肯定会在关流的时候报错啊(这个场景,就是我碰见的)

补充网络上其它解决方案

网络上其它答案说是因为版本问题,我感觉不是,因为easyexcel依赖已经完整包含了poi:3.17依赖

看图

补充方法

 但是还是放上来其它人说的解决办法吧(我不用这几个):
1.检查:查看poi版本是否冲突
2.检查是否缺少依赖版本
3.检查poi的版本要大于等于3.17版本

(easyexcel2.27依赖已经包含了3.17的所有poi依赖)

总结:

  • 当我们调用 excelWriter.finish()  时, 必须保证 excelWriter 对象中的IO流未释放
  • 循环打包文件时不能直接使用 wrtite(zip文件流),中间需要用byte流转换一次
  • 注意前后端建立连接的时长
  • 注意版本号

參考地址

github上的issue地址:https://github.com/alibaba/easyexcel/issues/1872

还有excel合并zip地址:https://www.jianshu.com/p/a082eeba88a9

参考:https://www.bbsmax.com/A/B0zqravKJv/

posted on   凉小枫  阅读(17324)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示