本文正在参与「Java主题月 – Java Debug笔记活动」,概略检查 活动链接

最近在做Excel导入功用,产品要求对导入数据先进行校验然后再入库。所以简略封装了一个东西,作用兄弟app装置下载们用了都说好,今日就把思路共享出来。

easyexcel 库

咱们都知道POI是Java操作Exapproachcel的基础库。为了通用性并没有做定制,而且还有一些局限性。经过一番调笔记本电脑排名前十研抉择选用二次封装库easyexcel来进行业务开发。

<de前端和后端哪个薪酬高pendency>
<group前端面试题Id>c笔记本cpu天梯图om.alibaba&lt笔记;/groupId>
<artifactId>easyexcel</artifactId>
<version>教程魔方${easyexcel.version}</version>
</dependency>

easyexcel将读取Excel的生命周期笼统为了几个阶段,便当咱们在各个阶段注入你想要结束的逻辑。 这几个阶段包含在ReadListener接口中

public interfa笔记ce ReaappledListener<T> extends Listener {
/**
* 当任何一个侦听器实施错误报告时,一切侦听器都将接纳此办法。 假定在此处引发异常数据库查询句子,则整个读取将终止。
* 这approach儿是处理读取excel异常的
*
* @param exception
* @param context
* @throws Exception
*/
void onException(Exception exception, AnalysisContext context) throws Exception;
/**
* 读取每行excel表头时会实施此前端训练机构办法
*
* @param h数据库体系概论eadMap
* @param contex数据库查询句子t
*/
void invokeHead(Map<Integer, CellData> headMap, AnalysisContext context);
/**
* 读取每行数据的时分回实施此办法
*
* @param data
*            one rowapple value. Is is same as {@link AnalysisContext#readRowHolder()}
* @param context
*            anal前端结构ysis context
*/
void invoke(T data, Analysis前端开发需求学什么Context context);
/**
* 假定有额外的单元格信息回来就用此办法处理
*
* @param extra
*            extra information
* @前端开发param conteappearxt
*            analysis context
*/
void extra(CellExtra extra, AnalysisContext context);
/**
* 在整前端工程师个excel sheet数据库原理解析完毕后实施的逻辑。
*
* @param context
*/
voi教程之家d doAfterAllAnalysed(Analysis数据库体系概论第五版课后答案Context context);
/**
* 用来操控是否读取下一行的战略
*
* @param context
* @returnappointment
*/
bo前端结构olean hasNex前端训练机构t(AnalysisContext context);
}

其笼统结束AnalysisEventListener<T>供给更加契合需求的笼统,我会笔记本cpu天梯图进一步结束这个笼统来结束Excel的教程魔方导入和校验。

在你了解一个结构的笼统接口后,尽量要去看一下它有没有教程拼音能满意你需求的结束。笔记本电脑性价比排行2020

别的这儿要多说一点,接口中数据库原理AnalysisContext包含了许多有用的上下文元信息,比方 其时行、其时的配备战略、excel全体结构等信息,你可以在需求的时分调用这些信息。

JSR303校验

最开始自己写了一个笼统的校验东西,毕竟发现每一个字段都要编写其具体的校验逻辑,假定一个Excel的字段量爆炸,这对开发来说就可能是噩梦。这使我想到了业界现已有的规范-J笔记本电脑性价比排行2020SR303校验规范,它将数据模型(前端学什么Model)前端和后端哪个薪酬高和校验(Validation)各自笼统,十分活络,而且工作量明显下降。咱们只需求找到和esayexcel生命周期结合的当地就行了。咱们数据库体系概论第五版课后答案只需求引进以下依托就能在Spring Boot项目中集成JSR303校验:

<dependency>
<groupId>org.springframework.boot</gr数据库办理体系oupId>
<artifactId>spring-boot-s笔记tarter-validation<数据库体系概论第五版课后答案/artifactId>
</dependency>

关于JSR303相关的教程可以检查我另一篇文章

思路

咱们可以在解析每个字段的时分校验,这对应ReadListe前端面试题nerinvoke(T data, AnalysisContex笔记本电脑性价比排行2020t context)办法,这种办法可以结束当字段校验触发绑缚时就停止excel解析的战略;另一种可以在Excel解析完毕后实施校验,对应doA教程之家fterAllAnalysed(Analys教程视频怎样制作办法is教程魔方Context context)。这儿以第二种为例笔记本cpu天梯图咱们来结束一下。

咱们在编写数据库办理体系代码时,尽量责任单一,一个类或许一个前端办法尽量只干一个事,这样appointment让自己的前端开发需求学什么代码足够明晰。

编写笔记校验处理类

