当前位置: 首页 > news >正文

SpringBoot中Excel表的导入、导出功能的实现

文章目录

  • 一、easyExcel简介
  • 二、Excel表的导出
    • 2.1 添加 Maven 依赖
    • 2.2 创建导出数据的实体类
    • 4. 编写导出接口
    • 5. 前端代码
    • 6. 实现效果
  • 三、excel表的导出
    • 1. Excel表导入的整体流程
      • 1.1 配置文件存储路径
    • 2. 前端实现
      • 2.1 文件上传组件
    • 2.2 文件上传逻辑
    • 3. 后端实现
      • 3.1 文件上传接口
    • 3.2 数据解析接口
    • 4. 实现效果

一、easyExcel简介

Excel表的导入导出有很多种方式,这里我们使用easyExel。EasyExcel 是阿里巴巴推出的一个处理 Excel 文件的库,特别适合大数据量的 Excel 文件操作,具有性能优越、内存占用小等特点。

二、Excel表的导出

集成 EasyExcel 到 Spring Boot 项目

2.1 添加 Maven 依赖

首先,在 pom.xml 中添加 EasyExcel 的依赖:

<dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.0.6</version> <!-- 版本号可以根据需要调整 -->
</dependency>

2.2 创建导出数据的实体类

根据需要创建实体类,使用@ExcelProperty注解标注实体类的字段,指定表头名称和列索引,EasyExcel 会根据这个类的字段和注解来生成 Excel 文件。

@Data
public class PersonVO {@ExcelProperty(value = "人员ID", index = 0)private Integer personId;@ExcelIgnoreprivate Integer communityId;@ExcelProperty(value = "单元名称", index = 2)private String termName;@ExcelProperty(value = "房号", index = 3)private String houseNo;@ExcelProperty(value = "姓名", index = 4)private String userName;@ExcelProperty(value = "性别", index = 5)private String sex;@ExcelProperty(value = "手机号", index = 6)private String mobile;@ExcelIgnoreprivate String faceUrl;@ExcelProperty(value = "居住性质", index = 7)private String personType;@ExcelIgnoreprivate Integer state;@ExcelIgnoreprivate String creater;@ExcelIgnoreprivate Date createTime;@ExcelProperty(value = "备注", index = 8)private String remark;@ExcelProperty(value = "社区名称", index = 1)private String communityName;
}

不需要导出的列使用@ExcelIgnore忽略

4. 编写导出接口

@RestController
public class ExcelController {@GetMapping("/exportExcel")public Result exportExcel(PersonListForm personListForm){//查询数据PageVO pageVO = this.personService.personList(personListForm);List<PersonVO> list = pageVO.getList();// 设置文件路径和文件名String path = "D:/community/excel_export/";String fileName = path + "personInfo_" + System.currentTimeMillis() + ".xlsx";// 使用 EasyExcel 导出数据EasyExcel.write(fileName, PersonVO.class).sheet("人员信息").doWrite(list);  // 直接写入数据return Result.ok().put("data", fileName);}
}

5. 前端代码

//导出按钮<el-form-item><el-button type="primary" icon="el-icon-download" @click="handleExcel">导出</el-button></el-form-item>handleExcel() {this.$confirm('是否确认导出所有数据项?').then(() => {exportExcel(this.listQuery).then(res => {const fileUrl = process.env.VUE_APP_BASE_API + '/sys/person/exportExcel?fileName=' + res.data;const link = document.createElement('a');link.href = fileUrl;link.download = res.data; // 下载文件的名称link.click();});}).catch(() => {});}

6. 实现效果

在这里插入图片描述

三、excel表的导出

1. Excel表导入的整体流程

前端部分:

  • 用户通过上传组件选择Excel文件。
  • 文件上传到后端服务器。
  • 后端返回文件路径或标识符。
  • 前端调用解析接口,将文件路径传递给后端。
  • 后端解析Excel文件,将数据保存到数据库。
  • 返回解析结果给前端,提示用户成功或失败信息。

后端部分:

