首页 > 编程语言 >java 导入Excel数据校验判断哪行那列

java 导入Excel数据校验判断哪行那列

时间:2022-12-13 16:12:09浏览次数:41  
标签:java String AssertBiz excel 哪行 表第 new 那列 row

记录工作

需求是导入数据的时候需要判断哪一行是空行,或者哪一行超过限制字符,然后返回给前端做展示

@PostMapping("/importExcel")
    @ApiOperation("导入用户")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "file", value = "Excel 文件", required = true, dataTypeClass = MultipartFile.class),
            @ApiImplicitParam(name = "updateSupport", value = "是否支持更新,默认为 false", example = "true", dataTypeClass = Boolean.class)
    })
    public Response<SaveAndUpdateVO> importExcel(@RequestParam("file") MultipartFile file,
                                                           @RequestParam(value = "updateSupport", required = false, defaultValue = "false") Boolean updateSupport) throws Exception {
        SaveAndUpdateVO saveAndUpdateVO = SaveAndUpdateVO.builder()
                .isSuccess(sysUserService.importUsers(file, updateSupport)).build();
        return Response.build(saveAndUpdateVO);
    }

这里的Response类是自己做的统一返回封装类,SaveAndUpdateVO这个类也是一个返回类,可以自己用其他方法或者类代替

public Boolean importUsers(MultipartFile file, boolean isUpdateSupport) {
        if (file.isEmpty()) {
            throw new BizException(ErrorCode.DATA_ERROR, "导入用户数据不能为空!");
        }

        List<UserImportExcelResponse> userImportExcelResponses = importUsers(file);
        userImportExcelResponses.forEach(importUser -> {

            SysUser sysUsers = getOne(new LambdaQueryWrapper<SysUser>().eq(SysUser::getLoginName, importUser.getLoginName())
                    .eq(SysUser::getDelFlag, Constants.DEL_FLAG_DELETED));
            // 判断用户如果不存在,在进行插入
            if (sysUsers == null) {
                AssertBiz.isMobile(importUser.getPhone(), "手机号码格式错误!");
                SysUser sysUser = new SysUser();
                BeanUtil.copyProperties(importUser, sysUser);
                //设置创建时间
                sysUser.setServerCreateTime(LocalDateTime.now());
                //设置默认密码密码
                BCryptPasswordEncoder bCryptPasswordEncoder = new BCryptPasswordEncoder();
                sysUser.setPassword(bCryptPasswordEncoder.encode("Admin@123456"));
                //设置主键id-uuid
                String userId = IdUtils.getId();
                sysUser.setId(userId);
                sysUser.setDelFlag(Constants.DEL_FLAG_DELETED);
                //新增用户
                save(sysUser);
                AssertBiz.isNotEmpty(importUser.getRoleName(), "角色名称不能为空!");
                SysRole sysRoles = sysRoleService.getOne(new LambdaQueryWrapper<SysRole>().eq(SysRole::getRoleName, importUser.getRoleName())
                        .eq(SysRole::getDelFlag, Constants.DEL_FLAG_DELETED));
                AssertBiz.notNull(sysRoles, "该角色不存在!");
                //新增用户角色
                SysUserRole sysUserRole = new SysUserRole(userId, sysRoles.getId(), LocalDateTime.now(), LocalDateTime.now(), Constants.DEL_FLAG_DELETED);
                sysUserRoleService.save(sysUserRole);
                AssertBiz.isNotEmpty(importUser.getOrgName(), "部门名称不能为空!");
                SysOrganization one = sysOrganizationService.getOne(new LambdaQueryWrapper<SysOrganization>().select(SysOrganization::getId)
                        .eq(SysOrganization::getOrgName, importUser.getOrgName())
                        .eq(SysOrganization::getDelFlag, Constants.DEL_FLAG_DELETED));
                AssertBiz.notNull(one, "该部门不存在!或是用户没有该部门权限!");
                //新增用户组织
                SysUserOrg sysUserOrg = new SysUserOrg(userId, one.getId(), LocalDateTime.now(), LocalDateTime.now(), Constants.DEL_FLAG_DELETED);
                sysUserOrgService.save(sysUserOrg);
                return;
            }
            // 如果存在,判断是否允许更新
            if (!isUpdateSupport) {
                throw new BizException(ErrorCode.DATA_ERROR, "用户账号[" + importUser.getLoginName() + "]已存在,不能重复添加!");
            }
            AssertBiz.isNotEmpty(sysUsers.getId(), "用户id不能为空!");
            LambdaUpdateWrapper<SysUser> updateWrapper = new LambdaUpdateWrapper<>();
            updateWrapper.eq(SysUser::getId, sysUsers.getId())
                    .set(SysUser::getStatus, importUser.getStatus())
                    .set(SysUser::getUserName, importUser.getUserName())
                    .set(SysUser::getPhone, importUser.getPhone())
                    .set(SysUser::getServerUpdateTime, LocalDateTime.now());
            update(updateWrapper);
        });
        return true;
    }
