easyExcel 处理ExcelDataConvertException异常,获取异常的数据行列值等信息
·
说明
easyExcel 可谓是java使用导入导出一个非常好用的工具, 但是我们在使用excel导入excel也会遇到一些异常信息,今天水一篇帖子就是在我们导入excel数据是,其中有一些数据是不合规的,easyExcel就会去抛出异常信息,并且停止导入,这样一样我们就不知道我们上次导入的位置是哪里,我们需要把错误信息记录下来,然后做反馈给用户,告知用户哪行哪列的数据有问题,需要处理好格式再重新导入
异常信息
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,对异常的地方进行断点跟踪,发现信息如下,
rowIndex 这是行数
columnIndex 这个是列数
cellData 这个就是数据信息详情
然后再到ExcelDataConvertException 看源码部分如下
public class ExcelDataConvertException extends RuntimeException {
/**
* NotNull.
*/
private Integer rowIndex;
/**
* NotNull.
*/
private Integer columnIndex;
/**
* NotNull.
*/
private CellData cellData;
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;
解决方法&代码
于是我们就可以从异常信息中获取我们需要的信息了
代码如下
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,该数据值不符合要求,请检验后重新导入!
更多推荐
已为社区贡献4条内容
所有评论(0)