使用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;
}