easypoi使用检验导入excel数据

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;
    }

}

成果:在这里插入图片描述
看到这就很开心了吧,但其实不止这样,我发现你就算中间空着在很后面找到数据,只会校验你写了数据的那一行。图中获取不到是因为类型不匹配没有赋值成功。。
我的实体:
在这里插入图片描述

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值