目录
问题发现
报错信息
问题排查
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.
at com.alibaba.excel.ExcelReader.
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)
根据报错信息确定是easyexcel没有获取到excel文件类型
如图所述发现只要读取的文件类型不是 xls或者xlsx则会抛出异常:
Convert excel format exception.You can try specifying the 'excelType' yourself
至此可以判定我们读取到的文件流应该不是规定格式的文件。
分析业务代码
如图所示发现不是我们获取到的是HttpInputStream,不是一个文件流,所以后续我们根本不能获取到文件后缀导致easyexcel判断报错。
既然已经知道是我业务代码获取到的流不是文件流,我们修改获取文件流的逻辑
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);
}
deg发现我们httpclient获取的流已经变化为EofSensorInputStream
经测试该流中包含正常的文件类型标识,可以被其他的中间件验证读取。
出现异常提示一般都是自身业务代码异常,可以用其他的方式避免问题的发生。本次异常可以通过HttpGet HttpGet 方式获取到EofSensorInputStream流,从而达到兼容中间件的能力。