当前位置: 首页 > 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;格式→大小对话框→取消勾选✔锁定…...

Vim 调用外部命令学习笔记

Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度​

一、引言&#xff1a;多云环境的技术复杂性本质​​ 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时&#xff0c;​​基础设施的技术债呈现指数级积累​​。网络连接、身份认证、成本管理这三大核心挑战相互嵌套&#xff1a;跨云网络构建数据…...

<6>-MySQL表的增删查改

目录 一&#xff0c;create&#xff08;创建表&#xff09; 二&#xff0c;retrieve&#xff08;查询表&#xff09; 1&#xff0c;select列 2&#xff0c;where条件 三&#xff0c;update&#xff08;更新表&#xff09; 四&#xff0c;delete&#xff08;删除表&#xf…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别

一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...

MongoDB学习和应用(高效的非关系型数据库)

一丶 MongoDB简介 对于社交类软件的功能&#xff0c;我们需要对它的功能特点进行分析&#xff1a; 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具&#xff1a; mysql&#xff1a;关系型数据库&am…...

测试markdown--肇兴

day1&#xff1a; 1、去程&#xff1a;7:04 --11:32高铁 高铁右转上售票大厅2楼&#xff0c;穿过候车厅下一楼&#xff0c;上大巴车 &#xffe5;10/人 **2、到达&#xff1a;**12点多到达寨子&#xff0c;买门票&#xff0c;美团/抖音&#xff1a;&#xffe5;78人 3、中饭&a…...

c++ 面试题(1)-----深度优先搜索(DFS)实现

操作系统&#xff1a;ubuntu22.04 IDE:Visual Studio Code 编程语言&#xff1a;C11 题目描述 地上有一个 m 行 n 列的方格&#xff0c;从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子&#xff0c;但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...

postgresql|数据库|只读用户的创建和删除(备忘)

CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...

ElasticSearch搜索引擎之倒排索引及其底层算法

文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...

云原生玩法三问:构建自定义开发环境

云原生玩法三问&#xff1a;构建自定义开发环境 引言 临时运维一个古董项目&#xff0c;无文档&#xff0c;无环境&#xff0c;无交接人&#xff0c;俗称三无。 运行设备的环境老&#xff0c;本地环境版本高&#xff0c;ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...