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

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 文件上传接口…...

JavaScript前后端交互-AJAX/fetch

摘自千峰教育kerwin的js教程 AJAX 1、AJAX 的优势 不需要插件的支持&#xff0c;原生 js 就可以使用用户体验好&#xff08;不需要刷新页面就可以更新数据&#xff09;减轻服务端和带宽的负担缺点&#xff1a; 搜索引擎的支持度不够&#xff0c;因为数据都不在页面上&#xf…...

动态规划DP 背包问题 完全背包问题(题目分析+C++完整代码)

概览检索 动态规划DP 概览&#xff08;点击链接跳转&#xff09; 动态规划DP 背包问题 概览&#xff08;点击链接跳转&#xff09; 完全背包问题 原题链接 AcWiing 3. 完全背包问题 题目描述 有 N种物品和一个容量是 V的背包&#xff0c;每种物品都有无限件可用。 第 i种物…...

【cocos creator】【模拟经营】餐厅经营demo

下载&#xff1a;【cocos creator】模拟经营餐厅经营...

JavaScript系列(52)--编译优化技术详解

JavaScript编译优化技术详解 &#x1f680; 今天&#xff0c;让我们深入探讨JavaScript的编译优化技术。通过理解和应用这些技术&#xff0c;我们可以显著提升JavaScript代码的执行效率。 编译优化基础概念 &#x1f31f; &#x1f4a1; 小知识&#xff1a;JavaScript引擎通常…...

【深度学习】softmax回归的从零开始实现

