上传excel表格时候,要求要
姓名 | 身份证号 | 电话 | 地址 |
---|---|---|---|
可用户上传的是
身份证号 | 电话 | 姓名 | 地址 |
---|---|---|---|
出现这种用户上传表格和规定模板不同的时候,就需要加上表头校验
easyExcel里的
ExcelReaderBuilder read(InputStream inputStream, Class head, ReadListener readListener)方法
中的ReadListener 可以在listener里面做校验
具体代码如下
Controller
@PostMapping
@ImportExcel
public void add(@RequestPart("file") MultipartFile file, @Validated DemoVO demo) {
demoService.saveDemo(file, demo);
}
Service
public void saveDemo(MultipartFile file, DemoVO demo) {
DemoListener listener = new DemoListener();
try {
// 这里read方法的第二个参数,是你想要入库的实体类,headRowNumber里面数字是几就是从excel表格的第几行开始读入库数据
EasyExcel.read(file.getInputStream(), DemoVO.class, listener).sheet().headRowNumber(1).doRead();
Map<String, String> map = listener.map;
if (map.size() != 0){
throw new ExcelException(map.get("msg"));
}
} catch (IOException e) {
throw new ExcelException("您上传的文件格式与模板格式不一致,请检查后重新上传");
}
// 此时拿到的data已经是校验通过后的集合,可对该集合进行业务需要的操作
List<DemoVO> demoList = listener.getData();
}
read方法的listener
// 继承AnalysisEventListener,括号里放表格对应实体类
@Component
public class DemoListener extends AnalysisEventListener<DemoVO> {
public List<DemoVO> data = new ArrayList<DemoVO>();
// 此map用来存储错误提示
public Map<String, String> map = new HashMap<>();
public DemoListener() {
}
/**
* 重写invokeHeadMap方法,校验表头
*headMap的key是表头下标,value是内容
*/
@Override
public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {
// headMap.containsKey(下标),先判空
// headMap.get(0).equals() 判内容是否相符
if (!headMap.containsKey(0) || !headMap.containsKey(1) || !headMap.containsKey(2) || !headMap.containsKey(3)
|| !headMap.get(0).equals("姓名") || !headMap.get(1).equals("身份证号")
|| !headMap.get(2).equals("电话") || !headMap.get(3).equals("地址") ) {
// 这里给data加1条空数据,是因为doAfterAllAnalysed方法最后有判是否是空列表
data.add(new DemoVO());
map.put("msg", "您上传的文件格式与模板格式不一致,请检查后重新上传");
// 这里业务中可改为直接抛出异常,外层去捕获
return;
}
}
@Override
public void invoke(DemoVO demo, AnalysisContext analysisContext) {
// 这里放具体数据校验方法,校验通过往data里面放数据,否则直接return
if (checkValidateBlank(demo) && checkValidateLength(demo)) {
data.add(demo);
} else {
return;
}
}
/**
* 字段为空校验
*
* @param demo
* @return
*/
protected boolean checkValidateBlank(DemoVO demo) {
if (StringUtils.isEmpty(demo.getName()) || StringUtils.isEmpty(demo.getMobile())
|| StringUtils.isEmpty(demo.getIdCardNo()) || StringUtils.isEmpty(demo.getAdress())) {
map.put("msg", "您上传的文件内容含有空白数据,请检查后重新上传");
return false;
}
return true;
}
/**
* 校验长度
*
* @param demo
* @return
*/
protected boolean checkValidateLength(DemoVO demo) {
if (demo!= null) {
if (demo.getName().length() > 30 || demo.getMobile().length() > 30
|| demo.getIdCardNo().length() > 30 || demo.getAdress().length() > 30) {
map.put("msg", "您上传的文件内容文字长度超出常规,请检查后重新上传");
return false;
}
}
return true;
}
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
if (!CollectionUtils.isNotEmpty(data)) {
throw new ExcelException("excel无有效数据");
}
}
public List<DemoVO> getData() {
return data;
}
}