记录工作

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

@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 导入Excel数据校验判断哪行那列的更多相关文章

  1. java导入Excel表格数据

    首先导入Excel数据需要几样东西 第一需要两个依赖包,这里直接是在pom注入依赖 <!--excel--> <dependency> <groupId>org.a ...

  2. Java实现Excel数据批量导入数据库

    Java实现Excel数据批量导入数据库 概述: 这个小工具类是工作中的一个小插曲哦,因为提数的时候需要跨数据库导数... 有的是需要从oracle导入mysql ,有的是从mysql导入oracle ...

  3. 结合bootstrap fileinput插件和Bootstrap-table表格插件,实现文件上传、预览、提交的导入Excel数据操作流程

    1.bootstrap-fileinpu的简单介绍 在前面的随笔,我介绍了Bootstrap-table表格插件的具体项目应用过程,本篇随笔介绍另外一个Bootstrap FieInput插件的使用, ...

  4. 基于 Aspose.Cells与XML导入excel 数据----操作类封装

    前言 导入excel数据, 在每个项目中基本上都会遇到,第三方插件或者基于微软office,用的最多的就是npoi,aspose.cells和c#基于office这三种方式,其中各有各的优缺点,在这也 ...

  5. java实现Excel数据导出

    java实现Excel数据导出: 目前,比较常用的实现Java导入.导出Excel的技术有两种Jakarta POI和Java Excel Jakarta POI 是一套用于访问微软格式文档的Java ...

  6. thinkphp整合系列之phpexcel导入excel数据

    一:导入phpexcel /ThinkPHP/Library/Vendor/PHPExcel 二:导入excel的函数 /** * 导入excel文件 * @param string $file ex ...

  7. springboot批量导入excel数据

    1 背景 小白今天闲着没事,在公司摸鱼,以为今天有事无聊的一天,突然上头说小子,今天实现一下批量导入Excel数据吧,当时我的内心是拒绝的,然后默默打开idea. 2 介绍 2.1 框架 java本身 ...

  8. PowerBuilder学习笔记之导入Excel数据

    原文地址:http://blog.chinaunix.net/uid-20586802-id-3235549.html /*****************简单的导入功能,涉及到数据类型判断***** ...

  9. PLSQL Developer导入Excel数据

    LSQL Developer导入Excel数据 最近处理将Excel数据导入Oracle的工作比较多.之前都是采用Sqlldr命令行导入的方式处理.每次导入不同格式的Excel表数据,都需要先把Exc ...

  10. 导入excel数据

    前提条件:先要安装好EXCEL软件. 程序中经常要用到导入excel数据的功能.其实通过ole操作excel就简单的几行代码,但记性不好,经常要用经常要找, 还是作篇笔记吧. var ExcelApp ...

随机推荐

  1. dinic及当前弧优化

    网络流 dinic及当前弧优化 前言 dinic比较适合学习完km之后再学习.因为dinic感觉像是km的一种优化.总之难度不是特别大 dinic算法 好了,言归正传.先分析一下km为什么效率低下?因 ...

  2. 轻松解决 CSS 代码都在一行的问题

    前言 最近在做博客园的界面美化,用的是博客园[guangzan]的开源项目,配置超级简单,只需要复制粘贴代码就好啦. 但在粘贴 CSS 代码时遇到一个问题,那就是所有代码都挤在了一行,没有一点排板的样 ...

  3. Unity - 自定义Log

    嗨,崽崽们大家好.实在是不知道写个啥了,最近总是恍惚,今儿偷个懒吧,给大家推荐一个小黑自己写的小型日志工具,在一些小项目中管够使用了. 那有人会问了,Unity不是自带日志么,为什么还要自己做个小工具 ...

  4. springcloud 08 Hystrix图形化DashBoard

    #1.构建一个服务监控模块 ##1.1创建模块cloud-consumer-hystrix-dashboard9001 ##1.2pom文件依赖 <dependencies> <!- ...

  5. JAVA虚拟机05-内存溢出示例(jdk1.8)

    1.JAVA虚拟机堆内存溢出OutOfMemoryError 1.1设置参数 -Xms20m -Xmx20m -XX:+HeapDumpOnOutOfMemoryError 最小堆的大小20m 最大堆 ...

  6. WPF跨平台方案?

    Avalonia XPF 通过我们的跨平台UI框架,释放现有WPF应用程序的全部潜力,使WPF应用程序能够在macOS和Linux上运行,而不需要昂贵和有风险的重写. 工作原理 我们使用 Fork o ...

  7. 【DS】1.2

    top-iron man   算法 效率度量 时间T=T(n) 1.顺序忽略2.只选一个基本操作分析3.多层嵌套只考虑最深的循环循环了几次  test1: test2: 空间   原地工作:算法所需内 ...

  8. 还不来了解ChatGPT?免费账号

      可以查看这里给大家提供了一些免费的账号供大家尝试 note.youdao.com/s/OvxaLZiF   ChatGPT作为最近火遍互联网的AI项目,获得了大家空前的关注,短短两个多月注册人数破 ...

  9. P33_小程序的页面配置

    页面配置 页面配置文件的作用 小程序中,每个页面都有自己的 .json 配置文件,用来对当前页面的窗口外观.页面效果等进行配置. 页面配置和全局配置的关系 小程序中,app.json 中的 windo ...

  10. 学习Java Day17

    今天继续加强了一下类的联系,并学习了如何生成随机数