Java导入Excel--值得收藏使用

业务实现有如下几点:

1.解析Excel;

2.提示异常行;

3.提示多行重复数据;

代码解析:(仅供参考)


        // TODO Auto-generated method stub
        JSONObject json = new JSONObject();
        response.setCharacterEncoding("utf-8");
        SystemUser user = (SystemUser)request.getSession().getAttribute(Constants.SESSION_TRAIN_ADMIN_USER);
        int insertNum=0;//记录成功插入多少条记录
        int nullNum=0;//记录空行记录
        try{
        Integer result =0;
        //获取年度
        String yearId = request.getParameter("yearId");
        //机构
        String orgId = request.getParameter("orgId");
        //省id
        String provinceId = request.getParameter("provinceId");
        //年度值
        String yearName = request.getParameter("yearName");
        /**
         * 获取级别
         */
        String unitLevel = request.getParameter("unitLevel");
        StringBuffer bufferExce = new StringBuffer();
        
        MultipartHttpServletRequest multipartRequest=(MultipartHttpServletRequest) request;
        List<List<Object>>  objList=new ArrayList<List<Object>>();
        MultipartFile file= multipartRequest.getFile("upfile");
        if(null!=file&&file.isEmpty()){
            json.put("code", "1000");
            json.put("msg", "导入失败,文件不存在!");
            try {
                throw new Exception("导入失败,文件不存在!");
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        long size=file.getSize();
        if(size>1*1024*1024){
            json.put("code", "1000");
            json.put("msg", "导入失败,文件大小不超过1M!");
            return json.toString();
        }
        
        String uploadDir=request.getSession().getServletContext().getRealPath("/") + "/excelupload/";
        File fileDir=new File(uploadDir);
        if(!fileDir.exists())
            fileDir.mkdir();
        File newFile = new File(uploadDir + file.getOriginalFilename());
        if (!newFile.exists()){
          newFile.createNewFile();
        }
        byte[] b = new byte[2248000];
        InputStream is = file.getInputStream();
        FileOutputStream fos = new FileOutputStream(newFile);
        int read = 0;
        while (read != -1) {
          read = is.read(b, 0, b.length);
          if (read == -1) {
            break;
          }
          fos.write(b, 0, read);
        }
        fos.flush();
        fos.close();
        is.close();
        //首先对上传的Excel进行解析,进行数据检查
        Workbook wb = null;
        is = file.getInputStream();
          
        String fileName = file.getOriginalFilename();
        try{
            if(fileName.contains(".xlsx")){
                wb = new XSSFWorkbook(is);
            } else {
                wb = new HSSFWorkbook(is);
            }
        }catch(Exception e){
            json.put("code", "1000");
            json.put("message", "导入失败,请下载正确的导入模板!");
            StrutsUtil.renderText(response, json.toString());
            return null;
        }
        HashMap<String,Object> numPhone=new HashMap<String,Object>();//手机号
        
        HashMap<String,String> mapPhone=new HashMap<String,String>();//手机号
        HashMap<String,Object> tmapPhone=new HashMap<String,Object>();//手机号
        HashMap<String,Object> tmapExcepPhone=new HashMap<String,Object>();//手机号
        HashMap<String,Object> tmapRowNull=new HashMap<String,Object>();//记录空行
        
        HashMap<String,Object> tmapLevel=new HashMap<String,Object>();//行政级别
        
        List<Map<String, String>> tmapMaps = new ArrayList<Map<String, String>>();;//重复数据--省市区机构级别
        Map<String,Object> tmapCriticalCareMedicine=new HashMap<String,Object>();//培训呼吸与危重症医学
        Map<String,Object> tmapCardiovascularMedicine=new HashMap<String,Object>();//培训心血管内科学
        Map<String,Object> tmapObstetricsAndGynecology =new HashMap<String,Object>();//培训妇产科学
        Map<String,Object> tmapUltrasonicDiagnostics=new HashMap<String,Object>();//训超声诊断学
         
        //省市区+机构名+级别 拼接--省+市+区+机构+级别
        HashMap<String,String> tmapAll=new HashMap<String,String>();//区县
        HashMap<String,String> mapAll=new HashMap<String,String>();//区县
        String allMap = "";
        List<ZxBase> baseList = new ArrayList<ZxBase>();//基地集合
        List<ZxBaseYear> updateBaseYearList = new ArrayList<ZxBaseYear>();//基地年度集合
        List<ZxBase> updateBaseList = new ArrayList<ZxBase>();//基地年度集合
        int count=0;
        Sheet sheet = wb.getSheetAt(0);
        //读取图片
        List<XSSFPictureData> pictures = (List<XSSFPictureData>) wb.getAllPictures();  
        int noPictures = pictures.size();
        if (noPictures>0) {
            json.put("code", "1000");
            json.put("message", "上传文件中不应该包含图片,导入失败!");
            throw new RuntimeException(json.toString());
        } 
        int rowNum = getSheetRowLength(sheet);
        if(rowNum>0){
            int realNum = RealNums.RealNum(wb);//实际行数
            if(realNum>1000){
                int sumNum = realNum-2;
                if(sumNum>1000){
                    json.put("code", "1000");
                    json.put("message", "导入失败,总行数不能超过1000行!");
                    throw new RuntimeException(json.toString());
                }
            }
        }
        for (int x = 0; x < 2; x++) {
            String countent="";
            String submitObj ="";
            try {//只校验标题
                countent = formatCell(sheet.getRow(x).getCell(0)).toString().trim();
                //是否培训1
                String oneObjName1 = formatCell(sheet.getRow(x).getCell(6)).toString().trim();
                //是否培训2
                String twoObjName2 = formatCell(sheet.getRow(x).getCell(7)).toString().trim();
                //是否培训3
                String threeObjName3 = formatCell(sheet.getRow(x).getCell(8)).toString().trim();
                //是否培训4
                String fourObjName4 = formatCell(sheet.getRow(x).getCell(9)).toString().trim();
                if(!StringUtil.isBlank(oneObjName1)&&!StringUtil.isBlank(twoObjName2)&&!StringUtil.isBlank(threeObjName3)&&
                        !StringUtil.isBlank(fourObjName4)){
                    submitObj = oneObjName1+twoObjName2+threeObjName3+threeObjName3+fourObjName4;
                }
                if(!StringUtil.isBlank(countent)){
                    int status = zxBaseService.ImportExcelCommonService(Integer.valueOf(yearId),countent,x,submitObj,user.getProjectId());
                    if(status == 400){
                        json.put("code", "1000");
                        json.put("message", "上传文件与模板不匹配,请重新下载模板!");
                        StrutsUtil.renderText(response, json.toString());
                        return null;
                    }
                }else{
                    json.put("code", "1000");
                    json.put("message", "上传失败!Excel信息为空无法导入!");
                    StrutsUtil.renderText(response, json.toString());
                    return null;
                }
                
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                json.put("code", "1000");
                json.put("message", "上传失败!Excel信息为空无法导入!");
                throw new RuntimeException(json.toString());
            }
            //获取第二行的第6、7、8、9的列值,是否和数据库中的培训对象一一对应
            //是否培训呼吸与危重症医学
            String isCriticalCareMedicine = formatCell(sheet.getRow(x).getCell(6)).toString().trim();
            if(!StringUtil.isBlank(isCriticalCareMedicine)){
                //截取第四位开始
                ZxTrainObjectExample exampleC = new ZxTrainObjectExample();
                com.ncme.guopei.model.ZxTrainObjectExample.Criteria criteriaC = exampleC.createCriteria();
                criteriaC.andNameEqualTo(isCriticalCareMedicine.substring(4, isCriticalCareMedicine.length()));
                if(user.getProjectId()!=null){
                    criteriaC.andProjectIdEqualTo(user.getProjectId());
                }
                List<ZxTrainObject> list = trainObjectService.selectByExample(exampleC);
                if(list!=null && list.size()>0){
                    Integer id = list.get(0).getId();
                    tmapCriticalCareMedicine.put("careMedicine", id);
                }
            }
            //是否培训心血管内科学
            String isCardiovascularMedicine = formatCell(sheet.getRow(x).getCell(7)).toString().trim();
            if(!StringUtil.isBlank(isCardiovascularMedicine)){
                //tmapCardiovascularMedicine
                ZxTrainObjectExample exampleM = new ZxTrainObjectExample();
                com.ncme.guopei.model.ZxTrainObjectExample.Criteria criteriaM = exampleM.createCriteria();
                criteriaM.andNameEqualTo(isCardiovascularMedicine.substring(4, isCardiovascularMedicine.length()));
                if(user.getProjectId()!=null){
                    criteriaM.andProjectIdEqualTo(user.getProjectId());
                }
                List<ZxTrainObject> listCard = trainObjectService.selectByExample(exampleM);
                if(listCard!=null && listCard.size()>0){
                    Integer id = listCard.get(0).getId();
                    tmapCardiovascularMedicine.put("cardiovascular", id);
                }
            }
            //是否培训妇产科学
            String isObstetricsAndGynecology = formatCell(sheet.getRow(x).getCell(8)).toString().trim();
            if(!StringUtil.isBlank(isObstetricsAndGynecology)){
                //tmapObstetricsAndGynecology
                ZxTrainObjectExample exampleO = new ZxTrainObjectExample();
                com.ncme.guopei.model.ZxTrainObjectExample.Criteria criteriaO = exampleO.createCriteria();
                criteriaO.andNameEqualTo(isObstetricsAndGynecology.substring(4, isObstetricsAndGynecology.length()));
                if(user.getProjectId()!=null){
                    criteriaO.andProjectIdEqualTo(user.getProjectId());
                }
                List<ZxTrainObject> listObs = trainObjectService.selectByExample(exampleO);
                if(listObs!=null && listObs.size()>0){
                    Integer id = listObs.get(0).getId();
                    tmapObstetricsAndGynecology.put("obstetrics", id);
                }
            }
            //是否培训超声诊断学
            String isUltrasonicDiagnostics = formatCell(sheet.getRow(x).getCell(9)).toString().trim();
            if(!StringUtil.isBlank(isUltrasonicDiagnostics)){
                //tmapUltrasonicDiagnostics
                ZxTrainObjectExample exampleU = new ZxTrainObjectExample();
                com.ncme.guopei.model.ZxTrainObjectExample.Criteria criteriaU = exampleU.createCriteria();
                criteriaU.andNameEqualTo(isUltrasonicDiagnostics.substring(4, isUltrasonicDiagnostics.length()));
                if(user.getProjectId()!=null){
                    criteriaU.andProjectIdEqualTo(user.getProjectId());
                }
                List<ZxTrainObject> listUlt = trainObjectService.selectByExample(exampleU);
                if(listUlt!=null && listUlt.size()>0){
                    Integer id = listUlt.get(0).getId();
                    tmapUltrasonicDiagnostics.put("ultrasonic", id);
                }
            }
            
        }
        String telphone = "";
        int j = 2;//记录实际行
        for (int i = 2; i < rowNum; i++) {
            ZxBase base=new ZxBase();
            StringBuffer trainObj = new StringBuffer();
            if(sheet.getRow(i)==null){
                continue;
            }
            String provinceName = formatCell(sheet.getRow(i).getCell(0)).toString().trim();
            if(!StringUtil.isBlank(provinceName)){
                provinceName = provinceName.replaceAll("\\s*", ""); 
            }
            //市
            String cityName = formatCell(sheet.getRow(i).getCell(1)).toString().trim();
            if(!StringUtil.isBlank(cityName)){
                cityName = cityName.replaceAll("\\s*", ""); 
            }
            //区/县
            String countyName = formatCell(sheet.getRow(i).getCell(2)).toString().trim();
            if(!StringUtil.isBlank(countyName)){
                countyName = countyName.replaceAll("\\s*", ""); 
            }
            //机构名称
            String orgName = formatCell(sheet.getRow(i).getCell(3)).toString().trim();
            if(!StringUtil.isBlank(orgName)){
                orgName = orgName.replaceAll("\\s*", ""); 
            }
            //上级主管部门
            String upUnitName = formatCell(sheet.getRow(i).getCell(4)).toString().trim();
            if(!StringUtil.isBlank(upUnitName)){
                upUnitName = upUnitName.replaceAll("\\s*", ""); 
            }
            //本单位级别
            String Level = formatCell(sheet.getRow(i).getCell(5)).toString().trim();
            if(!StringUtil.isBlank(Level)){
                Level = Level.replaceAll("\\s*", ""); 
            }
            //是否培训呼吸与危重症医学
            String isCriticalCareMedicine = formatCell(sheet.getRow(i).getCell(6)).toString().trim();
            //是否培训心血管内科学
            String isCardiovascularMedicine = formatCell(sheet.getRow(i).getCell(7)).toString().trim();
            //是否培训妇产科学
            String isObstetricsAndGynecology = formatCell(sheet.getRow(i).getCell(8)).toString().trim();
            //是否培训超声诊断学
            String isUltrasonicDiagnostics = formatCell(sheet.getRow(i).getCell(9)).toString().trim();
            /******培训对象 end****************/
            //拟培训人数
            String trainNumber = formatCell(sheet.getRow(i).getCell(10)).toString().trim();
            if(!StringUtil.isBlank(trainNumber)){
                trainNumber = trainNumber.replaceAll("\\s*", ""); 
            }
            //联系人
            String trainUser = formatCell(sheet.getRow(i).getCell(11)).toString().trim();
            if(!StringUtil.isBlank(trainUser)){
                trainUser = trainUser.replaceAll("\\s*", ""); 
            }
            //联系电话
            String trainPhone = formatCell(sheet.getRow(i).getCell(12)).toString().trim();
            if(!StringUtil.isBlank(trainPhone)){
                trainPhone = trainPhone.replaceAll("\\s*", ""); 
            }
            //排除物理读行后,整行都为空的行
            if("".equals(provinceName) && "".equals(cityName) && "".equals(countyName)
                     && "".equals(orgName) && "".equals(upUnitName) && "".equals(Level) && "".equals(isCriticalCareMedicine)
                     && "".equals(isCardiovascularMedicine) && "".equals(isObstetricsAndGynecology) && "".equals(isUltrasonicDiagnostics)
                     && "".equals(trainNumber) && "".equals(trainUser)  && "".equals(trainPhone)){
                continue;
            }else if("".equals(provinceName) || "".equals(cityName) || "".equals(countyName)
                     || "".equals(orgName) ||  "".equals(upUnitName) || "".equals(Level) || "".equals(isCriticalCareMedicine)
                     || "".equals(isCardiovascularMedicine) || "".equals(isObstetricsAndGynecology) || "".equals(isUltrasonicDiagnostics)
                     || "".equals(trainNumber) || "".equals(trainUser)  || "".equals(trainPhone)){//筛选出信息不全的所在行
                //筛选出信息不全的所在行
                i++;
                bufferExce.append("第"+i+"行有信息为空无法导入!<br>");
                continue;
            }else{
                /**
                 * -- 此else执行解决. 对读取的列值,进行校验,无异常保存到base实体类,封装到list<Base>中;有异常,记录多处错误,按提示返回到用户
                 * */
                j++;
                /**
                *Excel解析从0开始,已控制从2(解析Excel的第三行)开始,
                *发现在Excel中是从第2行开始,所以,这里的j代替i递增的虚数,j++,从实际行第三行开始
                **/
                //根据省名字,匹配省id
                ExamPropVal propValPro=null;
                List<ExamPropVal> prop = null;//市集合
                ExamPropVal examCity = null;//市
                List<ExamPropVal> propCount = null;//区县集合
                ExamPropVal examCount = null;//区县
                if(!StringUtil.isBlank(provinceName)){
                    Map<String, Object> mapProName = new HashMap<>();
                    mapProName.put("name", provinceName.trim());
                    mapProName.put("type", 20);
                    propValPro = examPropValService.getPropByName(mapProName);
                    if(propValPro==null){//异常
                        bufferExce.append("第"+j+"行有地区省信息错误,无法导入!<br>");
                    }else{
                        base.setProvinceName(propValPro.getName());
                        base.setProvinceId(propValPro.getId());
                    }
                }
                //根据市名字,匹配市id
                if(!StringUtil.isBlank(cityName)){
                    ExamPropVal query = new ExamPropVal();
                    query.setName(cityName.trim());
                    if(propValPro!=null){
                        query.setId(propValPro.getId());
                        query.setType(21);//市级
                        prop = examPropValService.getNextLevelProp(query);
                        if(prop!=null&&prop.size()>0){
                            base.setCityName(prop.get(0).getName());
                            base.setCityId(prop.get(0).getId());
                        }else{
                            bufferExce.append("第"+j+"行有地区市信息错误,无法导入!<br>");
                        }
                    }else{
                        Map<String, Object> mapCitName = new HashMap<>();
                        mapCitName.put("name", cityName.trim());
                        mapCitName.put("type", 21);
                        examCity = examPropValService.getPropByName(mapCitName);
                        if(examCity!=null){//二次校验市
                            base.setCityName(examCity.getName());
                            base.setCityId(examCity.getId());
                        }else{//市信息错误
                            bufferExce.append("第"+j+"行有地区市信息错误,无法导入!<br>");
                        }
                    }
                }
                //根据区县名字,匹配区县的id
                if(!StringUtil.isBlank(countyName)){
                    ExamPropVal queryCount = new ExamPropVal();
                    queryCount.setName(countyName.trim());//区县级
                    if(prop!=null&&prop.size()>0){
                        queryCount.setId(prop.get(0).getId());
                        queryCount.setType(22);//区县级
                        propCount = examPropValService.getNextLevelProp(queryCount);
                        if(propCount!=null&&propCount.size()>0){
                            base.setCountyName(propCount.get(0).getName());
                            base.setCountyId(propCount.get(0).getId());
                        }else{
                            bufferExce.append("第"+j+"行有地区区县信息错误,无法导入!<br>");
                        }
                    }else{
                        //bufferExce.append("第"+j+"行有地区区县信息错误,无法导入!<br>");
                        Map<String, Object> mapCountyName = new HashMap<>();
                        mapCountyName.put("name", countyName.trim());
                        mapCountyName.put("type", 22);
                        examCount = examPropValService.getPropByName(mapCountyName);
                        if(examCount!=null){//二次校验区县
                            base.setCountyName(examCount.getName());
                            base.setCountyId(examCount.getId());
                        }else{//市信息错误
                            bufferExce.append("第"+j+"行有地区区县信息错误,无法导入!<br>");
                        }
                    }
                }
                if(!StringUtil.isBlank(orgName)){
                    base.setOrgName(orgName);
                }
                //上级主管单位
                if(!StringUtil.isBlank(upUnitName)){
                    ZxOrgExample orgExample = new ZxOrgExample();
                    orgExample.createCriteria().andNameEqualTo(upUnitName).andProjectIdEqualTo(user.getProjectId());
                    List<ZxOrg> orgList = zxOrgService.selectByExample(orgExample);
                    if(orgList!=null&&orgList.size()>0){
                        base.setOrgId(orgList.get(0).getId());//科教司加入上级单位
                    }else{
                        bufferExce.append("第"+j+"行有上级主管部门与模板不符,无法导入!<br>");
                    }
                }
                if(!StringUtil.isBlank(Level)){
                    //查询行政级别
                    ZxLevelExample example = new ZxLevelExample();
                    example.createCriteria().andNameEqualTo(Level).andProjectIdEqualTo(user.getProjectId());
                    List<ZxLevel> levels = zxlevelService.searchLevels(example);
                    if(!levels.isEmpty()){
                        for (ZxLevel zxLevel : levels) {
                            if(zxLevel.getName().equals(Level)){//excel模板中的单位级别与数据库级别相等
                                Level =    String.valueOf(zxLevel.getSeq());
                            }else{
                                bufferExce.append("第"+j+"行有行政级别与模板不符,无法导入!<br>");//行政级别和数据库中没有一一对应的,记录错误行
                            }
                        }
                        if(isInteger(Level)){
                            //做一个判断
                            if (!StringUtil.isBlank(unitLevel)) {
                                Integer unitL = Integer.valueOf(unitLevel);//上级
                                Integer newlev = Integer.valueOf(Level);//excel中的级别
                                if(newlev>=unitL){//eq:下级大于上级时,
                                    base.setUnitLevel(Integer.valueOf(Level));
                                }else{
                                    bufferExce.append("第"+j+"行“本单位级别”超出您的管辖范围,无法导入!<br>");//行政级别和数据库中没有一一对应的,记录错误行
                                }
                            }
                            
                        }
                    }else{
                        bufferExce.append("第"+j+"行有行政级别与模板不符,无法导入!<br>");//行政级别和数据库中没有一一对应的,记录错误行
                    }
                }
                /****培训对象begin***************/
                if(!StringUtil.isBlank(isCriticalCareMedicine)){
                    if(isCriticalCareMedicine.contains("是")){//存在此培训对象
                            if(tmapCriticalCareMedicine!=null&&null!=tmapCriticalCareMedicine.get("careMedicine")){//培训对象得到id
                                trainObj.append(tmapCriticalCareMedicine.get("careMedicine")+",");
                            }
                        }
                }
                if(!StringUtil.isBlank(isCardiovascularMedicine)){
                    if(isCardiovascularMedicine.contains("是")){//存在此培训对象
                            if(tmapCardiovascularMedicine!=null&&null!=tmapCardiovascularMedicine.get("cardiovascular")){//培训对象得到id
                                trainObj.append(tmapCardiovascularMedicine.get("cardiovascular")+",");
                            }
                        }
                }
                if(!StringUtil.isBlank(isObstetricsAndGynecology)){
                    if(isObstetricsAndGynecology.contains("是")){
                        if(tmapObstetricsAndGynecology!=null&&null!=tmapObstetricsAndGynecology.get("obstetrics")){//培训对象得到id
                            trainObj.append(tmapObstetricsAndGynecology.get("obstetrics")+",");
                        }
                    }
                }
                if(!StringUtil.isBlank(isUltrasonicDiagnostics)){
                    if(isUltrasonicDiagnostics.contains("是")){
                            if(tmapUltrasonicDiagnostics!=null&&null!=tmapUltrasonicDiagnostics.get("ultrasonic")){//培训对象得到id
                                trainObj.append(tmapUltrasonicDiagnostics.get("ultrasonic")+",");
                            }
                        }
                }
                /****培训对象end***************/
                if(!StringUtil.isBlank(trainNumber)){//你培训人数
                    boolean isNum = isInteger(trainNumber);
                    if(isNum){//判断是否是数字
                        if(trainNumber.length()>5){
                            bufferExce.append("第"+j+"行拟培训人数超出5位数字,无法导入!<br>");
                        }else{
                            base.setTrainNumber(Integer.valueOf(trainNumber));
                        }
                    }else{//可能是数字
                        bufferExce.append("第"+j+"行有拟培训人数错误,无法导入!<br>");
                    }
                }
                if(!StringUtil.isBlank(trainUser)){//联系人
                    if(trainUser.length()>20){//联系人超过20个字,截取前20
                        String string = trainUser.substring(0, 20);
                        base.setTelUser(string);
                    }else{//不超过20个字
                        base.setTelUser(trainUser);
                    }
                }
                if(!StringUtil.isBlank(trainPhone)){//手机号
                    boolean isNum = isInteger(trainPhone);//判断手机号是否是数字
                    if(isNum){//是数字
                        boolean trueOrFalse = ValidateUtils.validPhoneNum("2", trainPhone);
                        if(trueOrFalse){//符合
                            if(trainPhone.length()>11){//联系人超过11个字,截取前11
                                String string = trainPhone.substring(0, 11);
                                base.setTelPhone(string);
                            }else{//不超过11个字
                                base.setTelPhone(trainPhone);
                            }
                        }else{
                            bufferExce.append("第"+j+"行有手机号错误,无法导入!<br>");
                        }
                    }else{//可能是汉字
                        bufferExce.append("第"+j+"行有手机号错误,无法导入!<br>");
                    }
                }
                //地区机构名级别拼接--省市区 机构名完全一致
                if(!StringUtil.isBlank(provinceName)&&!StringUtil.isBlank(cityName)&&!StringUtil.isBlank(countyName)
                        &&!StringUtil.isBlank(orgName)
                        &&!StringUtil.isBlank(Level)){
                    String allStr=provinceName.trim()+cityName.trim()+countyName.trim()+orgName.trim()+Level.trim();
                    int newNum=i+1;
                    //失败原因:第XX行XX
                    if(mapAll.containsKey(allStr)){
                        //记住第一次出现
                        String lineNum=mapAll.get(allStr);//拿到先前保存的行号
                        //logger.info("----地区拿到行号----"+lineNum);
                        if(tmapAll.containsKey(allStr)){
                            allMap = provinceName.trim()+cityName.trim()+countyName.trim()+orgName.trim()+Level.trim();;//allMap = allStr  方便异常输入
                            String str = tmapAll.get(allStr);
                            tmapAll.put(allStr, str+"与第"+newNum+"行信息重复<br>");//更新后,显示效果:——》行重复:在第 2 ,3 , 5
                            logger.info("地区更新后,显示效果  "+str+","+newNum);
                        }else{
                            allMap = base.getProvinceName()+base.getCityName()+base.getCountyName()+base.getOrgName()+base.getUnitLevel();//allMap = allStr  方便异常输入
                            logger.info("地区最后显示效果 ---->重复:行数位于第  "+lineNum+","+newNum);
                            tmapAll.put(allStr, "第"+lineNum+"行与第"+newNum+"行信息重复<br>");//最后显示效果:——》行重复:在第 2 ,3
                        }
                        
                    }
                    tmapMaps.add(tmapAll);
                    mapAll.put(allStr, newNum+"");//把i行的第column列的值与行号保存到map中
                    
                }
                //保存培训对象
                if(null!=trainObj && trainObj.length()>0){
                    String strObj = trainObj.toString();
                    if(!StringUtil.isBlank(strObj)){
                        String trainObject = strObj.substring(0,strObj.length()-1);
                        base.setTrainingObject(trainObject);
                    }
                }
                /**
                 * 重复的省市区,进行修改
                 */
                Map<String, Object> map = new HashMap<>();
                map.put("provinceName", base.getProvinceName());//省
                map.put("cityName", base.getCityName());//市
                map.put("countyName", base.getCountyName());//区县
                map.put("unitLevel", base.getUnitLevel());//级别
                map.put("name", base.getOrgName());//名称
                if(base.getOrgId()!=null){
                    map.put("orgId", base.getOrgId());//科教司模板存在   上级
                }
                map.put("projectId", user.getProjectId());//加入培训类型
                List<ZxBase> zxSelectBaseList = zxBaseService.getZxBaseAll(map);//地区、名称、级别完全一致  
                if(!zxSelectBaseList.isEmpty()){//有重复的  地区、名称、级别完全一致   修改联系人和手机号
                    for (ZxBase zxSelectBase : zxSelectBaseList) {
                        if(zxSelectBase!=null){
                            ZxBase zxNewBase  = new ZxBase();
                            ZxBaseYear zxNewBaseYear = new ZxBaseYear();
                            zxNewBase.setId(zxSelectBase.getId());//根据重复的id,修改手机号和用户名yearName
                            zxNewBaseYear.setBaseId(zxSelectBase.getId());//年度基地id
                            zxNewBase.setTelUser(base.getTelUser());
                            zxNewBase.setTelPhone(base.getTelPhone());
                            zxNewBase.setTrainNumber(base.getTrainNumber());//拟培训人数
                            zxNewBaseYear.setTrainNumber(base.getTrainNumber());//年度培训人数
                            //加入年度
                            zxNewBase.setOnYearId(Integer.valueOf(yearId));//年度id
                            zxNewBaseYear.setYearId(Integer.valueOf(yearId));//基地年度 年度id
                            
                            if(!StringUtil.isBlank(yearName)){
                                zxNewBase.setYearName(Integer.valueOf(yearName));
                                zxNewBaseYear.setYearValue(Integer.valueOf(yearName));//基地年度值如:2018
                            }
                            if(!StringUtil.isBlank(base.getTrainingObject())){//存入培训对象
                                zxNewBase.setTrainingObject(base.getTrainingObject());
                                zxNewBaseYear.setTrainObject(base.getTrainingObject());
                            }
                            zxNewBase.setProjectId(user.getProjectId());
                            //基地导入,有重复的修改   importBase = 1 是
                            zxNewBase.setImportBase(1);
                            //此处批量修改
                            int success = zxBaseService.updateZxBase(zxNewBase);//修改基地
                            if(success>0){//大于0插入成功
                                insertNum=insertNum+1;
                            }else{
                                insertNum=insertNum+1;
                            }
                            /*updateBaseYearList.add(zxNewBaseYear);
                            updateBaseList.add(zxNewBase);*/
                        }
                    }
                }else{//去掉重复的,添加不重复的基地
                    ZxOrgExample exampleQx=new ZxOrgExample();
                    Criteria criteriaQx=exampleQx.createCriteria();
                    //criteriaQx.andIdEqualTo(Integer.valueOf(orgId));
                    if(base.getUnitLevel()==1){//卫计委
                        criteriaQx.andIdEqualTo(base.getOrgId()).andProjectIdEqualTo(user.getProjectId());
                    }else if(base.getUnitLevel()==2){//省
                        criteriaQx.andIdEqualTo(base.getOrgId()).andProjectIdEqualTo(user.getProjectId());
                    }else if(base.getUnitLevel()==3){//市
                        criteriaQx.andIdEqualTo(base.getOrgId()).andProjectIdEqualTo(user.getProjectId());
                    }else if(base.getUnitLevel()==4){//区县
                        criteriaQx.andIdEqualTo(base.getOrgId()).andProjectIdEqualTo(user.getProjectId());
                    }else{//区县以下级别
                        criteriaQx.andIdEqualTo(base.getOrgId()).andProjectIdEqualTo(user.getProjectId());
                    }
                    List<ZxOrg> list = zxOrgService.selectByExample(exampleQx);
                    if(list!=null&&list.size()>0){
                        ZxOrg zxOrg = list.get(0);
                        String path = zxOrg.getPath();
                        base.setPath(path);//path上级的路径
                    }
                    baseList.add(base);
                }
                //继续循环
                count++;
            }
        }
        if(tmapPhone.size()>0&&tmapPhone!=null){//手机号错误
            bufferExce.append(tmapPhone.get("phone"));
        }
        if(!StringUtil.isBlank(bufferExce.toString())){//把地区错误,空列集合在一起
            String strException = bufferExce.toString();
            json.put("code", "202");
            json.put("msg", "上传失败!失败原因:<br>"+strException);
            throw new RuntimeException(json.toString());
        }
        if(tmapMaps!=null&&tmapMaps.size()>0&&!tmapMaps.isEmpty()){
            Set<String> tmapSet = new HashSet<String>();  
            for (Map<String,String> map:tmapMaps ) {
                 Set<Map.Entry<String, String>> entryseSet=map.entrySet(); 
                    for (Map.Entry<String, String> entry:entryseSet) {
                        String key = entry.getValue();
                        tmapSet.add(key);
                    }
            }
            json.put("code", "100102");
            StringBuffer stringBuffer = new StringBuffer();
            if(!tmapSet.isEmpty()){
                for (String str : tmapSet) {  
                    stringBuffer.append(str);
                }
                String string = stringBuffer.toString();
                json.put("messageAll","上传失败!失败原因:<br>"+ string);//承接regionMap =regionStr  省市区的拼接字符串
                throw new RuntimeException(json.toString());
            }
        }
        
        if(tmapAll.size()>0&&tmapAll!=null){//省市区机构级别完全一样,提示重复
            json.put("code", "100102");
            json.put("messageAll","上传失败!失败原因:<br>"+ tmapAll.get(allMap));//承接regionMap =regionStr  省市区的拼接字符串
            throw new RuntimeException(json.toString());
        }
        //批量修改基地部分信息
        /*if(updateBaseYearList!=null && updateBaseYearList.size() > 0){
            int i = zxBaseYearMapper.updateByBaseYearList(updateBaseYearList);
            
        }
        //批量修改基地年度部分信息
        if(updateBaseList!=null && updateBaseList.size()>0 ){
            int i  = zxBaseService.updateByBaseList(updateBaseList);
            if(i>0){//大于0插入成功
                insertNum=insertNum+1;
            }
        }*/
        if(baseList!=null  && baseList.size()>0){
        
            for (ZxBase zxBase : baseList) {
                if(!StringUtil.isBlank(zxBase.getTrainingObject())){//存入培训对象
                    zxBase.setTrainingObject(zxBase.getTrainingObject());
                }
                if(!StringUtil.isBlank(yearId)){
                    zxBase.setOnYear(Integer.valueOf(yearId));
                }
                
                //插入基地信息
                ZxBase insertBase =  new ZxBase();
                if(user!=null){
                    insertBase.setProjectId(user.getProjectId());
                    insertBase.setCreateUserid(user.getId().intValue());
                }
                if(!StringUtil.isBlank(zxBase.getTrainingObject())){
                    insertBase.setTrainingObject(zxBase.getTrainingObject());
                }
                insertBase.setType(5);//基地
                if(!StringUtil.isBlank(yearName)){
                    insertBase.setYearName(Integer.valueOf(yearName));
                }
                //匹配省id
                insertBase.setProvinceId(zxBase.getProvinceId());//加入省id
                //匹配市id
                insertBase.setCityId(zxBase.getCityId());//加入市id
                //匹配区县的id
                insertBase.setCountyId(zxBase.getCountyId());//加入区县id
                insertBase.setUnitLevel(zxBase.getUnitLevel());//级别
                insertBase.setTelUser(zxBase.getTelUser());//用户
                insertBase.setTelPhone(zxBase.getTelPhone());//联系方式
                insertBase.setTrainNumber(zxBase.getTrainNumber());//拟培训人数
                insertBase.setName(zxBase.getOrgName());//机构名称
                insertBase.setPath(zxBase.getPath());//加入path
                if(null!=zxBase.getOnYear()){//加入年度
                    insertBase.setOnYearId(zxBase.getOnYear());//年度id
                }
                if(zxBase.getOrgId()!=null){
                    insertBase.setOrgId(zxBase.getOrgId());//科教司存在上级主管部门 机构id
                }
                if(!StringUtil.isBlank(yearId)){
                    insertBase.setYearId(Integer.valueOf(yearId));//加入年度-------------------需要完善
                }
                int i = zxBaseService.insertSelective(insertBase);//执行插入
                if(i>0){//大于0插入成功
                    insertNum=insertNum+1;
                }
            }
        }
        }catch(RuntimeException e){
            e.printStackTrace();
            json.put("data", e.getMessage());
            StrutsUtil.renderText(response, json.toString());
            return null;
        }
        json.put("code",200);
        json.put("msg", "上传成功,共上传"+ Integer.toString(insertNum)+"条信息!");
        StrutsUtil.renderText(response, json.toString());
        return null;
    =====================================================

解析Excel的工具类:

/**
     * 计算sheet的行数
     * @param sheet
     * Excel 工作表
     * @return
     * @return: int
     */
    private int getSheetRowLength(Sheet sheet) {
        int cntRow = sheet.getLastRowNum() + 1;
        return cntRow;
    }
    /**
     * 获取私有云服务器的文件
     *
     * Title: CountryStuAction.java 
     * Description:
     * 
     * @return File
     * @param request
     * @param filePath
     * @param fileName
     * @return
     * @author luobw  
     * @date 2018年8月2日  
     * @version 1.0
     */
    public static File getNewFile(HttpServletRequest request, String filePath, String fileName) {
        
        File newFile = null;
        //首先check私有云上是否有该文件存在
        
        String string = filePath.replaceAll("****************", "***********");
        try{
            URL url = new URL(string);
            InputStream is=url.openStream();
            
            //定义文件上传后的服务器目录
            String uploadDir=request.getSession().getServletContext().getRealPath("/") + "/upload/";
            File fileDir=new File(uploadDir);
            if(!fileDir.exists())
                fileDir.mkdir();
            newFile = new File(uploadDir + fileName);
            if (!newFile.exists()){
              newFile.createNewFile();
            }
            byte[] b = new byte[2248000];
            
            FileOutputStream fos = new FileOutputStream(newFile);
            int read = 0;
            while (read != -1) {
              read = is.read(b, 0, b.length);
              if (read == -1) {
                break;
              }
              fos.write(b, 0, read);
            }
            fos.flush();
            fos.close();
            is.close();
        }catch(Exception ex){
            return null;
        }
        return newFile;
    }
    /** 
     * 处理单元格格式的方法:比较全面 
     * @param cell 
     * @return 
     */  
    @SuppressWarnings("deprecation")
    public static String formatCell(Cell cell) {  
        if (cell == null) {  
            return "";  
        }  
        //以下判断数据类型
        switch (cell.getCellType()) {  
        case HSSFCell.CELL_TYPE_NUMERIC:  //数字
            //日期格式的处理  
            if (HSSFDateUtil.isCellDateFormatted(cell)) {  
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");  
                return sdf.format(HSSFDateUtil.getJavaDate(cell.getNumericCellValue())).toString();  
            }else{
                return String.valueOf(NumberToTextConverter.toText(cell.getNumericCellValue()));
            }  
            //return String.valueOf(cell.getNumericCellValue());  
            //字符串  
        case HSSFCell.CELL_TYPE_STRING:  
            return cell.getStringCellValue();  
  
            // 公式  
        case HSSFCell.CELL_TYPE_FORMULA:  
            return cell.getCellFormula();  
  
            // 空白  
        case HSSFCell.CELL_TYPE_BLANK:  
            return "";  
  
            // 布尔取值  
        case HSSFCell.CELL_TYPE_BOOLEAN:  
            return cell.getBooleanCellValue() + "";  
              
            //错误类型  
        case HSSFCell.CELL_TYPE_ERROR:  
            return cell.getErrorCellValue() + "";  
        }  
  
        return "";  
    }
    /**
     * 判断字符串是否是数字
     * @param str
     * @return
     */
      public static boolean isInteger(String str) {  
            Pattern pattern = Pattern.compile("^[-\\+]?[\\d]*$");  
            return pattern.matcher(str).matches();  
      }
     

猜你喜欢

转载自blog.csdn.net/luo_Json/article/details/84631532
今日推荐