/**
     * 导入数据解析校验
     *
     * @param file
     * @return
     */
    private List<UserImportExcelResponse> importUsers(MultipartFile file) {
        List<UserImportExcelResponse> list = new ArrayList<>();
        try {
            //根据路径获取这个操作excel的实例
            XSSFWorkbook wb = new XSSFWorkbook(file.getInputStream());
            //根据页面index 获取sheet页
            XSSFSheet sheet = wb.getSheetAt(0);
            XSSFRow row;
            int sheets = sheet.getPhysicalNumberOfRows();
            //循环sesheet页中数据从第二行开始,第一行是标题
            for (int i = 1; i < sheets; i++) {
                //获取每一行数据
                row = sheet.getRow(i);
                String loginName = row.getCell(0).toString();
                String userName = row.getCell(1).toString();
                String roleName = row.getCell(2).toString();
                String orgName = row.getCell(3).toString();
                String phone = row.getCell(4).toString();
                String status = row.getCell(5).toString();
                int line = i + 1;
                checkLength(loginName, userName, roleName, orgName, phone, line);
                UserImportExcelResponse excel = new UserImportExcelResponse();
                AssertBiz.isNotEmpty(loginName, "在excel表第" + line + "行,第1列,用户登录名不能为空!");
                excel.setLoginName(loginName);
                AssertBiz.isNotEmpty(userName, "在excel表第" + line + "行,第2列,用户名称不能为空!");
                excel.setUserName(userName);
                AssertBiz.isNotEmpty(roleName, "在excel表第" + line + "行,第3列,角色名称不能为空!");
                excel.setRoleName(roleName);
                AssertBiz.isNotEmpty(orgName, "在excel表第" + line + "行,第4列,部门名称不能为空!");
                excel.setOrgName(orgName);
                AssertBiz.isNotEmpty(phone, "在excel表第" + line + "行,第5列,电话不能为空!");
                excel.setPhone(phone);
                AssertBiz.isNotEmpty(status, "在excel表第" + line + "行,第6列,用户状态不能为空!");
                excel.setStatus(status);
                list.add(excel);
            }
        } catch (Exception e) {
            e.printStackTrace();
            String substring = String.valueOf(e).substring(String.valueOf(e).indexOf(":") + 1);
            throw new BizException(ErrorCode.DATA_ERROR, substring);
        }
        return list;
    }