这儿我把解笔记本电脑怎样连wifi析和校验分隔结束,先编写JSR303校验东西。这儿假定现已有了校验器javax数据库体系概论第五版课后答案.validation.Validator的结束,稍后我会讲这个结束从哪里注入

import cn.felord.validate.Excel;
import lombok.AllArgsConstructor;
import org.springframework.util.StringUtils;
import javax.validation.数据库有哪几种Co前端结构nstraintVi教程英文olation;
impo教程rt javax.validation.Validator;
import java.util.*;
import java.util.stream.Collectors;
/**
*  excel 校验东西
*
* @param <T> the type param前端结构eter
* @a教程手绘uthor f数据库办理体系elor前端学什么d.cn
* @since 2021 /4/14 14:14
*/
@AllArgsConstructor
public class ExcelValidator<T&gtappear; {
private final Validator validator;
private final Integer beginIndex;
/**
*  集结校验
*
* @param data 待教程魔方校验的集结
* @return list
*/
public List<String> validate(Collection<T> data) {
int index = beginIndex + 1;
List<String> messages = new ArrayList<>();
for (T da笔记本电脑什么牌子好tum : data) {
String vaappearlidated = this.doValidate(index, datum);
if (StringUti数据库查询句子ls.hasText(validaapplicationted)) {
messages.add(validated);
}
index++;
}
return messages;
}
/**
* 这儿是数据库原理校验的根柢办法
*
* @param ind前端开发ex 本条数据地址的行号
* @param d前端训练机构ata 待校验的某条数据
* @return 对数据的校验异常进行提示,假定有触发校验规则的会封装提示信息。
*/
private String doValidate(int index, T data) {
// 这儿运用了JSR303的的校验器,一起运用了分组校验教程诀窍2电影,Excel为分组标识
Set<ConstraintViolation<T&前端学什么gt;> validate = validator.validate(data,数据库体系的中心是 Excel.class);
return validate.size()数据库体系概论第五版课后答案>0 ? "第" + index +
"行,触发绑缚:" + validate.stream()
.map(教程拼音ConstraintViolation::getMessage)教程诀窍2
.collect(Collec前端面试题tors.joining(",")): "";
}
}

上面便是整个校验的逻辑,假定校验经过不提示任何信息,假定校验不经过数据库有哪几种把校验的绑缚信息封装回来。这儿的Vali前端和后端哪个薪酬高dator是从哪里来的呢?当Spring Boot集成app装置下载JSR303会有一个Validator结束被自动注入Spring IoC,咱们可以利用它。

结束AnalysisapplicationEventListener

这个彻底是easyexcel的功用了,咱们只需求结束AnalysisEventListener前端训练机构,并将解析字段加入集结,等彻底解析完毕后再进行校验。这儿假appstore设校验不经过就会抛出携带校验信息的异常,异常经过处理回来前端提示。

紧记:AnalysisEventListener的结束不能注入Spring IoC

import cn.hutool.json.JSONUti前端开发需求学什么l;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import cn.felor笔记本电脑开不了机d数据库设计.exception.Ser笔记viceExceptioappstoren;
imp前端训练机构ort org.springframework.util.CollectionUtils;数据库体系概论
import java.util.appointmentArAPPrayList;
import java.util.Collection;
import java.util.List;
import java.util.function.Consumer;
/**
* 该类不可被Spring保管
*
* @param <T> the type parameter
* @author felord.cn
* @since 2021 /4/14 14:19
*/
public数据库设计 class JdbcEventListener<T&gt教程英文; extends AnalysisEventListener&l教程的意思t;T> {
/**
* Excel总条数阈值
*/
private static f教程拼音inal Integer MAX_SIZE = 10000;
/**教程诀窍2电影
* 校验东西
*前端开发/
private finaappearancel ExcelValidator<T> excelValidator;
/**
* 假定校验经过消费解析得到的exc笔记本电脑开不了机el数据
*/
private final Consumer<Collection<T>> batchConsumer;
/**
* 解析数据的暂时存储容器
*/
private final List<T> l数据库体系的中心是ist = new ArrayList<>();
/**
* Instantiates a new Jdbc event listener.
*
* @param excelValidato教程之家r Excel校验东西
* @param batchConsumer  Excel解析作用批量消费东西,可结束为写入数据库前端结构等消费操作
*/
public JdbcEventListener(ExcelValidator&lt教程诀窍2电影;T> excelValidator, Consumer<Collection<T>> batchConsumer) {
t笔记本电脑排名前十his.excelValidator = excelValidator;
this.batchConsumer笔记本电脑排名前十 = batchC教程手绘onsumer;
}
@Override
public void onExceptio教程之家n(Exception exception, AnalysisContext context) throws Exception {
list.clear();
throw exception;
}
@Override
public void invoke(T data, AnalysisContext con前端工程师text) {
// 假定没有跨越阈值就把解析的exce数据库原理l字段加入集结
if (list.size() >= MAX_SIZE) {
throw new ServiceException("单次上传条数不得跨越:" + MAX_SIZE);
}
list.add数据库体系的中心是(data);
}
@Override
public void doA数据库fterAllAnalysed(AnalysisCon前端开发text context) {
//悉数解析完毕后 对集结进行校验并消费
if (!CollectionUtils.isEmpty(this.list)) {
List<String> validated = this.excelValidator.validate(this.list);
if (CollectionUtils.isEmpty(validated)) {
this.batchConsumer.acc前端面试题ept(this.list);
} else {
throw new S教程英文erviceException(JSONUtil.toJson教程英文Str(validated));
}
}
}
}

