说明

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,该数据值不符合要求,请检验后重新导入!

在这里插入图片描述

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