alibaba / easyexcel

快速、简洁、解决大文件内存溢出的java处理Excel工具
https://easyexcel.opensource.alibaba.com
Apache License 2.0
32.01k stars 7.49k forks source link

解析xlsx正确,解析xls报错,麻烦请看下?(已解决,解决方法请看答案末尾) #387

Closed seaguil closed 5 years ago

seaguil commented 5 years ago

image 就是指箭头地方报错了,解析xlsx和xls的内部方法是不一样的吗? 下面是报错的信息: 2019-05-30 16:57:09.368 WARN 22892 --- [l-1 housekeeper] com.zaxxer.hikari.pool.HikariPool : HikariPool-1 - Thread starvation or clock leap detected (housekeeper delta=58s710ms615?s623ns). com.alibaba.excel.exception.ExcelAnalysisException: File type error,io must be available markSupported,you can do like this new BufferedInputStream(new FileInputStream(\"/xxxx/xxx/77.xlsx\")) " at com.alibaba.excel.analysis.ExcelAnalyserImpl.getSaxAnalyser(ExcelAnalyserImpl.java:59) at com.alibaba.excel.analysis.ExcelAnalyserImpl.analysis(ExcelAnalyserImpl.java:73) at com.alibaba.excel.analysis.ExcelAnalyserImpl.analysis(ExcelAnalyserImpl.java:68) at com.alibaba.excel.ExcelReader.read(ExcelReader.java:112) at com.alibaba.excel.EasyExcelFactory.readBySax(EasyExcelFactory.java:50) at com.zcf.universe.service.JrkService.analysisExcel(JrkService.java:122)

seaguil commented 5 years ago

我的file是通过接口上传得到的。测试上传解析xlsx是没有问题的?试了下xls就直接报错了?不知道问题出现在哪里?

zhuangjiaju commented 5 years ago

打开 ExcelAnalyserImpl 58 设置个断点 ,看下e 的信息

seaguil commented 5 years ago

打开 ExcelAnalyserImpl 58 设置个断点 ,看下e 的信息

image 他直接出来,没有进去

zhuangjiaju commented 5 years ago

58行 你断点设置了没

seaguil commented 5 years ago

58行 你断点设置了没

image 58行已经出去方法了啊,是结尾了。。。。。。

seaguil commented 5 years ago

58行 你断点设置了没

image image 这行直接就跳出来异常了,对你进行排查可以有帮助的吧

zhuangjiaju commented 5 years ago

哦 哦 版本不一样 53行 把 va3 的值给我 应该是个堆载

seaguil commented 5 years ago

哦 哦 版本不一样 53行 把 va3 的值给我 应该是个堆载

File type error,io must be available markSupported,you can do like this new BufferedInputStream(new FileInputStream(\"/xxxx/xxx/77.xlsx\"))

我打了断点在53了,但是va3的值没有啊,我鼠标放在上面啥都没有,根本就不显示。有点无奈。 image

下面是我的版本 image

zhuangjiaju commented 5 years ago

就 46 53 可能抛出这个异常 ,你要看下 他本来的异常是啥,不然我也没法处理

zhuangjiaju commented 5 years ago

或者 升级版本号 1.1.2-beat5 试试

seaguil commented 5 years ago

或者 升级版本号 1.1.2-beat5 试试

是的,他就是先从46抛出了异常,然后又跳出来53的异常的。 我进到this.saxAnalyser = new XlsxSaxAnalyser(this.analysisContext);这个方法里面报错的。 this.xssfReader = new XSSFReader(OPCPackage.open(analysisContext.getInputStream())); 就是上面报的错,才出来的。

seaguil commented 5 years ago

或者 升级版本号 1.1.2-beat5 试试

我升级了,但是还是不行。 Xls must be available markSupported,you can do like this new BufferedInputStream(new FileInputStream("/xxxx"))

zhuangjiaju commented 5 years ago

你readeSax(new BufferedInputStream(inputstream,***)) 试试

seaguil commented 5 years ago

你readeSax(new BufferedInputStream(inputstream,***)) 试试

还是不行,同样的错误

zhuangjiaju commented 5 years ago

ExcelTypeEnum 31行 看下 inputStream的属性 是不是BufferedInputStream

seaguil commented 5 years ago

ExcelTypeEnum 31行 看下 inputStream的属性 是不是BufferedInputStream

image 不是的啊

seaguil commented 5 years ago

ExcelTypeEnum 31行 看下 inputStream的属性 是不是BufferedInputStream

image 不是的啊

大佬,我找到解决办法了,等我下,我在测试下是否正确。

zhuangjiaju commented 5 years ago

你要调试过去看 不是看源代码

seaguil commented 5 years ago

这里说一下我的排查方法思路。 之前我有使用的版本不是最新的1.1.2-beta5。具体哪个版本我也忘记了,当时我尝试了有一个问题,上传xlsx类型时候,inputStream不能通过new BufferedInputStream(file.getInputStream());进行获取,只能通过file.getInputStream()进行获取才可以正常读取数据。 最近想了下看看是否可以同样的方法支持xls读取。 先用了file.getInputStream()获取但是不行,老是报错如下: Xls must be available markSupported,you can do like this new BufferedInputStream(new FileInputStream("/xxxx"))。 楼主建议我尝试了new BufferedInputStream(file.getInputStream());试试,结果还是不行,输出错误相同。 当时我就纳闷了,于是我不服输,之前我从git挡下来一份easyexcel的源码进行了测试。 image

我看了下,都是使用的readBySax的方法,怎么会报错呢。 原方法测试2003.xls的竟然成功了,没有报错。 于是我把我自己准备的测试xls数据放入,结果就报错了!!!!! image 而且还是同样的错误。 image 然后我就复制了一份2003.xls文件,然后手动把里面数据给替换成我自己业务数据。结果就成功了。 原因我也不知道,同样的xls类型文件,有的规范有的还规范吗。那以后基于2003.xls模板进行读取数据就行了。先走通流程再说吧。既然我们知道问题了,就修改下。 测试代码是通过本地获取文件file的,我业务项目是通过接口上传得到的,所以我先使用file.getInputStream()获取,结果还是报错同样的错误。然后我把它换成了new BufferedInputStream(file.getInputStream());进行获取结果就对了。 image

更懵逼的是,以前上传xlsx类型时候,使用new Buffer.....是报错的,刚才又试了下,结果也成功读取了? 现在无论是xlsx和xls读取,使用new Buffer...都是可以的。(我现在使用的 是最新的版本)。只是版本不一样而已,其他都是没变的。

最终反正问题是解决了,这使我很高兴的。希望楼主看到我出现问题的地方和排查思路,对其现有版本一些修改和建议。通用的xls文件上传有问题?这个东西我要好好排查文件设置或者哪里有问题的,现阶段就是先用它提供的2003.xls进行走通业务流程。