EasyExcel导入错误数据收集

EasyExcel导入数据时会将异常数据忽略(例如数据类型不一致)

	所以我们需要将其提供捕获异常的方法重写

效果图:(由于length属性为int类型,所以读取出现类型转换异常)
在这里插入图片描述

在继承AnalysisEventListener的类中重写invokeHeadMaponException方法

public class DemoListener extends AnalysisEventListener<DemoVO> {

	// 由于easyexcel每次读取只有一条,这里是为了收集到一定数量后批量插入数据库
    List<DemoVO> list = new ArrayList<>(ConstantUtils.LIST_COUNT);

	// 由于监听器只能通过new的方式创建,所以可以通过构造器传入dao层对象
    private DemoDao demoDao;

	// 收集表头和错误数据,利用easyexcel将错误数据返回给用户
    private List<List<String>> head = new ArrayList<>();
    private List<List<String>> data = new ArrayList<>();

    public ShipDataListener(DemoDao demoDao) {
        this.demoDao= demoDao;
    }
	
    public List<List<String>> getHead() {
        return this.head;
    }

    public List<List<String>> getData() {
        return this.data;
    }

	// 如果要收集错误数据,重写表头是必不可少的,因为错误数据中存储的是以列作为键的map集合,并且不会存入为空的数据
    @Override
    public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {
    	// 工具类见下
        EasyExcelErrorFixUtil.setExcelErrorHead(headMap, head);
    }

    @Override
    public void invoke(DemoVO demoVO, AnalysisContext analysisContext) {
        list.add(demoVO);
        if(list.size() >= ConstantUtils.LIST_COUNT) {
            saveData();
            list.clear();
        }

    }

    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
        saveData();
    }

	// 重写此方法以便于收集错误数据
    @Override
    public void onException(Exception exception, AnalysisContext context) {
    	// 调用以下封装的错误数据收集工具
        EasyExcelErrorFixUtil.setErrorData(exception, context, data, head.size());
    }

    public void saveData() {
        if(list.size() > 0) {
            demoDao.insertAll(list);
        }

    }

}

封装的工具类

public class EasyExcelErrorFixUtil {

    /**
     * 收集导入时的错误数据
     * @param exception
     * @param context 出现异常的内容
     * @param data 将错误数据转换格式后赋值给空集合
     * @param size title的长度
     */
    public static void setErrorData(Exception exception, AnalysisContext context, List<List<String>> data, int size) {
        if (exception instanceof ExcelDataConvertException) {

            ExcelDataConvertException convertException = (ExcelDataConvertException) exception;

            int row = convertException.getRowIndex();
            int column = convertException.getColumnIndex();

            Map<Integer, Cell> cellMapResult = context.readRowHolder().getCellMap();

            List<String> dataList = new ArrayList<>();
            dataList.add(Integer.toString(row));
            for (int i = 0; i < size; i ++) {
                if(cellMapResult.get(i) == null) {
                    dataList.add(null);
                } else if(column == i) {
                    dataList.add("{格式错误}--" + cellMapResult.get(i).toString());
                } else {
                    dataList.add(cellMapResult.get(i).toString());
                }
            }
            data.add(dataList);
        }
    }

    /**
     * 收集导入时Excel的title
     * @param headMap 传入需要处理的title map集合
     * @param head 赋值给空集合
     */
    public static void setExcelErrorHead(Map<Integer, String> headMap, List<List<String>> head) {
        List<String> errorTips = new ArrayList<>();
        errorTips.add("错误数据行");
        head.add(errorTips);
        for(Map.Entry<Integer, String>  entry: headMap.entrySet()) {
            List<String> errorHead = new ArrayList<>();
            errorHead.add(entry.getValue());
            head.add(errorHead);
        }
    }

}

您好!要在EasyExcel导入并返回错误数据,您可以按照以下步骤操作: 1. 导入EasyExcel库:首先,确保您已经安装了EasyExcel库。您可以在您的项目中添加以下依赖项,以使用EasyExcel库: ```xml <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>2.2.10</version> </dependency> ``` 2. 创建实体类:根据您要导入Excel文件的结构,创建一个与之对应的实体类。实体类的字段应该与Excel表的列一一对应。 3. 编写导入逻辑:使用EasyExcel提供的API,编写导入逻辑。以下是一个示例代码: ```java public List<YourEntityClass> importAndReturnErrorData(String filePath) { List<YourEntityClass> errorDataList = new ArrayList<>(); try { ExcelListener listener = new ExcelListener(); EasyExcel.read(filePath, YourEntityClass.class, listener).sheet().doRead(); errorDataList = listener.getErrorDataList(); } catch (Exception e) { e.printStackTrace(); // 处理异常 } return errorDataList; } ``` 在上述代码中,`YourEntityClass`是您创建的实体类,在`ExcelListener`类中,您可以通过重写`invoke`方法来处理每行数据的逻辑。如果某行数据出现错误,在`invoke`方法中将错误数据添加到`errorDataList`中。 4. 自定义监听器:创建一个继承`AnalysisEventListener`类的监听器,用于处理Excel中每行数据的逻辑。以下是一个示例代码: ```java public class ExcelListener extends AnalysisEventListener<YourEntityClass> { private List<YourEntityClass> errorDataList = new ArrayList<>(); @Override public void invoke(YourEntityClass data, AnalysisContext context) { // 处理每行数据的逻辑 // 如果数据错误,将错误数据添加到errorDataList中 // 示例判断某字段是否为空 if (StringUtils.isBlank(data.getFieldName())) { errorDataList.add(data); } } @Override public void doAfterAllAnalysed(AnalysisContext context) { // 解析完成后的逻辑 } public List<YourEntityClass> getErrorDataList() { return errorDataList; } } ``` 在上述代码中,您可以根据具体需求自定义`invoke`方法的逻辑,判断数据是否符合要求,并将错误数据添加到`errorDataList`中。 通过以上步骤,您就可以实现在EasyExcel导入并返回错误数据。请根据您的实际需求进行相应的修改和扩展。希望这可以帮到您!如果有任何问题,请随时提问!
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值