处理导入的excel,并且把异常数据原因写在excel最后一列,并导出新的excel

1、Controller层逻辑处理

 

@RequestMapping("/batchInsertByExcel")
public ResultData batchInsertByExcel(MultipartFile file, HttpServletResponse response){
    ResultData resultData = new ResultData();
    Workbook workbook = null;
    try {
        workbook = WorkbookFactory.create(file.getInputStream());
        classTeacherRelationBusiness.batchInsertByExcel(workbook);

        resultData.setSuccessStatus();
    } catch (IOException e) {
        HelpUtils.log_error(getClass(), "读取excel文件IO异常", e);
        resultData.setErrorStatus(1, "读取excel文件异常");
    } catch (InvalidArgumentException | BusinessException e) {
        HelpUtils.log_error(getClass(), "解析excel文件业务异常", e);
        resultData.setErrorStatus(1, e.getMessage());
    }catch (ExcelParseErrorException e){
        try {
            String fileName = UUID.randomUUID().toString().replace("-","");
            setResponseHeader(response, fileName.concat(".").concat(StringUtils.substringAfter(file.getOriginalFilename(), ".")));
            OutputStream os = response.getOutputStream();
            workbook.write(os);
            os.flush();
            os.close();
        } catch (Exception e1) {
            HelpUtils.log_error(getClass(), "解析excel文件系统异常", e);
            resultData.setErrorStatus(1, "【批量导入班级老师失败】");
        }
    }catch (Exception e){
        HelpUtils.log_error(getClass(), "解析excel文件系统异常", e);
        resultData.setErrorStatus(1, "【批量导入班级老师失败】");
    }

    response.setHeader("X-Frame-Options","SAMEORIGIN");
    return resultData;
}

 

2、ClassTeacherRelationBusiness层逻辑处理

    public void batchInsertByExcel(Workbook workbook) {
        List<ClassTeacherRelation> list = parseClassTeacherSheet(workbook);
        if(list.isEmpty()){
            HelpUtils.log_error(getClass(), "批量导入班级老师失败,没有数据");
            throw new BusinessException("【批量导入班级老师失败】没有数据");
        }
        //批量插入
        classTeacherRelationService.batchInsert(list);
    }

3、对导入excel数据进行逻辑处理