  • 提供文件上传接口,接收Excel文件并保存到服务器。
  • 提供解析接口,读取Excel文件内容并处理数据。
  • 将解析的数据保存到数据库。
  • 返回解析结果。

1.1 配置文件存储路径

确保文件存储路径是动态配置的,避免硬编码。可以在application.yml中配置文件存储路径:

upload:excel: D:/community/upload/excel/

在代码中读取配置:

@Value("${upload.excel}")private String excel;

2. 前端实现

2.1 文件上传组件

使用Element UI的el-upload组件实现文件上传功能。

<template><el-dialog:title="'上传住户资料'":close-on-click-modal="false":visible.sync="visible"width="60%"><el-form label-width="100px" style="width:95%;" @keyup.enter.native="dataFormSubmit()"><el-row><el-col :span="24"><el-form-item label="导入住户资料"><el-uploadclass="avatar-uploader":headers="headers":action="uploadUrl":show-file-list="false":on-success="handleAvatarSuccess"name="uploadExcel":before-upload="beforeAvatarUpload"><i class="el-icon-plus avatar-uploader-icon"></i></el-upload></el-form-item></el-col><el-col :span="24"><el-form-item label="模板下载"><a :href="process.env.VUE_APP_BASE_API + '/community/upload/excel/personInfo.xls'" download>点击下载Excel模板</a></el-form-item></el-col><el-col :span="24"><span style="color:red" v-html="errorInfo" /></el-col></el-row></el-form><span slot="footer" class="dialog-footer"><el-button type="primary" @click="dataFormSubmit()">确 定</el-button></span></el-dialog>
</template>

2.2 文件上传逻辑

在beforeAvatarUpload方法中,限制文件类型和大小

beforeAvatarUpload(file) {this.errorInfo = '';const ext = file.name.substring(file.name.lastIndexOf('.') + 1).toLowerCase();const imgSize = file.size / 1024 / 1024 < 10;if (!['xls', 'xlsx'].includes(ext)) {this.$message.error('文件格式只能为xls或xlsx文件');return false;}if (!imgSize) {this.$message.error('文件大小不能超过10MB');return false;}return true;
}

在handleAvatarSuccess方法中,处理上传成功后的逻辑:

handleAvatarSuccess(response, file) {if (response && response.code === 200) {parsefile(response.data).then(res => {if (res && res.code === 200) {if (res.status === 'success') {this.errorInfo = res.data;this.$message.success('上传成功');} else {this.errorInfo = res.data;this.$message.error('上传失败');}} else {this.errorInfo = '解析文件失败';this.$message.error('解析文件失败');}}).catch(error => {console.error('解析文件失败', error);this.errorInfo = '解析文件失败';this.$message.error('解析文件失败');});} else {this.errorInfo = '文件上传失败';this.$message.error('文件上传失败');}
}

3. 后端实现

3.1 文件上传接口

接收上传的Excel文件,并保存到服务器的临时目录中:

@PostMapping("/excelUpload")
public Result excelUpload(@RequestParam("uploadExcel") MultipartFile file) throws Exception {if (file.getOriginalFilename().equals("")) {return Result.error("没有选中要上传的文件");} else {String picName = UUID.randomUUID().toString();String oriName = file.getOriginalFilename();String extName = oriName.substring(oriName.lastIndexOf("."));String newFileName = picName + extName;File targetFile = new File(excel, newFileName);// 保存文件file.transferTo(targetFile);return Result.ok().put("data", newFileName);}
}

3.2 数据解析接口

读取Excel文件内容,解析数据并保存到数据库:

@LogAnnotation("导入数据")
@PostMapping("/parsefile/{fileName}")
public Result parsefile(@PathVariable("fileName") String fileName, HttpSession session) {User user = (User) session.getAttribute("user");try {String basePath = excel + fileName;List<ExcelVo> dataList = EasyExcel.read(new File(basePath), ExcelVo.class).sheet().doReadSync();for (ExcelVo vo : dataList) {Person single = new Person();single.setPersonId(0);single.setState(1);single.setFaceUrl("");single.setCommunityId(vo.getCommunityId());single.setTermName(vo.getTermName());single.setHouseNo(vo.getHouseNo());single.setUserName(vo.getUserName());single.setSex(vo.getSex());single.setMobile(vo.getMobile());single.setPersonType(vo.getPersonType());single.setRemark(vo.getRemark());single.setCreater(user.getUsername());this.personService.save(single);}return Result.ok().put("status", "success").put("data", "数据导入完成!");} catch (Exception e) {e.printStackTrace();return Result.error().put("status", "fail").put("data", "解析文件失败:" + e.getMessage());}
}

4. 实现效果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

相关文章:

SpringBoot中Excel表的导入、导出功能的实现

文章目录 一、easyExcel简介二、Excel表的导出2.1 添加 Maven 依赖2.2 创建导出数据的实体类4. 编写导出接口5. 前端代码6. 实现效果 三、excel表的导出1. Excel表导入的整体流程1.1 配置文件存储路径 2. 前端实现2.1 文件上传组件 2.2 文件上传逻辑3. 后端实现3.1 文件上传接口…...

Spark入门(Python)

目录 一、安装Spark 二、Spark基本操作 一、安装Spark pip3 install pyspark 二、Spark基本操作 # 导入spark的SparkContext,SparkConf模块 from pyspark import SparkContext, SparkConf # 导入os模块 import os # 设置PYSPARK的python环境 os.environ[PYSPARK_PYTHON] &…...

Daemon进程创建过程

Daemon创建过程&#xff1a; 1、fork&#xff0c;创建子进程。退出父进程。 2、setsid&#xff0c;创建新会话。脱离原会话、进程组、控制终端。 再次fork&#xff0c;与终端完全脱离。第二次fork的意义&#xff1f;&#xff1f;&#xff1f;&#xff1f; 先脱离原父进程&#…...

在sortablejs的拖拽排序情况下阻止input拖拽事件

如题 问题 在vue3的elementPlus的table中&#xff0c;通过sortablejs添加了行拖拽功能&#xff0c;但是在行内会有输入框&#xff0c;此时拖拽输入框会触发sortablejs的拖拽功能 解决 基于这个现象&#xff0c;我怀疑是由于拖拽事件未绑定而冒泡到后面的行上从而导致的拖拽…...

C++初阶—string类

第一章&#xff1a;为什么要学习string类 1.1 C语言中的字符串 C语言中&#xff0c;字符串是以\0结尾的一些字符的集合&#xff0c;为了操作方便&#xff0c;C标准库中提供了一些str系列的库函数&#xff0c;但是这些库函数与字符串是分离开的&#xff0c;不太符合OOP的思想&…...

C# 提取PDF表单数据

目录 使用工具 C# 提取多个PDF表单域的数据 C# 提取特定PDF表单域的数据 PDF表单是一种常见的数据收集工具&#xff0c;广泛应用于调查问卷、业务合同等场景。凭借出色的跨平台兼容性和标准化特点&#xff0c;PDF表单在各行各业中得到了广泛应用。然而&#xff0c;当需要整合…...

算法刷题Day28:BM66 最长公共子串

题目链接&#xff0c;点击跳转 题目描述&#xff1a; 解题思路&#xff1a; 方法一&#xff1a;暴力枚举 遍历str1的每个字符x&#xff0c;并在str2中寻找以相同元素x为起始的最长字符串。记录最长的公共子串及其长度。 代码实现&#xff1a; def LCS(self, str1: str, st…...

论文阅读笔记:MambaOut: Do We Really Need Mamba for Vision?

论文阅读笔记&#xff1a;MambaOut: Do We Really Need Mamba for Vision? 1 背景2 创新点3 方法4 模块4.1 Mamba适合什么任务4.2 视觉识别任务是否有很长的序列4.3 视觉任务是否需要因果token混合模式4.4 关于Mamba对于视觉的必要性假设 5 效果 论文&#xff1a;https://arxi…...

HarmonyOS:ForEach:循环渲染

一、前言 ForEach接口基于数组类型数据来进行循环渲染&#xff0c;需要与容器组件配合使用&#xff0c;且接口返回的组件应当是允许包含在ForEach父容器组件中的子组件。例如&#xff0c;ListItem组件要求ForEach的父容器组件必须为List组件。 API参数说明见&#xff1a;ForEa…...

Python3 【函数】项目实战:5 个新颖的学习案例

Python3 【函数】项目实战&#xff1a;5 个新颖的学习案例 本文包含5编程学习案例&#xff0c;具体项目如下&#xff1a; 简易聊天机器人待办事项提醒器密码生成器简易文本分析工具简易文件加密解密工具 项目 1&#xff1a;简易聊天机器人 功能描述&#xff1a; 实现一个简易…...

XSS 漏洞全面解析:原理、危害与防范

目录 前言​编辑 漏洞原理 XSS 漏洞的危害 检测 XSS 漏洞的方法 防范 XSS 漏洞的措施 前言 在网络安全的复杂版图中&#xff0c;XSS 漏洞&#xff0c;即跨站脚本攻击&#xff08;Cross - Site Scripting&#xff09;&#xff0c;是一类极为普遍且威胁巨大的安全隐患。随着互…...

从 GShard 到 DeepSeek-V3:回顾 MoE 大模型负载均衡策略演进

作者&#xff1a;小天狼星不来客 原文&#xff1a;https://zhuanlan.zhihu.com/p/19117825360 故事要从 GShard 说起——当时&#xff0c;人们意识到拥有数十亿甚至数万亿参数的模型可以通过某种形式的“稀疏化&#xff08;sparsified&#xff09;”来在保持高精度的同时加速训…...

【回溯+剪枝】回溯算法的概念 全排列问题

文章目录 46. 全排列Ⅰ. 什么是回溯算法❓❓❓Ⅱ. 回溯算法的应用1、组合问题2、排列问题3、子集问题 Ⅲ. 解题思路&#xff1a;回溯 剪枝 46. 全排列 46. 全排列 ​ 给定一个不含重复数字的数组 nums &#xff0c;返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。 …...

Flutter解决macbook M芯片Android Studio中不显示IOS真机的问题

下载了最新的Android Studio LadyBug 下载了最新的xcode16.2 结果&#xff0c;只有安卓真机才在Android studio显示&#xff0c; IOS真机只在xcode显示 IOS真机不在android studio显示。 解决方法是&#xff1a; 在终端运行如下命令&#xff1a; sudo xcode-select -s /Applic…...

自签证书的dockerfile中from命令无法拉取镜像而docker的pull命令能拉取镜像

问题现象&#xff1a; docker pull images拉取镜像正常 dockerfile中的from命令拉取镜像就会报出证书错误。报错信息如下&#xff1a; [bjxtbwj-kvm-test-jenkins-6-243 ceshi_dockerfile]$ docker build . [] Building 0.4s (3/3) FINISHED …...

【MySQL】--- 复合查询 内外连接

Welcome to 9ilks Code World (๑•́ ₃ •̀๑) 个人主页: 9ilk (๑•́ ₃ •̀๑) 文章专栏&#xff1a; MySQL &#x1f3e0; 基本查询回顾 假设有以下表结构&#xff1a; 查询工资高于500或岗位为MANAGER的雇员&#xff0c;同时还要满足他们的姓名首字母为…...

QT TLS initialization failed

qt使用QNetworkAccessManager下载文件&#xff08;给出的链接可以在浏览器里面下载文件&#xff09;&#xff0c;下载失败&#xff0c; 提示“TLS initialization failed”通常是由于Qt在使用HTTPS进行文件下载时&#xff0c;未能正确初始化TLS&#xff08;安全传输层协议&…...

系统学英语 — 句法 — 复合句

目录 文章目录 目录复合句型主语从句宾语从句表语从句定语从句状语从句同位语从句 复合句型 复合句型&#xff0c;即&#xff1a;从句。在英语中&#xff0c;除了谓语之外的所有句子成分都可以使用从句来充当。 主语从句 充当主语的句子&#xff0c;通常位于谓语之前&#x…...

指针的介绍2前

1.数组名的理解 #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h>int main() {int arr[] { 1,2,3,4,5,6,7,8,9 };printf("&arr[0] %p\n", &arr[0]);printf("arr %p\n", arr);return 0; } 观察得到&#xff0c;数组名就是数组首…...

16.Word:石油化工设备技术❗【28】

目录 题目 NO1.2 NO3 NO4 题目 NO1.2 F12&#xff1a;另存为将“Word素材.docx”文件另存为“Word. docx”&#xff08;“docx”为文件扩展名&#xff09; 光标来到表格上方→插入→形状→新建画布→单击选中→格式→高度/宽度&#xff08;格式→大小对话框→取消勾选✔锁定…...

Python-基础环境(01) 虚拟环境,Python 基础环境之虚拟环境,一篇文章助你完全搞懂!

Python的虚拟环境是一种工具&#xff0c;它能够创建一个隔离的独立Python环境。每个虚拟环境都有自己独立的Python解释器和安装的包&#xff0c;不会与其他虚拟环境或系统的全局Python环境发生冲突。虚拟环境特别适用于以下情况&#xff1a; 项目隔离&#xff1a;不同的项目可…...

Dest1ny漏洞库:用友 U8-CRM 系统 ajaxgetborrowdata.php 存在 SQL 注入漏洞

用友U8-CRM系统ajaxgetborrowdata.php存在SQL注入漏洞&#xff0c;文件多个方法存在SQL注入漏洞&#xff0c;未经身份验证的攻击者通过漏洞执行任意SQL语句&#xff0c;调用xp_cmdshell写入后门文件&#xff0c;执行任意代码&#xff0c;从而获取到服务器权限。 hunter app.n…...

java.sql.Date 弃用分析与替代方案

引言 java.sql.Date 是 Java 标准库中的一个类&#xff0c;它继承自 java.util.Date&#xff0c;主要用于在 Java 应用程序与数据库之间进行日期数据的传输。然而&#xff0c;随着 Java 语言的发展&#xff0c;java.sql.Date 以及其父类 java.util.Date 逐渐被认为存在设计缺陷…...

HarmonyOS:状态管理最佳实践

一、概述 在声明式UI编程范式中&#xff0c;UI是应用程序状态的函数&#xff0c;应用程序状态的修改会更新相应的UI界面。ArkUI采用了MVVM模式&#xff0c;其中ViewModel将数据与视图绑定在一起&#xff0c;更新数据的时候直接更新视图。如下图所示&#xff1a; ArkUI的MVVM模式…...

如何提高新产品研发效率

优化研发流程、采用先进工具、提升团队协作、持续学习与改进&#xff0c;是提高新产品研发效率的关键。其中&#xff0c;优化研发流程尤为重要。通过简化流程&#xff0c;减少不必要的环节和复杂性&#xff0c;企业可以显著提升研发效率。例如&#xff0c;采用自动化测试工具和…...

MongoDB平替数据库对比

背景 项目一直是与实时在线监测相关&#xff0c;特点数据量大&#xff0c;读写操作大&#xff0c;所以选用的是MongoDB。但按趋势来讲&#xff0c;需要有一款国产数据库可替代&#xff0c;实现信创要求。选型对比如下 1. IoTDB 这款是由清华大学主导的开源时序数据库&#x…...

JavaScript系列(46)-- WebGL图形编程详解

JavaScript WebGL图形编程详解 &#x1f3a8; 今天&#xff0c;让我们深入探讨JavaScript的WebGL图形编程。WebGL是一种基于OpenGL ES的JavaScript API&#xff0c;它允许我们在浏览器中渲染高性能的2D和3D图形。 WebGL基础概念 &#x1f31f; &#x1f4a1; 小知识&#xff…...

YOLO目标检测4

一. 参考资料 《YOLO目标检测》 by 杨建华博士 本篇文章的主要内容来自于这本书&#xff0c;只是作为学习记录进行分享。 二. 环境搭建 (1) ubuntu20.04 anaconda安装方法 (2) 搭建yolo训练环境 # 首先&#xff0c;我们建议使用Anaconda来创建一个conda的虚拟环境 conda cre…...

十三先天记

没有一刻&#xff0c;只有当下在我心里。我像星星之间的空间一样空虚。他们是我看到的第一件事&#xff0c;我知道的第一件事。 在接下来的时间里&#xff0c;我意识到我是谁&#xff0c;我是谁。我知道星星在我上方&#xff0c;星球的固体金属体在我脚下。这个支持我的世界是泰…...

【论文阅读笔记】“万字”关于深度学习的图像和视频阴影检测、去除和生成的综述笔记 | 2024.9.3

论文“Unveiling Deep Shadows: A Survey on Image and Video Shadow Detection, Removal, and Generation in the Era of Deep Learning”内容包含第1节简介、第2-5节分别对阴影检测、实例阴影检测、阴影去除和阴影生成进行了全面的综述。第6节深入讨论了阴影分析&#xff0…...