使用阿里的easyexcel 导入xls类型Excel文件报错问题深挖 |
您所在的位置:网站首页 › easyexcel读 › 使用阿里的easyexcel 导入xls类型Excel文件报错问题深挖 |
1、报错如下:
Xls must be available markSupported,you can do like this new BufferedInputStream(new FileInputStream(\"/xxxx\"))
翻译一下:这里报错重点意思xls必须要有这个标识markSupported必须为True,建议你用new BufferedInputStream(new FileInputStream(\"/xxxx\"))这种编码方式 解释一下: 大家都知道,只要用InputStream这个类中markSupported为false,但嵌套一层BufferedInputStream,BufferedInputStream中markSupported标识为true,这样就不会报错了。 下面这个是InputStream的源码截图 2、报错前提:a、用以下方式会出现文中所说内容报错(InputStream方式xls文件类型报错,xlsx不会报错可正常使用) InputStream inputStream = new FileInputStream(path); ExcelReader excelReader = EasyExcelFactory.getReader(inputStream, excelListener) b、用一下方式获取不会出现文中所说内容(BufferedInputStream方式xls和xlsx文件类型都正常) InputStream inputStream = new BufferedInputStream(new FileInputStream(path)); ExcelReader excelReader = EasyExcelFactory.getReader(inputStream, excelListener) 3、有BufferedInputStream可以解决报错问题,为什么不用?1 用BufferedInputStream方式是可以导入xls类型文件但是导入的获取的值全是String类型 2 举个例子: 就这样一个简单的数字,那么实际到后台转换后会变成这样的字符串"36,041,348.28"带逗号后是没办法转换成bigDecimal类型很是麻烦。 4、一探究竟,为何esayexcel支持xlsx文件类型导入,而不支持xls呢?注:以下是不用BufferedInputStream情况,深入解析到底是哪里出的问题。 Step1: 首先进入esayexcel中的ExcelReader这一步,图片中红框是获取文件类型,这里我发现xlsx和xls文件类型皆获取不到,那为什么xlsx能导入,而xls就不行呢?继续往下走。 step2: 这步也是关键一步,这个就是获取类型step1这块为啥用InputStream去接,类型都会空,我以为xlsx这块会返回类型呢,没想到xlsx和xls都是获取不到类型,凭啥xlsx就这么任性,xls就被拒之门外?往下走,最后一步见分晓。 step3: 如下图所示: A这块代码根据类型不等于空,那么上两步得知xlsx和xls文件类型都获取不到这个excelType,都是空。 B必走此块代码重点是分析一下这个try,catch代码吧。 1这块代码是xlsx格式文件,这也就是为什么用InputStream流去接xlsx格式Excel文件可以正常导入。 继续往下看,那这里如果是我们导入xls格式Excel文件,却用XlsxSaxAnalyser去处理肯定报错到catch中被捕获。 cash中红框重点的重点在这里,这里又进行了一次markSupported判断,首先这个判断我没太理解意义何在, 因为如果markSupported不是false的话肯定能获取类型,不会到else这步里。 然后这里如果markSupported为false的情况直接抛出异常了,大家看到了这个判断下面的2 即是处理xls文件格式的方法。 “世界上从来没有这么近的距离,我却与你那么远!” 5 总结1 如果这里有阿里工程师帮我解答一下为何哪里要再判断一下markSupported为true再去用XlsSaxAnalyser去分析文件 2 如果没有为什么,希望阿里大神看见文章,可以将此修改一下,将判断去掉即可。 3 谢谢大家观看,原创不易,希望大家点赞转发,让阿里大神帮解答哈哈哈 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |