一个导入数据的简单处理

由于觉得公司对于导入数据处理的五花八门有特别啰嗦,所以写着这么一个工具方法供大家用,专门处理导入的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 = new HashMap>>();
        List errlog = new ArrayList();
        
        for(int i=0;i importitem = new HashMap();
            
            //整理excel中的数据并对数据进行标准验证
            for(String key : keylist.keySet()) {
                String keyname = keylist.get(key);
                String val = list.get(i).get(keyname).toString();
                importitem.put(key, val==null?"":val);
                
                //是否不可为空
                boolean isnotnull = keyname.indexOf("*") > -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);
               }
           }
           
       });
   }

你可能感兴趣的:(一个导入数据的简单处理)