EasyExcel
使用Validator
进行读取校验,批量处理数据,返回处理异常的行以及列
我们通常使用EasyExcel
读取数据时,需要写大量的if-else
或者断言来确保excel中的数据格式以及内容是否符合我们的需要.而EasyExcel目前尚不支持Validator的校验,(我已经提了好久的issues,一直没加这个功能) https://github.com/alibaba/easyexcel/issues/2250
所以本次是通过ReadListener
来实现通过Validator
进行校验数据,批量处理数据,返回错误行数
基础环境
jdk17
maven3.6+
springboot3.0+|springboot2.0+
easy-excel:3.2.0
依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
</dependency>
自定义数据处理Listener
通常我们使用EasyExcel
读取数据时,都需要自定义一 个ReadListener
当EasyExcel
读取到数据的时候,会调用invoke
方法,读取完成之后会调用doAfterAllAnalysed
方法
我们具体的实现就是当EasyExcel
调用invoke
方法时,此时将得到的数据通过Validator
进行校验完成之后,然后统一汇总然后再去处理(比如插入mysql等操作)
如果读校验出现异常,将具体错误的数据格的行与列返回给前端,让用户重新编辑再次上传
具体实现
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.excel.metadata.Head;
import com.alibaba.excel.util.ListUtils;
import com.github.mpcloud.framework.core.consts.SuppressWarningsName;
import com.github.mpcloud.framework.core.utils.excel.exception.ExcelDataValidException;
import jakarta.validation.ConstraintViolation;
import jakarta.validation.Validation;
import jakarta.validation.Validator;
import jakarta.validation.groups.Default;
import org.hibernate.validator.HibernateValidator;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.*;
import java.util.function.Consumer;
/**
* The type Abstract valid listener.
*
* @param <T> the type parameter
* @author : Milo
*/
@SuppressWarnings(SuppressWarningsName.UNUSED)
public class AnalysisValidReadListener<T> extends AnalysisEventListener<T> {
private static final Logger log = LoggerFactory.getLogger(AnalysisValidReadListener.class);
private final Integer batch;
private final Consumer<List<T>> consumer;
private final List<T> buffer;
private final Validator validator;
private Map<String, Integer> fieldColumnMapping;
/**
* Instantiates a new Abstract valid listener.
*/
public AnalysisValidReadListener(final Consumer<List<T>> consumer) {
this(500, consumer);
}
/**
* Instantiates a new Jdbc event listener.
*
* @param batch the batch
*/
public AnalysisValidReadListener(final Integer batch, final Consumer<List<T>> consumer) {
this(batch, consumer, Validation.byProvider(HibernateValidator.class)
.configure()
.