封装毕竟的东西

这儿参看esayexcel的文档封数据库体系的中心是装成一个通用的Exappointmentcel读取东西

import com.alibaba教程手绘.excel.EasyExcel;
i笔记本电脑连不上无线网怎样回事mport lombok.AllArgsConstructorappstore;
import lombok.Data;
import j前端学什么avax前端学什么.validation.Validator;
import java.io.Input前端开发需求把握什么技术Stream;
import java.uti数据库体系的中心是l.Collection笔记本;
import java.util.function.Consumer;
/**
* excel读取东西
*
* @author felord.cn
* @since 2021 /approve4/14 15:10
*/
@AllArgsConstructor
public class ExcelReader {笔记本电脑连不上无线网怎样回事
priva教程魔方te final V教程诀窍2alidator validator;
/**
* Rea数据库体系概论d Excel.
*
* @param <T>  the type数据库办理体系 parameter
* @param meta the meta
*/
public <T> void read教程之家(Meta<T> meta) {
Excel数据库体系工程师Validator<T> excelValidator = new ExcelValidator<>(validator, meta.headRo笔记本电脑连不上无线网怎样回事wNumber);
JdbcEventListener<T> readListener = new JdbcEventListeneapproachr<>(excelValid数据库体系ator, meta.consum笔记本er);
EasyExcel.read(meta.excelStream, meta.domain, readListener)
.headRowNumber(meta.headRowNumber)
.sheet()
.doRead();
}
/**
* 解析需求的元数据
*
* @param <T>数据库 the type paraappstoremeter
*/
@Data
public sapplicationtatic class数据库体系的中心是 Meta<T> {
/**
* excel 文件流
*/
private InputStream excelStream;
/**
* excel头的行号,参看easyexcel的api和你的实际情况
*/
private Integer headRowNumber;
/**
* 对应excel封装的数前端训练机构据类,需求参看easyexcel教程
*/
private Class<数据库体系概论T> doapp装置下载main;
/**
*前端开发 解析作用的消费函数
*/
private Consumer<Collection<T>> consumer;
}
}笔记本cpu天梯图

咱们把这个东西注入Spring IoC,便当咱们运用。

/**
* Excel 读数据库体系取东西
*
* @pappearancearam validator the validator
* @return the excel reade教程诀窍2电影r
*/
@Bean
public ExcelReader excelReader(Validator validator) {
return new ExcelReader(validator);
}

编写接口

这儿Excel的数据类ExcelData就不赘述了,过于简略!去看esayexcel的文档即可。编写一个Spring MVC接口示例,没错便是这么简略。

@Autowired
private  ExceappointmentlReader excelReade数据库体系工程师r;
@Au数据库查询句子towired
private  DataService dataServ笔记本电脑开不了机ice;
@笔记本电脑连不上无线网怎样回事PostMapping("/excel/import")
public Rest&approvelt;?> importManufacturerI数据库查询句子nfo(@RequestPart笔记本cpu天梯图 MultipartFile file) throws IOException {
InputStream inputStream = file.笔记本电脑怎样连wifigetInputStream();
ExcelReader.Meta<ExcelData> excelDataMeta = new ExcelReader.Meta<笔记本电脑性价比排行2020>();
exce教程的意思lDataMeta.setExcelStream(inputStream);
excelDataMeta.setDo前端开发需求学什么main(ExcelData.class);
excelDataMeta.setHeadRowNum数据库办理体系ber(2);
// 批量写入数据库的逻辑
excelDataMeta.setConsumer(dataServi教程之家ce::saveAPPBatch);
this.excelReader.read(excelDataMeta);
return RestBody.ok数据库体系的中心是();
}

总结

今日演示了如何将easyexcelJSR303结合起来,其实原理很简笔记本电脑排名前十略,你只需求找到两个技能的结合点,并把它们组合起来即可,你学到了吗? 请多多点赞、重视、转发、再看,多多支撑:码农小胖哥 学习更多有用的技巧。