说明

easyExcel 可谓是java使用导入导出一个非常好用的工具,
但是我们在使用excel导入excel也会遇到一些异常信息,今天水一篇帖子就是在我们导入excel数据是,其中有一些数据是不合规的,easyExcel就会去抛出异常信息,并且停止导入,这样一样我们就不知道我们上次导入的位置是哪里,我们需要把错误信息记录下来,然后做反馈给用户,告知用户哪行哪列的数据有问题,需要处理好格式再重新导入

异常信息

1
2
3
4
5
com.alibaba.excel.exception.ExcelAnalysisException: com.alibaba.excel.exception.ExcelDataConvertException: Convert data -2789 to class java.lang.String error 
at com.alibaba.excel.analysis.v07.XlsxSaxAnalyser.parseXmlSource(XlsxSaxAnalyser.java:183)
at com.alibaba.excel.analysis.v07.XlsxSaxAnalyser.execute(XlsxSaxAnalyser.java:201)
at com.alibaba.excel.analysis.ExcelAnalyserImpl.analysis(ExcelAnalyserImpl.java:115)
...

解决方法

原因

首先错误信息中的这个异常类ExcelDataConvertException,对异常的地方进行断点跟踪,发现信息如下, 然后再到ExcelDataConvertException 看源码部分如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class ExcelDataConvertException extends RuntimeException {
/**
* NotNull.
*/
private Integer rowIndex;
/**
* NotNull.
*/
private Integer columnIndex;
/**
* NotNull.
*/
private CellData cellData;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public class CellData<T> extends AbstractCell {
private CellDataTypeEnum type;
/**
* {@link CellDataTypeEnum#NUMBER}
*/
private BigDecimal numberValue;
/**
* {@link CellDataTypeEnum#STRING} and{@link CellDataTypeEnum#ERROR}
*/
private String stringValue;
/**
* {@link CellDataTypeEnum#BOOLEAN}
*/
private Boolean booleanValue;
private Boolean formula;
private String formulaValue;
private byte[] imageValue;
/**
* The number formatting.Currently only supported when reading
*/
private Integer dataFormat;
/**
* The string of number formatting.Currently only supported when reading
*/
private String dataFormatString;

代码

于是我们就可以从异常信息中获取我们需要的信息了 代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
catch (ExcelAnalysisException e) {
e.printStackTrace();
if (e.getCause() instanceof ExcelDataConvertException) {
ExcelDataConvertException excelDataConvertException = (ExcelDataConvertException) e.getCause();
String cellMsg = "";
CellData cellData = excelDataConvertException.getCellData();
//这里有一个celldatatype的枚举值,用来判断CellData的数据类型
CellDataTypeEnum type = cellData.getType();
if (type.equals(CellDataTypeEnum.NUMBER)) {
cellMsg = cellData.getNumberValue().toString();
} else if (type.equals(CellDataTypeEnum.STRING)) {
cellMsg = cellData.getStringValue();
} else if (type.equals(CellDataTypeEnum.BOOLEAN)) {
cellMsg = cellData.getBooleanValue().toString();
}
String errorMsg = String.format("excel表格:第%s行,第%s列,数据值为:%s,该数据值不符合要求,请检验后重新导入!<span style=\"color:red\">请检查其他的记录是否有同类型的错误!</span>", excelDataConvertException.getRowIndex() + 1, excelDataConvertException.getColumnIndex(), cellMsg);
log.error(errorMsg);
}

}

最终处理结果


导入数据总条数:0
导入数据成功条数:0
导入数据失败条数:0
导入数据用时:2秒
导入数据用时:0.03333333333333333分钟
导入数据完成时间:2020-05-14 17:28:18
错误信息:excel表格:第10496行,第20列,数据值为:-2789,该数据值不符合要求,请检验后重新导入!