使用阿里的easyexcel 导入xls类型Excel文件报错问题深挖

1、报错如下:

Xls must be available markSupported,you can do like this <code> new BufferedInputStream(new FileInputStream(\"/xxxx\"))</code>

翻译一下:这里报错重点意思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这一步,图片中红框是获取文件类型,这里我发现xlsxxls文件类型皆获取不到,那为什么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 谢谢大家观看,原创不易,希望大家点赞转发,让阿里大神帮解答哈哈哈

  • 10
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
使用EasyExcel导入Excel文件非常简单,只需要遵循以下步骤: 1. 在pom.xml文件中添加easyexcel依赖: ```xml <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>2.2.2</version> </dependency> ``` 2. 创建一个实体类来存储Excel表格中的数据。 ```java @Data public class ExcelData { private String name; private Integer age; private String email; } ``` 3. 创建一个Excel读取器类。 ```java public class ExcelReader { public static List<ExcelData> readExcel(String fileName) throws Exception { InputStream inputStream = new FileInputStream(fileName); ExcelReader excelReader = new ExcelReader(inputStream, null, new ExcelListener()); excelReader.read(); List<ExcelData> dataList = ((ExcelListener)excelReader.getEventListener()).getDataList(); inputStream.close(); return dataList; } } ``` 4. 创建一个Excel监听器类,用于处理Excel表格中的数据。 ```java public class ExcelListener extends AnalysisEventListener<ExcelData> { private List<ExcelData> dataList = new ArrayList<>(); @Override public void invoke(ExcelData excelData, AnalysisContext analysisContext) { dataList.add(excelData); } @Override public void doAfterAllAnalysed(AnalysisContext analysisContext) { } public List<ExcelData> getDataList() { return dataList; } public void setDataList(List<ExcelData> dataList) { this.dataList = dataList; } } ``` 5. 在Controller中调用ExcelReader类的readExcel方法来读取Excel文件中的数据。 ```java @RestController public class ExcelController { @RequestMapping("/importExcel") public String importExcel(@RequestParam("file") MultipartFile file) { try { String fileName = file.getOriginalFilename(); List<ExcelData> dataList = ExcelReader.readExcel(fileName); // 处理数据 return "导入成功"; } catch (Exception e) { e.printStackTrace(); return "导入失败"; } } } ``` 这样就可以使用EasyExcel导入Excel文件了。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值