easyexcel 求增加: POJO类中属性联合去重功能

6kkfgxo0  于 4个月前  发布在  其他
关注(0)|答案(1)|浏览(43)

假定用户上传Excel数据对应的Pojo类是Person, Person类相应属性定义如下

public class Person {
    // 属性
    private String name;
    private int age;
    private String gender;
    private String address;
}

业务上需要对上传的Excel数据去重, 去重的条件: name、address和gender。

即, 上传的Excel中不能有两行数据的name、address和gender相同。

感觉可以引入@CombinedDuplicatedProperty注解实现。

cu6pst1q

cu6pst1q1#

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.excel.metadata.BaseRowModel;
import com.alibaba.excel.metadata.CellData;
import com.alibaba.excel.metadata.Head;
import com.alibaba.excel.read.metadata.holder.ReadRowHolder;

import java.lang.reflect.Field;
import java.util.*;

public class ExcelDataDeduplication<T extends BaseRowModel> extends AnalysisEventListener<T> {
    private Set<String> uniqueSet = new HashSet<>();
    private List<T> deduplicatedList = new ArrayList<>();

    @Override
    public void invoke(T data, AnalysisContext context) {
        String combinedKey = getCombinedKey(data);
        if (!uniqueSet.contains(combinedKey)) {
            uniqueSet.add(combinedKey);
            deduplicatedList.add(data);
        }
    }

    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {
        // 处理完所有数据后的操作,例如将去重后的数据存储到数据库
    }

    private String getCombinedKey(T data) {
        StringBuilder combinedKey = new StringBuilder();
        Class<?> clazz = data.getClass();
        Field[] fields = clazz.getDeclaredFields();
        for (Field field : fields) {
            try {
                field.setAccessible(true);
                Object value = field.get(data);
                if (value != null) {
                    combinedKey.append(value.toString());
                }
                combinedKey.append("_");
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        }
        return combinedKey.toString();
    }

    public List<T> getDeduplicatedList() {
        return deduplicatedList;
    }
}

相关问题