/**
     * 校验字符串长度
     *
     * @param loginName
     * @param userName
     * @param roleName
     * @param orgName
     * @param phone
     */
    private void checkLength(String loginName, String userName, String roleName, String orgName, String phone, int row) {
        int loginNameLength = loginName.length();
        int userNameLength = userName.length();
        int roleNameLength = roleName.length();
        int orgNameLength = orgName.length();
        int phoneLength = phone.length();

        if (loginNameLength > 16) {
            throw new BizException(ErrorCode.DATA_ERROR, "在excel表第" + row + "行,第1列,导入用户登录名不能超过16个字符!");
        }
        if (userNameLength > 16) {
            throw new BizException(ErrorCode.DATA_ERROR, "在excel表第" + row + "行,第2列,导入用户昵称名不能超过16个字符!");
        }
        if (roleNameLength > 16) {
            throw new BizException(ErrorCode.DATA_ERROR, "在excel表第" + row + "行,第3列,导入角色名不能超过16个字符!");
        }
        if (orgNameLength > 16) {
            throw new BizException(ErrorCode.DATA_ERROR, "在excel表第" + row + "行,第4列,导入部门名不能超过16个字符!");
        }
        if (phoneLength > 11) {
            throw new BizException(ErrorCode.DATA_ERROR, "在excel表第" + row + "行,第5列,电话格式不正确!");
        }
        if (phoneLength < 11) {
            throw new BizException(ErrorCode.DATA_ERROR, "在excel表第" + row + "行,第5列,电话格式不正确!");
        }
    }

到此本文就结束了

标签:java,String,AssertBiz,excel,哪行,表第,new,那列,row
From: https://www.cnblogs.com/Dshzs17/p/16979086.html

相关文章

  • java基础
    变量//byte表示数据类型,b表示变量名称,=表示赋值(把等号后面的值赋值给等号前面的变量b)byteb=2;b=3;//再次使用=号操作变量时,变量会被重新赋值System.out.println(b);/......
  • Java:Should I use a `HashSet` or a `TreeSet` for a very large dataset?
    这是StackOverflow上一个有意思的提问,记录一下。原地址在这翻译:对于大型数据集,应该使用”哈希集”还是”树集”?(因为HashTable有着O(1)的查找速度比树结构更有效率,虽然H......
  • 【校招VIP】线上实习 推电影 电影详情模块 Java代码周最佳
    【推电影】主要是为校招设计的年青人电影推荐平台项目,每个模块都具有亮点和难点,项目表现为手机网站应用,可嵌入小程序或APP中。恭喜来自东华理工大学的乌托邦同学获得本周......
  • javascript如何获取对象的key和value
    1、获取key值获取对象所有key的方法,需要使用Object.keys(obj)方法,Object.keys(obj)方返回一个数组,这个数组包含obj对象中的所有key。其中obj就是你写的对象,具体使用方......
  • Java开发如何通过IoT边缘ModuleSDK进行协议转换?
    摘要:使用ModuleSDK开发插件应用,接入其他协议设备(如HTTP请求数据),将其他协议的数据转化为MQTT协议JSON数据上报到IoTDA。本文分享自华为云社区《【华为云IoTEdge开发实战】J......
  • Java中double保留2位小数(精度丢失)的两种方式
    Java中double保留2位小数(精度丢失)的两种方式在我们日常开发中,使用double数据类型进行计算,偶尔会出现精度丢失的情况,例如实际结果是0.75,就可能出现0.7500000000000001或0......
  • HTML转图片-JAVA
    依赖组件<dependency> <groupId>gui.ava</groupId> <artifactId>html2image</artifactId> <version>0.9</version></dependency>示例HtmlImageGeneratorgenerator......
  • Effective Java-2. 当构造方法参数过多时使用builder模式
    背景静态工厂和构造方法不能很好的拓展到很多可选参数的场景,因为参数过多的时候,调用其构造方法不太能知道每个位置参数的含义,容易出bug那么为这个类编写什么样下的构造方......
  • Effective Java-1.考虑使用静态工厂方法代替构造方法
    静态工厂方法的优点不像构造方法,静态工厂是有名字的精心构造的名称使得静态工厂方法更容易使用和理解,即知道创建的是什么对象与构造方法不同,不用每次都创建一个新的......
  • javascript中setInterval越来越快的问题解决方法
    vartimerfunctionrun(){ //clearInterval要放在方法开始,不然的话,下面的代码还没运行到clearInterval,又开始了循环了。if(timer){clearInter......