场景:我在做excel导入的时候发现某个字段一样的数据出现好几条,但是在业务范围中,该字段不能重复,是唯一的,例如工号
解决办法:利用HashMap键的唯一性来删除某个字段重复的数据,将该字段作为键,值就是当前元素
我用 EasyExcel 做的导入
Listener 代码展示:
/** * @author 00063411 */ public class WorkerChildDescListener extends AnalysisEventListener<SettleDataImport> { /** * 错误信息 */ private StringBuffer errorSb = new StringBuffer(); /** * 序号 */ private int count = 1; /** * excel解析暂存数据 */ Map<String,SettleDataImport> dataMap = new HashMap<>();
private WorkerChildDescService workerChildDescService; public WorkerChildDescListener(WorkerChildDescService workerChildDescService){ this.workerChildDescService = workerChildDescService; } /** * 当数据转换发生错误时调用该方法 * @param exception * @param context * @throws Exception */ @Override public void onException(Exception exception, AnalysisContext context) throws Exception { this.count = this.count+1; this.errorSb.append("第").append(this.count).append("行数据有问题请仔细检查,"); } /** * 解析excel * @param settleDataImport * @param analysisContext */ @Override public void invoke(SettleDataImport settleDataImport, AnalysisContext analysisContext) { dataMap.put(settleDataImport.getStaffCode(),settleDataImport); this.count++; } @Override public void doAfterAllAnalysed(AnalysisContext analysisContext) { if(StringUtils.isBlank(errorSb.toString())){ //表示没有错误,即将保存 saveData(); LoggerUtils.info("所有数据解析完成"); }else{ throw new CglException(errorSb.toString(),400); } } /** * 解析数据并保存 * 使用HashMap键唯一性将数据根据工号去重 */ private void saveData(){ List<WorkerChildDesc> childs = new ArrayList<>(); for (String s : this.dataMap.keySet()) { SettleDataImport sdi = dataMap.get(s); WorkerChildDesc desc = new WorkerChildDesc(); desc.setStaffCode(sdi.getStaffCode()); desc.setName(sdi.getName()); desc.setTu(sdi.getTu()); desc.setDept(sdi.getDept()); desc.setEntTime(sdi.getEntTime() != null ? DateUtils.format(sdi.getEntTime()) : null); desc.setTakeImageTime(sdi.getTakeImageTime() != null ? DateUtils.format(sdi.getTakeImageTime()) : null); desc.setFirstChildBirth(sdi.getFirstChildBirth() != null ? DateUtils.format(sdi.getFirstChildBirth()) : null); desc.setChildState(sdi.getChildState()); //是否享受本次结算 desc.setIsEnjoy(1); //是否新数据 0 否 desc.setIsNew(0); //数据状态 无需审核 desc.setStatus(2); childs.add(desc); } workerChildDescService.saveBatch(childs); } }