excel导入

Excel数据导入

使用easyexcel和hutool-poi实现excel导入

1、pom依赖

        <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.2.6</version></dependency><dependency><groupId>cn.hutool</groupId><artifactId>hutool-poi</artifactId><version>5.8.21</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.1.2</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>4.1.2</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml-schemas</artifactId><version>4.1.2</version></dependency>

2、导入流程描述

在这里插入图片描述

2.1、读取excel

读取excel中的源数据

2.2、数据校验
2.2.1 对源数据进行数据校验
2.2.2 将满足校验规则的数据放入normalList中
2.2.3 将不满足校验规则的数据放入errorList中
2.2.4 将最后的成功、失败数量结果放入importResult中
2.2.5 将校验结果返回给前端

将校验后的数据normalList、errorList、importResult返回给前端,如果存在错误数据(及errorList不为空)则提示用户更改,用户更改后重新对更改后的excel文件执行数据校验操作,直达所有的数据都是正确数据(及errorList为空)则执行数据入库操作

2.3 数据入库

将数据校验完成后的normalList拿到(此时的errorList一定是空的),直接进行入库操作,如果存在入库失败的数据则放入errorList中直接返给前端展示出来错误原因,不另外做其他操作

3、代码示例

3.1 excel导入返回VO
/*** @author: yc* @des:  excel导入vo* @date: 2024/07/17 20:57*/
@Data
public class ExcelImportVO {@ApiModelProperty("错误的数据")private List<?> errorList;@ApiModelProperty("正常的数据")private List<?> normalList;@ApiModelProperty("导入结果")private String importResult;}
3.2 用户导入模板
/*** @author: yc* @des:  用户导入模板* @date: 2024/07/18 13:35*/
@Data
public class UserImportTemplate {/*** 行号*/private Integer rowNumber;/*** 姓名*/@ExcelProperty("姓名")@ColumnWidth(20)private String realName;/*** 手机号*/@ExcelProperty("手机号")@ColumnWidth(20)private String mobile;/*** 组织名称*/@ExcelProperty("组织名称")@ColumnWidth(20)private String organizeName;private String organizeId;/*** 部门名称*/@ExcelProperty("部门名称")@ColumnWidth(20)private String departmentName;private String departmentId;/*** 校验信息*/private String verifyMsg;/*** @author: yc* @des:  校验* @date: 2024/07/18 14:00*/public void verify(List<BaseDepartment> departmenList, BaseDepartService baseDepartService){StringBuilder msg = new StringBuilder();// 姓名if(StringUtils.isBlank(this.realName)){msg.append("姓名不能为空");}// 手机号if(StringUtils.isBlank(this.mobile)){msg.append("姓名不能为空");}else{if (!Pattern.compile("^[1][3,4,5,7,8][0-9]{9}$").matcher(this.mobile).matches()) {msg.append("手机号不正确");}}// 组织名称if(StringUtils.isBlank(this.organizeName)){msg.append("组织名称不能为空");}// 部门名称if(StringUtils.isBlank(this.departmentName)){msg.append("部门名称不能为空");}else{BaseDepartment department = baseDepartService.getDepartmentByName(this.departmentName, departmenList);if(Objects.isNull(department)){msg.append("部门不存在");}else{this.departmentId = department.getDepartmentId();}}this.verifyMsg = msg.toString();}/*** @author: yc* @des:  模板转实体* @date: 2024/07/18 14:09*/public BaseUser template2entity(){BaseUser baseUser = new BaseUser();baseUser.setUserId(IdUtil.simpleUUID());baseUser.setAccount(this.mobile);baseUser.setPassword("8e00646ca539d84f41e085c6ee9a54ba");baseUser.setSecretkey("f240625eb8a38ae1");baseUser.setRealName(this.realName);baseUser.setMobile(this.mobile);baseUser.setOrganizeId(this.organizeId);baseUser.setDepartmentId(this.departmentId);baseUser.setDeleteMark(0);baseUser.setEnabledMark(1);baseUser.setModifyDate(new Date());baseUser.setCreateDate(new Date());return baseUser;}}
3.3 excel文件数据读取、校验
    /*** @author: yc* @des:  excel导入前检验* @date: 2024/07/18 10:56*/@Overridepublic Result<ExcelImportVO> excelImportVerify(MultipartFile file) {ExcelImportVO excelImportVO = new ExcelImportVO();if(Objects.isNull(file)){return Result.fail(ResultCode.GLOBAL_PARAM_ERROR.getCode(),"上传文件不能为空");}String fileName = file.getOriginalFilename();//文件名String name = fileName.substring(0,fileName.lastIndexOf("."));//文件类型String type = fileName.substring(fileName.lastIndexOf("."));if(StringUtils.isBlank(type) || (!type.equals(".xlsx") && !type.equals(".xls"))){return Result.fail(ResultCode.FAILURE.getCode(),"文件名格式不正确,请上传.xlsx或.xls文件");}//判断文件名长度是否小于3,解决 临时文件 too short问题fileName = name.length() <= 3 ? name + (new Random().nextInt(900)+100) + type : fileName;// 从excel中拿到数据List<UserImportTemplate> dataList = new ArrayList<>();try {ExcelReader excelReader = ExcelUtil.getReader(file.getInputStream());List<List<Object>> excelDataList = excelReader.read(1);if(CollectionUtils.isEmpty(excelDataList)){return Result.fail(ResultCode.FAILURE.getCode(),"无数据导入");}AtomicInteger rowNumber = new AtomicInteger(1);excelDataList.forEach(i -> {Object[] rowData = i.toArray(new Object[10]);UserImportTemplate template = new UserImportTemplate();template.setRealName(null == rowData[0] ? "" : String.valueOf(rowData[0]));template.setMobile(null == rowData[1] ? "" : String.valueOf(rowData[1]));template.setOrganizeName(null == rowData[2] ? "" : String.valueOf(rowData[2]));template.setDepartmentName(null == rowData[3] ? "" : String.valueOf(rowData[3]));template.setRowNumber(rowNumber.getAndAdd(1));dataList.add(template);});// 数据校验// 部门信息List<BaseDepartment> departmenList = baseDepartService.list();dataList.forEach(i -> {i.verify(departmenList,baseDepartService);});StringBuilder resultMsg = new StringBuilder();// 正常数据excelImportVO.setNormalList(dataList.stream().filter(i -> StringUtils.isBlank(i.getVerifyMsg())).collect(Collectors.toList()));// 错误数据excelImportVO.setErrorList(dataList.stream().filter(i -> StringUtils.isNotBlank(i.getVerifyMsg())).collect(Collectors.toList()));resultMsg.append("成功" + excelImportVO.getNormalList().size() + "条");if(!CollectionUtils.isEmpty(excelImportVO.getErrorList())){resultMsg.append(",失败" + excelImportVO.getErrorList().size() + "条");}excelImportVO.setImportResult(resultMsg.toString());} catch (Exception e) {return Result.fail(ResultCode.FAILURE.getCode(),e.getMessage());}return Result.data(excelImportVO);}
3.4 数据入库
    /*** @author: yc* @des:  excel导入* @date: 2024/07/18 10:57*/@Overridepublic Result<ExcelImportVO> excelImport(List<UserImportTemplate> successList) {ExcelImportVO excelImportVO = new ExcelImportVO();if(CollectionUtils.isEmpty(successList)){return Result.fail(ResultCode.FAILURE.getCode(),"导入数据不存在");}List<UserImportTemplate> errorList = new ArrayList<>();for(UserImportTemplate template : successList){try {super.save(template.template2entity());}catch (Exception e){template.setVerifyMsg("当前数据已存在");errorList.add(template);}}successList.removeAll(errorList);excelImportVO.setNormalList(successList);excelImportVO.setErrorList(errorList);StringBuilder resultMsg = new StringBuilder();resultMsg.append("成功" + excelImportVO.getNormalList().size() + "条");if(!CollectionUtils.isEmpty(excelImportVO.getErrorList())){resultMsg.append(",失败" + excelImportVO.getErrorList().size() + "条");}excelImportVO.setImportResult(resultMsg.toString());return Result.data(excelImportVO);}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/400887.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【笔记】Swin-Transformer 的计算量与Transformer的计算量的对比:前者通过使用新颖的窗口技巧,将后者的高阶项变为低阶,大大降低了计算量

补充1&#xff1a; 局部窗口内的自注意力&#xff08;W-MSA&#xff09;: 在 Swin Transformer 中&#xff0c;输入特征图被划分为多个小的窗口&#xff08;例如 7x7 的窗口&#xff09;。在每个窗口内&#xff0c;计算自注意力机制&#xff08;W-MSA, Window-based Multi-Head…

基于LQR算法的机器人轨迹跟踪控制详解

本文摘要 本文详细介绍了基于线性二次型调节器&#xff08;LQR&#xff09;算法的机器人轨迹跟踪控制方法。首先&#xff0c;文章通过建立基于运动学模型的离散状态方程&#xff0c;来描述机器人的当前状态与目标状态之间的关系&#xff0c;并利用此模型进行状态误差的计算。接…

「Unity3D」TextMeshPro-Text(UI)无法拖放到TextMeshPro的属性面板上

继承MonoBehaviour&#xff0c;然后定义public TextMeshPro textPro&#xff0c;属性面板上就会有TextMeshPro的拖放槽&#xff08;slot&#xff09;&#xff0c;以配置含有TextMeshPro的组件对象&#xff08;GameObject&#xff09;。 但此时会发现&#xff0c;含有TextMeshPr…

Linux10 三剑客 正则表达式

三剑客 grep 擅长过滤&#xff0c;按行过滤 首先要把多个虚拟机的网络改成一种形式 爆破攻击&#xff1a;‌爆破攻击是一种尝试通过穷举法&#xff08;即尝试所有可能的组合&#xff09;来破解密码或身份验证的方法。这种攻击通常用于尝试登录到系统、网络或应用程序&#…

C#方法

在 C&#xff03;中&#xff0c;方法的定义包括任意方法修饰符&#xff08;如方法的可访问性&#xff09;、返回值的类型&#xff0c; 然后依次是方法名、输入参数的列表&#xff08;用圆括号括起来&#xff09;和方法体&#xff08;用花括号括起来&#xff09;。 [修饰符] 返…

【昂贵的婚礼】

题目 代码 #include<bits/stdc.h> using namespace std; typedef pair<int, int> PII; #define x first #define y second const int N 110, M 10110; int h[N], e[M], ne[M], w[M], idx; bool st[N]; int n, m; int dist[N]; int tier[N]; void add(int a, int…

爬虫 Web Js 逆向:RPC 远程调用获取加密参数(1)WebSocket 协议介绍

RPC (Remote Procedure Call) 是远程调用的意思。 在 Js 逆向时&#xff0c;本地可以和浏览器以服务端和客户端的形式通过 WebSocket 协议进行 RPC 通信&#xff0c;这样可以直接调用浏览器中的一些函数方法&#xff0c;不必去在意函数具体的执行逻辑&#xff0c;可以省去大量…

超详细!!!electron-vite-vue开发桌面应用之Electron Forge打包项目(三)

云风网 云风笔记 云风知识库 electronforge可将前端静态页面打包成.exe、.deb和.rpm等&#xff0c;能适配各种平台 一、安装依赖 cd my-app npm install --save-dev electron-forge/cli npm exec --packageelectron-forge/cli -c "electron-forge import"安装后pack…

简化工作流连线以及让工作流易于操作的插件:rgthree-comfy与cg-use-everywhere

当我们想要在工作流中进行多种不同配置、功能模块&#xff0c;并在多种不同配置、功能模块间进行切换&#xff0c;每次可以执行不同配置、功能模块&#xff0c;用原来简单的连线方式连接各个节点时&#xff0c;除了连线会十分复杂外&#xff0c;要切换不同配置、功能模块&#…

直接插入排序(C语言)

一、图解 思想: 把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中&#xff0c;直到所有的记录插入完为 止&#xff0c;得到一个新的有序序列 。 当插入第i(i>1)个元素时&#xff0c;前面的array[0],array[1],…,array[i-1]已经排好序&#xff0c;此时…

【Java】如何使用jdbc连接并操作MySQL,一文读懂不迷路,小白也能轻松学会

JDBC的原理 JDBC&#xff08;Java Database Connectivity&#xff09;是Java提供的用于连接和操作数据库的API。它允许Java应用程序与各种数据库进行交互&#xff0c;以下是JDBC的基本原理&#xff1a; 驱动程序管理&#xff1a;JDBC使用不同的数据库驱动程序来连接不同类型的…

兼容并蓄,高效集成:EasyCVR视频综合接入能力助力多元化项目需求

随着视频技术的不断进步&#xff0c;视频监控、视频直播、执法记录仪、语音可视对讲、无人机等视频资源的应用场景日益丰富。这些视频资源不仅在数量上快速增长&#xff0c;而且在质量、格式、编码标准等方面也呈现出多样化的特点。因此&#xff0c;为了有效整合这些资源&#…

2024年06月 Python(二级)真题解析#中国电子学会#全国青少年软件编程等级考试

Python等级考试(1~6级)全部真题・点这里 一、单选题(共25题,共50分) 第1题 列表 fruit = [‘西瓜’, ‘菠萝’, ‘哈密瓜’, ‘葡萄’],以下哪个选项,可以获取列表最后一个元素?( ) A:fruit[len(fruit)] B:fruit[len(fruit) - 1] C:fruit[len(fruit) + 1] D:fr…

echarts学习:绘制地图

前言 经过之前一段时间的磨砺&#xff0c;我具备了基本的使用echarts绘制图表的能力。但是在最近这几个月里我接连遇到了几个棘手的任务&#xff0c;这大大的提升了我的echarts水平。其中我遇到的第一个高难度任务就是使用echarts绘制如下的地图&#xff1a; 简单的分析一下&a…

Android studio 引入Json文件

Xcode引入json文件非常简单&#xff0c;没想到Android Studio是有讲究的&#xff0c;必须指定位置。 跟 lib 同一级目录下 创建一个assets&#xff08;如果不存在就创建&#xff09; future: DefaultAssetBundle.of(context).loadString(assets/appcenter.json),针对我这个路…

使用Leaks定位iOS内存泄漏问题并解决

使用Leaks定位iOS内存泄漏问题并解决 前言 内存泄漏问题一直是程序开发中最令人头疼的问题&#xff0c;特别是C/C。虽然C/C在C11之后引入了许多新特性&#xff0c;包括智能指针&#xff0c;自动类型推导等&#xff0c;但C中动态内存的分配和释放仍然需要程序员来显式地进行。…

【网络协议】精讲TCP通信原理!

前言 TCP 把连接作为最基本的对象&#xff0c;每一条 TCP 连接都有两个端点&#xff0c;这种端点我们叫作套接字&#xff08;socket&#xff09;&#xff0c;它的定义为端口号拼接到 IP 地址即构成了套接字&#xff0c;例如&#xff0c;若 IP 地址为 192.3.4.16 而端口号为 80&…

CSS设置文本超出显示省略号

一、单行文本显示省略号 <div class"box"><p>测试文本测试文本测试文本测试文本测试文本测试文本测试文本测试文本测试文本测试文本测试文本测试文本测试文本测试文本测试文本测试文本测试文本测试文本测试文本测试文本测试文本测试文本测试文本测试文本…

C# 静态方法和实例方法

一、静态成员&#xff0c;实例成员&#xff0c;静态方法&#xff0c;实例方法 静态成员就是用static修饰的字段&#xff1b; 实例成员就是没有被static修饰的字段&#xff1b; 静态方法就是用static修饰的方法&#xff1b; 实例方法就是没有被static修饰的方法&#xff1b;…

无人机之如何避免飞行错误篇

在无人机飞行中&#xff0c;飞手可能会遇到各种问题&#xff0c;这些问题不仅会影响飞行效果&#xff0c;还可以带来安全隐患。以下是一些常见的错误及避免方法&#xff0c;帮助飞手提高飞行稳定性和安全性&#xff1a; 一、校准传感器 IMU&#xff08;惯性测量单位&#xff0…