1.首先看见ExcelImportResult类发现
//这个方法返回了上述实体
public static <T> ExcelImportResult<T> importExcelMore(File file, Class<?> pojoClass,
ImportParams params) {
FileInputStream in = null;
try {
in = new FileInputStream(file);
return new ExcelImportService().importExcelByIs(in, pojoClass, params, true);//看一下参数ImportParams params参数
} catch (ExcelImportException e) {
throw new ExcelImportException(e.getType(), e);
} catch (Exception e) {
LOGGER.error(e.getMessage(), e);
throw new ExcelImportException(e.getMessage(), e);
} finally {
IOUtils.closeQuietly(in);
}
}
public class ImportParams extends ExcelBaseParams {
public static final String SAVE_URL = "/excel/upload/excelUpload";
/**
* 表格标题行数,默认0
*/
private int titleRows = 0;
/**
* 表头行数,默认1
*/
private int headRows = 1;
/**
* 字段真正值和列标题之间的距离 默认0
*/
private int startRows = 0;
/**
* 主键设置,如何这个cell没有值,就跳过 或者认为这个是list的下面的值
* 大家不理解,去掉这个
*/
private Integer keyIndex = null;
/**
* 开始读取的sheet位置,默认为0
*/
private int startSheetIndex = 0;
/**
* 上传表格需要读取的sheet 数量,默认为1
*/
private int sheetNum = 1;
/**
* 是否需要保存上传的Excel,默认为false
*/
private boolean needSave = false;
/**
* **校验组**
*/
private Class[] verifyGroup = null;
/**
* 是否需要校验上传的Excel,默认为false
*/
private boolean needVerify = false;
/**
* 校验处理接口
*/
private IExcelVerifyHandler verifyHandler;
/**
* 保存上传的Excel目录,默认是 如 TestEntity这个类保存路径就是
* upload/excelUpload/Test/yyyyMMddHHmss_***** 保存名称上传时间_五位随机数
*/
private String saveUrl = SAVE_URL;
/**
* 最后的无效行数
*/
private int lastOfInvalidRow = 0;
/**
* 手动控制读取的行数
*/
private int readRows = 0;
/**
* 导入时校验数据模板,是不是正确的Excel
*/
private String[] importFields;
/**
* 导入时校验excel的标题列顺序。依赖于importFields的配置顺序
*/
private boolean needCheckOrder = false;
/**
* Key-Value 读取标记,以这个为Key,后面一个Cell 为Value,多个改为ArrayList
*/
private String keyMark = ":";
/**
* 按照Key-Value 规则读取全局扫描Excel,但是跳过List读取范围提升性能
* 仅仅支持titleRows + headRows + startRows 以及 lastOfInvalidRow
*/
private boolean readSingleCell = false;
/**
* 是否并行计算
*/
private boolean concurrentTask = false;
/**
* 最小截取大小
*/
private Integer critical = 1000;
}
看上述发现verifyGroup和needVerify就是检验的组和是否检验,意思是我们设置好grope和把needVerify设置为true就可以检验。支持validator。
然而设置完成后发现只有失败的list,并没有失败的原因,但failworbook里面有。因为检验数据是想导出就导出的,就想用到redis但是百度发现redis不能存worbook,于是就想找到list中有错误信息的,然后发现
意思是,如果IExcelModel是IExcelModel的子类就执行model.setErrorMsg(errorMsg);就能把错误信息弄进去了。
还看见一个这个:
但是点进去看,它们只有get和set方法并没有字段,所以我们要定义一个类:
@Data
public class ExcelVerifyInfo implements IExcelModel, IExcelDataModel {
/**
* 错误信息
*/
private String errorMsg;
/**
* 行号
*/
@ExcelIgnore
private int rowNum;
}
这样就可以了,我们需要检验的实体就继承这个类就可以导出错误信息了需要加上@Excel(name = “错误信息”),但是导出模板的时候并不想要导出错误信息和错误行这两个字段,这个,想了个方法就是再创建一个类有这两个注解可以导出,但是缺点就是只有错误信息和行数,百度也没有发现自定义删选导出还是不导出的,,,,如果你们发现好方法渴望分享。
源代码:
/**
* @author Lorde
* @description
* @date 2021/1/27
*/
public class ExcelTestUtils {
public static <T>ExcelImportResult<T> importDataMore(MultipartFile file, Integer headerRows, Class<T> pojoClass, Class[] grope){
if (file == null) {
return null;
}
ImportParams params = new ImportParams();
params.setVerifyGroup(grope);
params.setHeadRows(headerRows);
params.setNeedVerify(true);
ExcelImportResult<T> objectExcelImportResult = null;
try {
objectExcelImportResult = ExcelImportUtil.importExcelMore(file.getInputStream(), pojoClass, params);
} catch (Exception e) {
e.printStackTrace();
}
return objectExcelImportResult;
}
}
成果:
看到这就很开心了吧,但其实不止这样,我发现你就算中间空着在很后面找到数据,只会校验你写了数据的那一行。图中获取不到是因为类型不匹配没有赋值成功。。
我的实体: