easyExcel处理ExcelDataConvertException异常,获取异常的数据行列值等信息和日期格式转换器的使用

疯一样的男子
疯一样的男子
发布于 2023-02-04 / 1 阅读
0
0

easyExcel处理ExcelDataConvertException异常,获取异常的数据行列值等信息和日期格式转换器的使用

使用excel导入excel会遇到一些异常信息,其中有一些数据是不合规的,比如说如期格式不正确,easyExcel就会去抛出异常信息,并且停止导入,这样一样就不知道上次导入的位置是哪里,需要知道哪行哪列的数据有问题,需要处理好格式再重新导入。

解决方法:首先错误信息中的异常类ExcelDataConvertException,是easyExcel导入错误时抛出的异常,可以捕获该异常进行详细错误信息定位,代码如下:

try {
            //读取表格代码
            // TODO
        } catch (ExcelAnalysisException e) {
            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,该数据值不符合要求,请检验该数据和其他记录是否有同类型的错误并修正后重新导入!", excelDataConvertException.getRowIndex() + 1, excelDataConvertException.getColumnIndex() + 1, cellMsg);
                throw new Exception(errorMsg);
            }
        }

easyExcel日期格式转换器,如果想把excel表格中的日期数据转换成特定的日期格式或java中日期类型的数据,可以通过日期转换器进行处理

    /**
     * easyExcel自定义时间格式转换器
     *
     * @author Mr.Liang
     * @since 2022-12-27 13:40:37
     */
    public class EasyExcelDateConverter extends BaseController implements Converter<Date> {
        SimpleDateFormat yyyyMMdd = new SimpleDateFormat("yyyyMMdd");
        SimpleDateFormat yyyy_MM_dd = new SimpleDateFormat("yyyy-MM-dd");

        @Override
        public Class supportJavaTypeKey() {
            return Date.class;
        }

        @Override
        public CellDataTypeEnum supportExcelTypeKey() {
            return CellDataTypeEnum.STRING;
        }

        /**
         * 实体类参数类型为LocalDate或LocalDateTime时使用以下方式转换,同时把类的泛型更换为对应的实体类参数类型,supportJavaTypeKey重写            方法返回类型也更换为对应的实体类参数类型
         */
    /*@Override
    public LocalDate convertToJavaData(CellData cellData, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) throws Exception {
        //cellData.getStringValue()//可能读取为null,读取到的参数可能存在其他参数中
        return LocalDate.parse(cellData.getStringValue(), DateTimeFormatter.ofPattern("yyyyMMdd"));
    }*/

    /*@Override
    public CellData convertToExcelData(LocalDate value, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) throws Exception {
        return new CellData(value.format(DateTimeFormatter.ofPattern("yyyyMMdd")));
    }*/

        /**
         * 读取excel日期的格式
         */
        @Override
        public Date convertToJavaData(CellData cellData, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) throws Exception {
            Date date = null;
            try {
                date = yyyyMMdd.parse(cellData.toString());
            } catch (Exception e) {
                String errorMsg = "读取excel表格数据失败,错误原因:" + contentProperty.getHead().getHeadNameList() + ": " + cellData.toString() + " 格式不正确或数据错误,请检查";
                logger.error(errorMsg);
                throw new MyException(errorMsg);
            }
            return date;
        }

        /**
         * 输出excel日期格式类型
         */
        @Override
        public CellData convertToExcelData(Date value, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) throws Exception {
            return new CellData(yyyy_MM_dd.format(value));
        }

    }

定义好日期转换器之后在实体类引用注解,即可把excel表格的日期数据按照转换器定义的日期格式进行转换,实体类代码如下:

@Getter
@Setter
@ToString
@ApiModel(value = "")
public class Test extends BaseRowModel implements Serializable {
    private static final long serialVersionUID = 786907518064783130L;

    @ApiModelProperty(value = "id")
    private String id;

    @ApiModelProperty(value = "name")
    private String name;

    @ExcelProperty(value = "创建日期", index = 4, converter = EasyExcelDateConverter.class)
    @ApiModelProperty(value = "创建日期")
    private Date createDate;

    @ExcelProperty(value = "修改日期", index = 46, converter = EasyExcelDateConverter.class)
    @ApiModelProperty(value = "修改日期")
    private Date updateDate;
}

文章部分内容参考以下来源

https://blog.51cto.com/lengff/4579932


评论