引入依赖
<dependency>
<groupId>cn.afterturn</groupId>
<artifactId>easypoi-spring-boot-starter</artifactId>
<version>4.3.0</version>
</dependency>
或者
<dependency>
<groupId>cn.afterturn</groupId>
<artifactId>easypoi-base</artifactId>
<version>4.1.0</version>
</dependency>
model实现IExcelModel和IExcelDataModel
import cn.afterturn.easypoi.handler.inter.IExcelDataModel;
import cn.afterturn.easypoi.handler.inter.IExcelModel;
/**
* IExcelModel用于获取失败原因
* IExcelDataModel用于获取行号
*/
public class ExcelVoModel extends ExcelVo implements IExcelModel, IExcelDataModel {
private String errorMsg;
private int rowNum;
@Override
public String getErrorMsg() {
return errorMsg;
}
@Override
public void setErrorMsg(String errorMsg) {
this.errorMsg = errorMsg;
}
@Override
public int getRowNum() {
return rowNum;
}
@Override
public void setRowNum(int rowNum) {
this.rowNum = rowNum;
}
}
导入数据未通过的就会生成在失败清单中
import javax.validation.constraints.Email;
import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
import javax.validation.constraints.Pattern;
@Data
public class ExcelVo {
private String id;
@Excel(name = "姓名")
@Pattern(regexp = "[\u4E00-\u9FA5]*", message = "不是中文")
private String name;
@Excel(name = "年龄")
@Max(value = 100,message = "最大值不能超过100")
@Min(value = 0, message = "最小值不能小于0")
private Integer age;
@Excel(name = "创建时间",format = "yyyy-MM-dd")
private String createDateStr;
@Excel(name = "Email", width = 25)
@Email
private String email;
}
导入并返回清单
@ApiOperation(value = "导入Excel带校验")
@PostMapping("/importExcelWithValidator")
public void importExcelWithValidator(@RequestParam("file") MultipartFile multipartFile,HttpServletResponse response) throws Exception {
ImportParams params = new ImportParams();
//表格标题行数,默认0 表示没有标题
params.setTitleRows(0);
//表头行数,默认1 表示有一行表头
params.setHeadRows(1);
//开始读取的sheet位置,默认为0
params.setStartSheetIndex(0);
//... 更多参数查看源码api
//需要校验
params.setNeedVerify(true);
ExcelImportResult<ExcelVoModel> result = ExcelImportUtil.importExcelMore(multipartFile.getInputStream(), ExcelVoModel.class, params);
List<ExcelVoModel> excelVos = result.getList();
System.out.println("成功条数:"+excelVos.size());
excelVos.forEach(excelVo -> {
System.out.println(excelVo);
System.out.println(excelVo.getRowNum());
});
List<ExcelVoModel> failExcelVos = result.getFailList();
System.out.println("失败条数:"+failExcelVos.size());
failExcelVos.forEach(excelVo -> {
System.out.println(excelVo);
System.out.println(excelVo.getRowNum());
System.out.println(excelVo.getErrorMsg());
});
//返回失败清单
setWorkbookResponse(result.getFailWorkbook(),response);
}
失败清单
错误原因会用红色标注