一个导入数据的简单处理

【一个导入数据的简单处理】由于觉得公司对于导入数据处理的五花八门有特别啰嗦,所以写着这么一个工具方法供大家用,专门处理导入的excel数据

/** *标准化导入,我不敢保证我写的就是导入的标准,只是希望这件事能标准起来 * @param list excal中读取出的数据 * @param keylist 数据校验索引,目前支持的规则:含"*"的列为必填项,含"?"的列为必填项且不可重复,含"%"的列只能为整数,含"[]"的列只填写[]中的内容(注:选项用","隔开,","必须为英文且选项两边没有空格) * @param importDataHandler 扩展类,其中包含两个方法:一个是需要对数据进行特殊验证的方法, 另一个操作整理后的数据 */ public String standardImport(List list, Map keylist, ImportDataHandler importDataHandler) throws Exception { Map rejson = new HashMap(); rejson.put("code", "1"); rejson.put("msg", "sucess"); //记录整理后的数据 List insertlist = new ArrayList(); //记录数据重复的结果 Map>> repeatdata = https://www.it610.com/article/new HashMap>>(); List errlog = new ArrayList(); for(int i=0; i -1; //是否不可重复 boolean isnotrepeat = keyname.indexOf("?") > -1; //值是否为空 boolean isnoval = "".equals(val); //非空验证 if((isnotnull || isnotrepeat) && isnoval) { String err = "第"+excelRow+"行错误:\""+keylist.get(key)+"\"不能为空!"; errlog.add(err); }//对于值的判断只在有内容时才做判断 if(!isnoval) { //数据重复情况的记录 if(isnotrepeat && !isnoval) { Map> map = new HashMap>(); if(repeatdata.containsKey(key)) { map = repeatdata.get(key); } else { repeatdata.put(key, map); } if(repeatdata.get(key).containsKey(val)) { List repeatval = map.get(val); repeatval.set(0, repeatval.get(0)+", 第"+excelRow+"行"); repeatval.set(1, (Integer.parseInt(repeatval.get(1)) + 1) + ""); repeatval.set(2, "false"); } else { List repeatval = new ArrayList(); repeatval.add("第"+excelRow+"行"); repeatval.add("1"); repeatval.add("true"); map.put(val, repeatval); } }//整数验证 if(keyname.indexOf("%") > -1) { try { Integer.parseInt(val); } catch (Exception e) { String err = "第"+excelRow+"行错误:\"" + keylist.get(key)+"\"列只能填写整数!"; errlog.add(err); } }//选项验证 if(keyname.indexOf("[") > -1 && keyname.indexOf("]") > -1) { String options = keyname.substring(keyname.indexOf("[")+1,keyname.indexOf("]")); String[] optionlist = options.split(","); boolean ishas = false; for(String option : optionlist) { if(option.equals(val)) { ishas = true; break; } } if(!ishas) { String err = "第"+excelRow+"行错误:\"" + keylist.get(key)+"\"列所填写的值(" + val + ")不在选项[" + options +"]中!"; errlog.add(err); } } } }//特殊验证 importDataHandler.checkData(importitem, errlog, excelRow); insertlist.add(importitem); }//分析数据重复记录 for(String colkey : repeatdata.keySet()) { for(String valkey : repeatdata.get(colkey).keySet()) { if("false".equals(repeatdata.get(colkey).get(valkey).get(2))) { String err = "值("+valkey+")在\""+keylist.get(colkey)+"\"列共重复出现了"+repeatdata.get(colkey).get(valkey).get(1)+"次,分别在:"+repeatdata.get(colkey).get(valkey).get(0)+"!"; errlog.add(err); } } }if(errlog.size() > 0) { //如果错误日志中有内容则返回错误信息 rejson.put("code", "2"); rejson.put("msg", "err"); rejson.put("data", errlog); } else { //否则的化插入数据 importDataHandler.insertData(insertlist); }return JSONValue.toJSONString(rejson); }

public interface ImportDataHandler { /** * 需要特殊验证部分字段 * @param importitem 导入的一行数据 * @param errlog 错误日志,验证失败记录在这里 * @param excelRow 当前验证的行数 */ void checkData(Map importitem, List errlog, int excelRow) throws Exception; /** * 插入导入的数据 * @param insertlist 整理后的数据 */ void insertData(List insertlist) throws Exception; }

使用示例:
//导入学生 @Override public String tx_importStudentPerson(final User user, final Map data, List list) throws Exception {//建立数据校验索引 final Map keylist = new HashMap(); keylist.put("personname", "*姓名"); keylist.put("majorname", "*专业"); keylist.put("sexname", "*性别[男,女]"); keylist.put("idcard", "?身份证号"); keylist.put("academicdegree", "学位"); keylist.put("email", "邮箱*"); keylist.put("gradeyear", "%届别(例如:2018)"); keylist.put("highestdegree", "学历[无,大专,本科,研究生]"); keylist.put("hospital", "所属医院"); keylist.put("jobnum", "?工号"); keylist.put("nation", "民族"); keylist.put("phoneno", "?手机号码"); keylist.put("school", "所属学校"); keylist.put("sourceatudenttype", "*学员类型[单位人,研究生,社会人]"); keylist.put("studentyears", "*学年"); keylist.put("tutor", "导师"); keylist.put("roundversion", "*大纲版本"); return toolstservice.standardImport(list, keylist, new ImportDataHandler() {@Override public void checkData(Map importitem, List errlog, int excelRow) throws Exception { //身份证号验证 if(basicDataService.checkIdcard(importitem)) { String err = "第"+excelRow+"行错误:\""+keylist.get("idcard")+"\"列所填写的"+importitem.get("idcard")+"与系统已有人员重复!"; errlog.add(err); }//专业名称验证 List majorlist = basicDataService.getmajorbymajorname(importitem); if(majorlist.size() == 1) { importitem.put("majorid", majorlist.get(0).get("majorsubjectid")); } else { String err = "第"+excelRow+"行错误:\""+keylist.get("majorname")+"\"列所填写的"+importitem.get("majorname")+"与系统数据不匹配!"; errlog.add(err); }}@Override public void insertData(List insertlist) throws Exception { for(Map item : insertlist) { String personid = toolstservice.getNumserialnumber("1"); item.put("personid", personid); //学员人员类型为1 item.put("persontype", 1); item.put("sex", "男".equals(item.get("sexname")) ? "1" : "0"); //添加人员表 personDao.addPerson(data); //添加学生表 personDao.addPersonStudent(data); } }}); }

    推荐阅读