private List<ClassTeacherRelation> parseClassTeacherSheet(Workbook workbook){
        List<ClassTeacherRelation> caseList = new ArrayList<>();
        List<Long> canOperateSchoolIds = getCanOperateSchoolIds();
        if (CollectionUtils.isEmpty(canOperateSchoolIds)){
            throw new BusinessException("【批量导入班级老师失败】,您没有对学校的操作权限");
        }
        //防重处理
        Map<String, Object> map = new HashMap<>();
        //学校缓存,一般一次只导入一个学校的数据
        Map<String, SchoolInfo> schoolInfoMap = new HashMap<>();

        boolean hasError = false;

        Sheet sheet = workbook.getSheetAt(0);
        int cellNum = ExcelUtils.removeErrorCell(sheet);
        for (int rowIndex = 1; rowIndex <= sheet.getLastRowNum(); rowIndex++) {
            try {
                Row row = sheet.getRow(rowIndex);
                if(ExcelUtils.isRowEmpty(row)){
                    continue;
                }
                //接收字段
                ClassTeacherRelation classTeacher = new ClassTeacherRelation();
                ClassInfo classInfo = new ClassInfo();
                StaffInfo staffInfo = new StaffInfo();

                readRow(row, classTeacher, classInfo, staffInfo);
                //校验必填项
                if (StringUtils.isEmpty(classInfo.getSchoolName())
                        || classInfo.getClassYear() == null
                        || StringUtils.isEmpty(classInfo.getGradeName())
                        || classInfo.getClassNo() == null
                        || classInfo.getClassYear() == null
                        || StringUtils.isEmpty(staffInfo.getName())
                        || StringUtils.isEmpty(staffInfo.getMobile())) {
                    ExcelUtils.writeInTemplate("有必填项为空", rowIndex, cellNum, sheet);
                    throw new InvalidArgumentException("【批量导入班级老师失败】第【" + (rowIndex + 1) + "】行,有必填项为空");
                }
                if(!RegexUtil.isMobile(staffInfo.getMobile())){
                    ExcelUtils.writeInTemplate("手机号格式错误", rowIndex, cellNum, sheet);
                    throw new InvalidArgumentException("【批量导入班级老师失败】第【" + (rowIndex + 1) + "】行,老师手机号格式错误");
                }
                if(classTeacher.getIsHeadMaster() != FscConstant.YES
                        && StringUtils.isEmpty(classTeacher.getSubject())){
                    ExcelUtils.writeInTemplate("非班主任任课科目必填", rowIndex, cellNum, sheet);
                    throw new InvalidArgumentException("【批量导入班级老师失败】第【" + (rowIndex + 1) + "】行,非班主任任课科目必填");
                }
                //校验学校
                SchoolInfo schoolInfo = schoolInfoMap.get(classInfo.getSchoolName());
                if(schoolInfo == null){
                    schoolInfo = schoolInfoService.selectSchoolId(classInfo.getSchoolName());
                    schoolInfoMap.put(classInfo.getSchoolName(), schoolInfo);
                }
                if (schoolInfo == null) {
                    ExcelUtils.writeInTemplate("该学校不存在", rowIndex, cellNum, sheet);
                    throw new BusinessException("【批量导入班级老师失败】第【" + (rowIndex + 1) + "】行,该学校不存在");
                }
                if (!canOperateSchoolIds.contains(schoolInfo.getId())) {
                    ExcelUtils.writeInTemplate("您没有该学校的操作权限", rowIndex, cellNum, sheet);
                    throw new BusinessException("【批量导入班级老师失败】第【" + (rowIndex + 1) + "】行,您没有该学校的操作权限");
                }
                //校验年级
                GradeInfo gradeInfo = gradeInfoService.queryByName(classInfo.getGradeName());
                if (gradeInfo == null) {
                    ExcelUtils.writeInTemplate("该年级不存在", rowIndex, cellNum, sheet);
                    throw new BusinessException("【批量导入班级老师失败】第【" + (rowIndex + 1) + "】行,该年级不存在");
                }
                //校验班级
                ClassInfo classParam = new ClassInfo();
                classParam.setSchoolId(schoolInfo.getId());
                classParam.setClassYear(classInfo.getClassYear());
                classParam.setClassNo(classInfo.getClassNo());
                classParam.setGradeId(gradeInfo.getId());
                classParam.setStatus(StatusEnum.ENABLE.code);
                List<ClassInfo> classList = classService.queryClassList(classParam);
                if(CollectionUtils.isEmpty(classList) || classList.size() > 1){
                    ExcelUtils.writeInTemplate("该班级不存在或存在一个以上相同班级", rowIndex, cellNum, sheet);
                    throw new BusinessException("【批量导入班级老师失败】第【" + (rowIndex + 1) + "】行,该班级不存在或存在一个以上相同班级");
                }
                ClassInfo existClass = classList.get(0);
                classTeacher.setClassId(existClass.getId());
                //校验老师
                StaffInfo staffParam = new StaffInfo();
                staffParam.setStatus(StatusEnum.ENABLE.code);
                staffParam.setSchoolId(schoolInfo.getId());
                staffParam.setMobile(staffInfo.getMobile());;
                staffParam.setName(staffInfo.getName());
                List<StaffInfo> userList = staffInfoService.queryBySelective(staffParam);
                if(CollectionUtils.isEmpty(userList)){
                    ExcelUtils.writeInTemplate("该老师不存在,请检查学校、老师基本信息是否正确", rowIndex, cellNum, sheet);
                    throw new BusinessException("【批量导入班级老师失败】第【" + (rowIndex + 1) + "】行,该老师不存在,请检查学校、老师基本信息是否正确");
                }
                classTeacher.setTeacherId(userList.get(0).getId());

                if(classTeacher.getIsHeadMaster() == FscConstant.YES
                        && existClass.getTeacherId() != null
                        && existClass.getTeacherId().compareTo(classTeacher.getTeacherId()) != 0){
                    ExcelUtils.writeInTemplate("该班级已经有班主任,请先移出", rowIndex, cellNum, sheet);
                    throw new BusinessException("【批量导入班级老师失败】第【" + (rowIndex + 1) + "】行,该班级已经有班主任,请先移出");
                }
                //校验excel数据是否重复
                String key = "" + classTeacher.getClassId() + classTeacher.getTeacherId();
                if(map.get(key) != null){
                    //excel存在相同身份证数据
                    ExcelUtils.writeInTemplate("excel数据与第【"+map.get(key)+"】行数据重复", rowIndex, cellNum, sheet);
                    throw new BusinessException("【批量导入班级老师失败】第【" + (rowIndex + 1) + "】行,excel数据与第【"+map.get(key)+"】行老师与班级重复");
                }
                map.put(key, rowIndex + 1);

                caseList.add(classTeacher);
            } catch (InvalidArgumentException | BusinessException e) {
                hasError = true;
                HelpUtils.log_error(getClass(), "{}", e.getMessage(), e);
            }catch (Exception e){
                hasError = true;
                HelpUtils.log_error(getClass(), "【批量导入班级老师失败】第【{}】行", (rowIndex + 1), e);
            }
        }
        if(hasError){
            ExcelUtils.writeInTemplate("失败原因", 0, cellNum, sheet);
            throw new ExcelParseErrorException("excel解析异常");
        }
        return caseList;
    }

4、前端逻辑处理,上传excel

<input type="file" name="file" id="batch_upload_class_teacher_file" onchange="batchUploadClassTeacher(this)" accept="application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" style="display: none">


function batchUploadClassTeacher(ele){
    batchUploadExcelFile(ele, 'sec/class/teacher/batchInsertByExcel');
}

function batchUploadExcelFile(ele,url){
    //excel格式验证
    if (!ele || !$(ele).val()){
        return;
    }
    var patn = /\.xls$|\.xlsx$/i;
    if (!patn.test($(ele).val())) {
        alert('提示:仅支持excel文件!');
        $(ele).val('');
        return;
    }
    if(url==undefined || url == ''){
        alert('提示:上传路径错误!');
        return;
    }
    showLoading();
    var elementIds = ele.name; //flag为name属性名
    $.ajaxFileUpload({
        url: webUrlPrefix + url,//上传的url,根据自己设置
        type: 'post',
        secureuri: false, //一般设置为false
        fileElementId: ele.id, // 上传文件的id、name属性名
        dataType: 'json', //返回值类型,一般设置为json、application/json
        elementIds: elementIds, //传递参数到服务器
        success: function (data, status) {
            console.log(data);
            if(data.status.error == 0){
                alert('批量导入数据成功');
                getAllClassInfoByPage(1);
            }else{
                alert(data.status.message);
            }
            hideLoading();
        },
        error: function (data, status, e) {
            alert("文件上传失败");
            hideLoading();
        }
    });
    hideLoading();
}

 

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

damoneric_guo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值