一、説明
在使用EasyExcel处理Excel导入文件时,发现并没有官方的有效对字段的非空校验方法;
遂自己写一个自定义注解和字段校验类来实现EasyExcel导入数据的验证。
二、编写自定义注解
首先,我们需要编写一个自定义注解 RequiredValid
,用于标记需要校验的字段。
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 导入字段校验
*
* @author CWW
* @date 2024/12/19 14:04
*/
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface RequiredValid {
String message() default "导入有未填入的字段";
}
三、编写字段校验类(类似监听器的作用)
接下来,我们需要编写一个字段校验类 ExcelImportValid
,用于在导入过程中对数据进行校验。这个类会遍历传入对象的所有字段,检查这些字段是否被 RequiredValid
注解标记,并且这些字段的值是否为空。
import com.server.easyExcel.annotation.ExcelValid;
import com.server.web.exception.BaseException;
import java.lang.reflect.Field;
import java.util.Objects;
/**
* 表格导入字段校验
*
* @author CWW
* @date 2024/12/19 14:36
*/
public class ExcelImportValid {
/**
* Excel导入字段非空校验
*
* @param object 校验的JavaBean 其属性须有自定义注解
*/
public static void valid(Object object) throws Exception {
Field[] fields = object.getClass().getDeclaredFields();
for (Field field : fields) {
// 设置可访问
field.setAccessible(true);
// 属性的值
Object fieldValue = null;
try {
fieldValue = field.get(object);
} catch (IllegalAccessException e) {
throw new BaseException("导入参数检查失败!");
}
// 是否包含必填校验注解
boolean isRequiredValid = field.isAnnotationPresent(RequiredValid.class);
if (isRequiredValid && Objects.isNull(fieldValue)) {
throw new BaseException(field.getAnnotation(RequiredValid.class).message());
}
}
}
}
四、实体字段加注解
在实体类的字段上使用 RequiredValid
注解,标记需要校验的字段。假设我们有一个 User
实体类,需要校验 姓名
和 邮箱
字段。
/**
* 用户导入文件实体
*
* @author CWW
* 2024/12/18 16:46
*/
@Data
public class UserFileDataVO {
@RequiredValid(message = "姓名字段不能为空!")
@ExcelProperty(value = "姓名")
private String userName;
@ExcelProperty(value = "年龄")
private int age;
@RequiredValid(message = "邮箱字段不能为空!")
@ExcelProperty(value = "邮箱")
private String email;
}
五、在 AnalysisEventListener
中进行校验
最后需要在 EasyExcel
的 AnalysisEventListener
中
invoke() 方法调用 ExcelImportValid.valid
方法来进行字段校验。AnalysisEventListener
是 EasyExcel
提供的一个事件监听器,可以在读取每行数据时进行处理。
/**
* EasyExcel工具类
*
* @author CWW
* @date 2024/12/11 16:46
*/
public class EasyExcelUtil {
private static final String UTF_8 = "UTF-8";
/**
* 读取文件数据,并返回一个包含指定类型数据的列表。
*
* @param inputStream 文件对象输入流
* @param clazz 数据对象的类型
* @param <T> 泛型类型,表示数据对象的类型
* @return 包含解析后数据对象的列表
*/
public static <T> List<T> readMultipartFile(InputStream inputStream, Class<T> clazz) {
// 用于存储解析后的数据对象
final List<T> dataList = new ArrayList<>();
EasyExcel.read(inputStream, clazz, new AnalysisEventListener<T>() {
@Override
public void invoke(T data, AnalysisContext analysisContext) {
try {
// 调用字段校验方法
ExcelImportValid.valid(data);
// 将解析后的数据对象添加到 dataList中
dataList.add(data);
} catch (Exception e) {
throw new BaseException(e.getMessage());
}
}
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
// 读取完成后可以进行一些操作
}
}).sheet().doRead(); // 读取 Excel 文件中的第一个工作表
// 返回解析后数据对象的列表
return dataList;
}
五、总结
通过上述步骤,我们实现了一个灵活的Excel导入数据校验机制。
如果这篇教学文章对你有所帮助,不妨点个赞和收藏。