softmax回归的从零开始实现 (就像我们从零开始实现线性回归一样&#xff0c;)我们认为softmax回归也是重要的基础&#xff0c;因此(应该知道实现softmax回归的细节)。 本节我们将使用Fashion-MNIST数据集&#xff0c;并设置数据迭代器的批量大小为256。 import torch from IP…...

【Redis】set 和 zset 类型的介绍和常用命令

1. set 1.1 介绍 set 类型和 list 不同的是&#xff0c;存储的元素是无序的&#xff0c;并且元素不允许重复&#xff0c;Redis 除了支持集合内的增删查改操作&#xff0c;还支持多个集合取交集&#xff0c;并集&#xff0c;差集 1.2 常用命令 命令 介绍 时间复杂度 sadd …...

程序诗篇里的灵动笔触:指针绘就数据的梦幻蓝图<3>

大家好啊&#xff0c;我是小象٩(๑ω๑)۶ 我的博客&#xff1a;Xiao Xiangζั͡ޓއއ 很高兴见到大家&#xff0c;希望能够和大家一起交流学习&#xff0c;共同进步。 今天我们来对上一节做一些小补充&#xff0c;了解学习一下assert断言&#xff0c;指针的使用和传址调用…...

代码随想录-训练营-day16

530. 二叉搜索树的最小绝对差 - 力扣&#xff08;LeetCode&#xff09; /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode…...

Vue 3 中的父子组件传值:详细示例与解析

在 Vue 3 中&#xff0c;父子组件之间的数据传递是一个常见的需求。父组件可以通过 props 将数据传递给子组件&#xff0c;而子组件可以通过 defineProps 接收这些数据。本文将详细介绍父子组件传值的使用方法&#xff0c;并通过优化后的代码示例演示如何实现。 1. 父子组件传值…...

谈谈你所了解的AR技术吧!

深入探讨 AR 技术的原理与应用 在科技飞速发展的今天&#xff0c;AR&#xff08;增强现实&#xff09;技术已经悄然改变了我们与周围世界互动的方式。你是否曾想象过如何能够通过手机屏幕与虚拟物体进行实时互动&#xff1f;在这篇文章中&#xff0c;我们将深入探讨AR技术的原…...

神经网络的数据流动过程(张量的转换和输出)

文章目录 1、文本从输入到输出&#xff0c;经历了什么&#xff1f;2、数据流动过程是张量&#xff0c;如何知道张量表达的文本内容&#xff1f;3、词转为张量、张量转为词是唯一的吗&#xff1f;为什么&#xff1f;4、如何保证词张量的质量和合理性5、总结 &#x1f343;作者介…...

爬取鲜花网站数据

待爬取网页&#xff1a; 代码&#xff1a; import requestsfrom lxml import etree import pandas as pdfrom lxml import html import xlwturl "https://www.haohua.com/xianhua/"header {"accept":"image/avif,image/webp,image/apng,image/sv…...

vue框架技术相关概述以及前端框架整合

vue框架技术概述及前端框架整合 1 node.js 介绍&#xff1a;什么是node.js Node.js就是运行在服务端的JavaScript。 Node.js是一个事件驱动I/O服务端JavaScript环境&#xff0c;基于Google的V8引擎。 作用 1 运行java需要安装JDK&#xff0c;而Node.js是JavaScript的运行环…...

深入解析 C++ 字符串处理:提取和分割的多种方法

在 C 编程中&#xff0c;字符串处理是一个常见的任务&#xff0c;尤其是在需要从字符串中提取特定数据时。本文将详细探讨如何使用 C 标准库中的工具&#xff08;如 std::istringstream 和 std::string 的成员函数&#xff09;来提取和分割字符串&#xff0c;并分析不同方法的适…...

数据结构 树2

文章目录 前言 一&#xff0c;二叉搜索树的高度 二&#xff0c;广度优先VS深度优先 三&#xff0c;广度优先的代码实现 四&#xff0c;深度优先代码实现 五&#xff0c;判断是否为二叉搜索树 六&#xff0c;删除一个节点 七&#xff0c;二叉收索树的中序后续节点 总结 …...

NeetCode刷题第19天(2025.1.31)

文章目录 099 Maximum Product Subarray 最大乘积子数组100 Word Break 断字101 Longest Increasing Subsequence 最长递增的子序列102 Maximum Product Subarray 最大乘积子数组103 Partition Equal Subset Sum 分区等于子集和104 Unique Paths 唯一路径105 Longest Common Su…...

Google Chrome-便携增强版[解压即用]

Google Chrome-便携增强版 链接&#xff1a;https://pan.xunlei.com/s/VOI0OyrhUx3biEbFgJyLl-Z8A1?pwdf5qa# a 特点描述 √ 无升级、便携式、绿色免安装&#xff0c;即可以覆盖更新又能解压使用&#xff01; √ 此增强版&#xff0c;支持右键解压使用 √ 加入Chrome增强…...

[EAI-027] RDT-1B,目前最大的用于机器人双臂操作的机器人基础模型

Paper Card 论文标题&#xff1a;RDT-1B: a Diffusion Foundation Model for Bimanual Manipulation 论文作者&#xff1a;Songming Liu, Lingxuan Wu, Bangguo Li, Hengkai Tan, Huayu Chen, Zhengyi Wang, Ke Xu, Hang Su, Jun Zhu 论文链接&#xff1a;https://arxiv.org/ab…...

什么是Rust?它有什么特点?为什么要学习Rust?

什么是Rust&#xff1f;它有什么特点&#xff1f;为什么要学习Rust&#xff1f; 如果你是一名编程初学者&#xff0c;或者已经有一些编程经验但对Rust感兴趣&#xff0c;那么这篇文章就是为你准备的&#xff01;我们将用简单易懂的语言&#xff0c;带你了解Rust是什么、它有什…...

[EAI-028] Diffusion-VLA,能够进行多模态推理和机器人动作预测的VLA模型

Paper Card 论文标题&#xff1a;Diffusion-VLA: Scaling Robot Foundation Models via Unified Diffusion and Autoregression 论文作者&#xff1a;Junjie Wen, Minjie Zhu, Yichen Zhu, Zhibin Tang, Jinming Li, Zhongyi Zhou, Chengmeng Li, Xiaoyu Liu, Yaxin Peng, Chao…...

AIP-134 标准方法:Update

编号134原文链接AIP-134: Standard methods: Update状态批准创建日期2019-01-24更新日期2022-06-02 REST API通常向资源URI&#xff08;如 /v1/publishers/{publisher}/books/{book} &#xff09;发出 PATCH 或 PUT 请求&#xff0c;更新资源。 面向资源设计&#xff08;AIP-…...

计算机网络一点事(24)

TCP可靠传输&#xff0c;流量控制 可靠传输&#xff1a;每字节对应一个序号 累计确认&#xff1a;收到ack则正确接收 返回ack推迟确认&#xff08;不超过0.5s&#xff09; 两种ack&#xff1a;专门确认&#xff08;只有首部无数据&#xff09; 捎带确认&#xff08;带数据…...

DIFY源码解析

偶然发现Github上某位大佬开源的DIFY源码注释和解析&#xff0c;目前还处于陆续不断更新地更新过程中&#xff0c;为大佬的专业和开源贡献精神点赞。先收藏链接&#xff0c;后续慢慢学习。 相关链接如下&#xff1a; DIFY源码解析...

Kafka SSL(TLS)安全协议

文章目录 Kafka SSL&#xff08;TLS&#xff09;安全协议1. Kafka SSL 的作用1.1 数据加密1.2 身份认证1.3 数据完整性1.4 防止中间人攻击1.5 确保安全的分布式环境1.6 防止拒绝服务&#xff08;DoS&#xff09;攻击 2. Kafka SSL 配置步骤&#xff08;1&#xff09;创建 SSL 证…...

hexo部署到github page时,hexo d后page里面绑定的个人域名消失的问题

Hexo 部署博客到 GitHub page 后&#xff0c;可以在 setting 中的 page 中绑定自己的域名&#xff0c;但是我发现更新博客后绑定的域名消失&#xff0c;恢复原始的 githubio 的域名。 后面搜索发现需要在 repo 里面添加 CNAME 文件&#xff0c;内容为 page 里面绑定的域名&…...

【Block总结】MAB,多尺度注意力块|即插即用

文章目录 一、论文信息二、创新点三、方法MAB模块解读1、MAB模块概述2、MAB模块组成3、MAB模块的优势 四、效果五、实验结果六、总结代码 一、论文信息 标题: Multi-scale Attention Network for Single Image Super-Resolution作者: Yan Wang, Yusen Li, Gang Wang, Xiaoguan…...

移动互联网用户行为习惯哪些变化,对小程序的发展有哪些积极影响

一、碎片化时间利用增加 随着生活节奏的加快&#xff0c;移动互联网用户的碎片化时间越来越多。在等公交、排队、乘坐地铁等间隙&#xff0c;用户更倾向于使用便捷、快速启动的应用来满足即时需求。小程序正好满足了这一需求&#xff0c;无需下载安装&#xff0c;随时可用&…...

使用UpdateCursor删除行

UpdateCursor除了可以编辑表或要素类的行外,还可以删除行.但要记住,在编辑会话外删除行时,更改是永久性的. 操作方法: 1.打开IDLE,新建一个脚本 2.导入arcpy和os模块 import arcpy import os 3.设置工作空间 arcpy.env.workspace "<>" 4.在with语句中新…...

使用 Tauri 2 + Next.js 开发跨平台桌面应用实践:Singbox GUI 实践

Singbox GUI 实践 最近用 Tauri Next.js 做了个项目 - Singbox GUI&#xff0c;是个给 sing-box 用的图形界面工具。支持 Windows、Linux 和 macOS。作为第一次接触这两个框架的新手&#xff0c;感觉收获还蛮多的&#xff0c;今天来分享下开发过程中的一些经验~ 为啥要做这个…...