使用easyexcel导出的excel文件,使用poi读取时异常处理方案
作者:橙巴布
场景
一个导出服务,传入json数据,根据数据生成excel文件返回。
别的项目有一个需求,导出文件给用户修改,修改后再次导入。
之前一直没有问题,这一天,突然报了个 【文件读取失败】异常!!!(这里为后台的自定义异常信息,其原因是POI读取文件时抛出了异常)
经过研究发现,使用服务导出的excel文件大小是6kb,但是只要打开文件,再保存,哪怕什么都不修改,文件大小会变为11kb。然后再次导入时,就能正常导入。(问我之前为什么没问题?正经人导出来肯定是修改了再导回去啊!!!不然原数据导回去干嘛!!!)
但是,问题既然出现了,那肯定要解决嘛。于是,开始了一顿的搜索…肯定是没有搜索到,不然我就不写这个了(也可能是搜索得不到位O(∩_∩)O哈哈~)。
环境
easyexcel 2.2.6版本
找bug
现在下载了一个服务(使用easyexcel写的)导出的,没有经过修改的文件A.xlsx,然后复制了一份并命名B.xlsx.
- A.xlsx 6kb 未修改
- B.xlsx 11kb 原6kb,只是打开后点了保存。没有动任何数据!!!
现象:
- A文件上传报【文件读取失败】
- B文件上传成功
这里把两个文件后缀改成rar(压缩文件格式都可以)
然后进行了两个文件的对比,有了以下发现:
- A文件的shardStrings.xml中没有存放数据,它的数据存在worksheets/sheet1.xml中
- B文件的数据存放在shardStrings.xml中,而worksheets/sheet1.xml中只记录了sheet的一些配置信息
但是直接用office软件打开,不管哪个显示都是正常的,没有报错,数据也正常,说明它是兼容的,但是保存的时候,office会把A文件的存储格式转换为B文件。
过程如图:
思路
我刚开始以为是easyexcel进行了数据或者文件压缩导致的,于是我搜索了下,没有任何有用的信息,浪费了我好一会儿时间。
解决
灵机一动,阿里的,应该有官方文档,搜索了下,真有官方文档。
最终在文档在常见问题中找到了这个解决办法(当然,因为这里的业务是小模板数据填充,不涉及到大数据量,所以直接使用,如果有大数据量,按文档的解释是可能溢出的,各位按自己业务场景处理)。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。