EasyExcel You can try specifying the ‘excelType‘ yourself 异常排查与处理

目录

问题发现

报错信息

问题排查

1、确定异常

2、查询easyexcel源码读取文件源码

3、查看业务代码

优化方案

1、将路径获取文件流的方式换为httpclient获取

2、dug测试修改代码

总结


问题发现

在测试环境测试导入订单,发现订单导入提示数据导入异常。

报错信息

查看日志发现easyexcel读取文件导入数据报错:

com.alibaba.excel.exception.ExcelCommonException: Convert excel format exception.You can try specifying the 'excelType' yourself

at com.alibaba.excel.support.ExcelTypeEnum.recognitionExcelType(ExcelTypeEnum.java:97)

at com.alibaba.excel.support.ExcelTypeEnum.valueOf(ExcelTypeEnum.java:78)

at com.alibaba.excel.analysis.ExcelAnalyserImpl.choiceExcelExecutor(ExcelAnalyserImpl.java:62)

at com.alibaba.excel.analysis.ExcelAnalyserImpl.<init>(ExcelAnalyserImpl.java:51)

at com.alibaba.excel.ExcelReader.<init>(ExcelReader.java:145)

at com.alibaba.excel.read.builder.ExcelReaderBuilder.build(ExcelReaderBuilder.java:193)

at com.alibaba.excel.read.builder.ExcelReaderBuilder.sheet(ExcelReaderBuilder.java:229)

at com.alibaba.excel.read.builder.ExcelReaderBuilder.sheet(ExcelReaderBuilder.java:217)

at com.ysjr.base.business.service.impl.ImportOrderFileServiceImpl.orderExcel(ImportOrderFileServiceImpl.java:177)

问题排查

1、确定异常

根据报错信息确定是easyexcel没有获取到excel文件类型

2、查询easyexcel源码读取文件源码

如图所述发现只要读取的文件类型不是 xls或者xlsx则会抛出异常:

Convert excel format exception.You can try specifying the 'excelType' yourself

至此可以判定我们读取到的文件流应该不是规定格式的文件。

3、查看业务代码

分析业务代码

如图所示发现不是我们获取到的是HttpInputStream,不是一个文件流,所以后续我们根本不能获取到文件后缀导致easyexcel判断报错。

优化方案

既然已经知道是我业务代码获取到的流不是文件流,我们修改获取文件流的逻辑

1、将路径获取文件流的方式换为httpclient获取

String fileUrl = resultMsg.get(CommonConstants.DATA).toString(); 
List dataList = null; 
try { 
    /*URL url = new URL(fileUrl); 
    //链接url URLConnection uc = url.openConnection(); 
    //获取输入流 InputStream in = uc.getInputStream();*/
    CloseableHttpClient client = HttpClients.createDefault();
    HttpGet get = new HttpGet(fileUrl); 
    HttpResponse response = client.execute(get); 
    HttpEntity entity = response.getEntity(); 
    InputStream in = entity.getContent(); 
    dataList = EasyExcel.read(in, ImportOrderFile.class, 
new HeadDataListener()).sheet().doReadSync(); 
    //处理导入数据 
    this.importOrderExcel(inputFile, dataList); 
    inputFile.setStatus((byte) 3); 
} catch (IOException e) {
    log.error("读取导入文件失败:", e); inputFile.setStatus((byte) 4); 
}

2、dug测试修改代码

deg发现我们httpclient获取的流已经变化为EofSensorInputStream 

经测试该流中包含正常的文件类型标识,可以被其他的中间件验证读取。

总结

出现异常提示一般都是自身业务代码异常,可以用其他的方式避免问题的发生。本次异常可以通过HttpGet HttpGet 方式获取到EofSensorInputStream流,从而达到兼容中间件的能力。

猜你喜欢

转载自blog.csdn.net/weixin_39970883/article/details/129316000
今日推荐