Excel 导入和导出--前后端整合

文章目录

      • Excel基础
      • Easy Excel
        • 导出会员数据
        • 导入会员数据
    • 前端代码:
      • 代码解析
      • 总结
      • 组件简介
      • 详细解释
      • 总结

用来操作excel文件的。
银行网银系统导出交易明细数据各种业务系统导出excel报表数据批量导入业务数据

Excel基础

  • **工作簿 workbook
    **就是一个文件
  • 工作表 sheet
    属于工作簿
  • 行 row
    属于工作表
  • 单元格 cell属于行,如C2,表示第二行第三列

Easy Excel

官网地址: 对于操作excel十分的方便。
关于Easyexcel | Easy Excel 官网 (alibaba.com)

<dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-spring-boot-starter</artifactId><version>4.4.0</version>
</dependency>

image.png
根据excel表格编写导出的实体类。
在实体类的每一个属性上面添加注解@Excel, name是excel的列名,orderNum表示在第几列,下标从0开始。
width表示列的宽度,有些列数据比较多长度会比较大。

@Data
@AllArgsConstructor
@NoArgsConstructor
public class SpMemberVO {@Excel(name = "用户名", orderNum = "0", width = 20)@ApiModelProperty(value = "用户名")private String username;@Excel(name = "邮箱", orderNum = "1", width = 30)@ApiModelProperty(value = "邮箱")private String email;@Excel(name = "性别", orderNum = "2", width = 15)@ApiModelProperty(value = "性别")private String gender;@Excel(name = "QQ号", orderNum = "3", width = 10)@ApiModelProperty(value = "qq")private String qq;@Excel(name = "手机", orderNum = "4", width = 25)@ApiModelProperty(value = "手机")private String phone;@Excel(name = "学历", orderNum = "5", width = 10)@ApiModelProperty(value = "学历")private String education;@Excel(name = "爱好", orderNum = "6", width = 10)@ApiModelProperty(value = "爱好")private String hobby;@Excel(name = "简介", orderNum = "7", width = 30)@ApiModelProperty(value = "简介")private String introduce;}

导出会员数据

controller层代码

@ApiOperation("导出会员信息")
@GetMapping("/export")
public void export(@RequestParam(defaultValue = "1")Integer pageNum, @RequestParam(defaultValue = "5") Integer pageSize, Member member, HttpServletResponse resp) throws IOException {//导出所有的选学生新信息Workbook workbook = memberService.export(pageNum, pageSize, member);// 设置响应内容resp.setContentType("application/vnd.ms-excel");  //设置响应头                                                           //如果需要中文 就要这样编写resp.setHeader("Content-Disposition", "attachment;filename=" + new String("会员信息表.xlsx".getBytes("utf-8"), "iso8859-1"));//将workbook写入到响应流中去workbook.write(resp.getOutputStream());}
这个方法虽然没有显式的返回值,但是它通过 HttpServletResponse 对象将数据直接写入了响应流
,这使得它能够将内容发送到前端。

service层代码:

@Override
public Workbook export(Integer pageNum, Integer pageSize, Member member) {PageHelper.startPage(pageNum, pageSize); //开启分页List<SpMemberVO> memberList = memberMapper.selectByPage(member); //分页查找//设置导出数据 第一个参数 标题 第二个参数 页表标题ExportParams exportParams = new ExportParams("会员信息", "会员信息表");//调用工具类生成book 返回bookWorkbook book = ExcelExportUtil.exportExcel(exportParams, SpMemberVO.class, memberList);return book;
}

导入会员数据
@ApiOperation("导入会员信息")
@PostMapping("/import")         
public Result importExcel(@RequestParam("file") MultipartFile file) throws IOException {System.out.println(file.getSize());memberService.importFile(file.getInputStream());return Result.success();
}@RequestParam("file") MultipartFile file 是在 Spring MVC 中用来处理文件上传的参数定义。它的作用是将 HTTP 请求中上传的文件绑定到控制器方法的参数 file 上。下面是详细解释:MultipartFileSpring 提供的一个接口,用于封装上传的文件。它包含了一些常用的方法,例如 getOriginalFilename()(获取文件的原始名称)、getBytes()(获取文件的字节内容)、getInputStream()(获取文件的输入流)等。
通过将 MultipartFile 作为方法参数,Spring MVC 可以自动处理多部分表单数据,将上传的文件封装为 MultipartFile 对象,并传递给方法供其使用。对于传过来的file可以使用下面的方法
getOriginalFilename(): 返回上传文件的原始文件名。
getBytes(): 以字节数组的形式返回文件内容。
getInputStream(): 获取文件内容的输入流,用于更复杂的文件处理操作。
transferTo(File dest): 将上传的文件直接保存到指定的文件路径。

serive层代码
image.png

@SneakyThrows
@Override
public void importFile(InputStream inputStream){
System.out.println(inputStream);
ImportParams params = new ImportParams();
params.setTitleRows(1);  //导入的数据 设置标题
params.setHeadRows(1);    //设置最上面一栏                          //这边读取的是vo中的配置
List<SpMemberVO> list = ExcelImportUtil.importExcel(inputStream, SpMemberVO.class, params);
//导入的数据和实际的数据有差别的,通过stream流进行转换
List<Member> collect = list.stream().map(item -> {Member member = new Member();BeanUtils.copyProperties(item, member);member.setPassword(PwdUtil.encrypt(MemberConstant.DEFAULT_PASSWORD));member.setCreateTime(new Date());member.setUpdateTime(new Date());member.setIsDeleted(MemberConstant.NO_DELETED);return member;
}).collect(Collectors.toList());
//进行批量的插入
memberMapper.insertBatch(collect);
}

批量插入的mapper.xml代码

<insert id="insertBatch" parameterType="Member">INSERT INTO sp_member (username, password, email, gender, qq, phone, education, hobby, introduce, create_time, update_time, is_deleted)VALUES<!-- 通过foreach标签  --><foreach collection="list" item="item" separator=",">(#{item.username}, #{item.password}, #{item.email}, #{item.gender}, #{item.qq}, #{item.phone}, #{item.education}, #{item.hobby}, #{item.introduce}, #{item.createTime}, #{item.updateTime}, #{item.isDeleted})</foreach></insert>

验证:
image.pngimage.png
image.png

前端代码:

// 导出async exportMember(type) {console.log(type)let tip = type ? '是否确定导出全部的会员信息?' : '是否确定导出当前页的会员信息?'this.$confirm(tip, '提示', {confirmButtonText: '导出',cancelButtonText: '取消',type: 'warning',}).then(async () => {// 要传递的参数let params = { ...this.queryInfo }// 是否是导出全部匹配数据if (type) {params.pageNum = 1params.pageSize = this.total}// 导出const res = await this.$http.get(`members/export`, {params,responseType: 'blob',})const file = new Blob([res.data], {type: 'application/vnd.ms-excel',})const url = URL.createObjectURL(file)const a = document.createElement('a')a.href = urla.download = 'member.xlsx'a.click()// 释放临时的aURL.revokeObjectURL(url)}).catch(() => {this.$message({type: 'info',message: '已取消导出',})})}, 

这段代码是一个 Vue.js 组件的方法,exportMember(type),用于导出会员信息。它根据用户选择导出全部会员数据或仅导出当前页的数据。下面是对代码的详细解释:

代码解析

  1. 方法签名与参数:
    • async exportMember(type):这是一个异步方法,type 参数用于指示导出类型。如果 typetrue,则导出全部会员信息;如果为 false,则仅导出当前页的会员信息。
  2. 确认导出提示:
let tip = type ? '是否确定导出全部的会员信息?' : '是否确定导出当前页的会员信息?'
this.$confirm(tip, '提示', {confirmButtonText: '导出',cancelButtonText: '取消',type: 'warning',
})
  • 根据 type 的值,设置不同的提示信息,让用户确认他们要导出的数据范围。
  • 使用 Vue.js 的 this.$confirm 方法显示一个确认对话框,用户可以选择继续导出或取消。
  1. 确认后的处理逻辑:
    • then(async () => {...}):如果用户点击了“导出”,执行这个块中的逻辑。
  2. 设置请求参数:
let params = { ...this.queryInfo }
if (type) {params.pageNum = 1params.pageSize = this.total
}
  • params 是请求参数对象,通常包含查询条件和分页信息。
  • 如果 typetrue(导出全部),则将 pageNum 设置为 1,将 pageSize 设置为总记录数,意味着请求所有数据。
  1. 发起导出请求:
const res = await this.$http.get(`members/export`, {params,responseType: 'blob',//指定格式
})
  • 使用 this.$http.get 发起 GET 请求,传递查询参数 params
  • responseType: 'blob' 指定返回的数据类型为 blob,即二进制文件数据。
  1. 处理文件下载:
const file = new Blob([res.data], {type: 'application/vnd.ms-excel',
})
const url = URL.createObjectURL(file)
const a = document.createElement('a')
a.href = url
a.download = 'member.xlsx'
a.click()
URL.revokeObjectURL(url)
  • 使用 Blob 将返回的二进制数据创建为一个文件对象。
  • URL.createObjectURL(file) 创建一个指向 Blob 对象的临时 URL。
  • 创建一个隐藏的 <a> 标签,通过设置 href 属性为刚创建的 URL,并设置 download 属性为 member.xlsx,触发文件下载。
  • 下载完成后,通过 URL.revokeObjectURL(url) 释放临时 URL 以节省内存。
  1. 取消导出:
.catch(() => {this.$message({type: 'info',message: '已取消导出',})
})
  • 如果用户点击“取消”,或者导出操作失败,则执行这个块,提示用户导出已取消。

总结

这段代码实现了一个文件导出功能,通过用户的选择导出全部会员数据或当前页的数据。它使用了 Vue.js 的 this.$confirm 方法来提示用户确认操作,并通过 axios 发起 HTTP 请求以获取文件数据,再使用 Blob 和动态创建的 <a> 标签完成文件下载。这种方法常用于处理从后端导出 Excel 文件或其他二进制文件的场景。

导入

<!-- 导入 -->
<el-upload :action="importUrl" :headers="importHearders" :show-file-list="false" accept=".xls, .xlsx":before-upload="beforeUpload" :on-success="importSuccess" style="display: inline-block; margin-left: 10px"><el-button type="info" icon="el-icon-upload">导入</el-button>
</el-upload>

这段代码是一个使用 Element UI 构建的文件上传组件,主要用于上传 Excel 文件(.xls.xlsx 格式)。以下是对各个部分的详细解释:

组件简介

<el-upload> 是 Element UI 提供的上传组件,能够处理文件的上传,并提供丰富的配置选项来定制上传行为。

详细解释

  1. :action="importUrl":
    • :actionel-upload 组件的一个属性,用于指定文件上传的 URL。这里通过 importUrl 绑定了一个动态的上传接口地址。
    • 在实际开发中,importUrl 通常是一个包含服务器上传接口的变量,用户选择文件后,文件将被上传到这个 URL 对应的服务器端处理接口。
  2. :headers="importHearders":
    • :headers 属性用于设置上传请求的 HTTP 头信息。
    • 这里 importHearders 绑定了一个包含头信息的对象变量,可以用于设置如 Authorization 令牌等,用于身份验证或其他用途。
importHearders: {  //拿到存储在本地的token信息Authorization: JSON.parse(localStorage.getItem('userInfo')).token,},
  1. :show-file-list="false":
    • :show-file-list 控制是否显示上传文件的列表。
    • 设为 false 表示不显示文件上传列表,这样用户不会看到已经上传的文件名等信息。
  2. accept=".xls, .xlsx":
    • accept 属性用于限制用户可以选择的文件类型。
    • 这里设置为 ".xls, .xlsx",表示只能选择 Excel 文件,这样确保用户上传的文件格式是符合预期的。
  3. :before-upload="beforeUpload":
beforeUpload(file) {// 这里可以进行文件验证,例如大小、类型等return true; // 或者返回一个 Promise
}
  • :before-upload 是一个钩子函数,绑定到 beforeUpload 方法。
  • 这个函数会在文件上传之前执行,通常用于验证文件类型、大小等。通过返回 false 可以阻止文件上传,返回 Promise 则可以控制异步验证逻辑。
  1. :on-success="importSuccess":
importSuccess(response, file, fileList) {// 处理上传成功后的逻辑
}
  • :on-success 是一个钩子函数,绑定到 importSuccess 方法。
  • 当文件上传成功后,这个方法会被调用,通常用于处理成功上传后的逻辑,例如通知用户上传成功或处理返回的数据。
  1. <el-button>:
    • 这个按钮是上传组件的触发器,点击按钮将会打开文件选择框。
    • type="info" 设置按钮的样式为 info 颜色,icon="el-icon-upload" 设置按钮图标为上传图标,按钮的文本是“导入”。
  2. style="display: inline-block; margin-left: 10px":
    • 内联样式,用于调整按钮的布局和外观。display: inline-block 使按钮与其他元素在同一行显示,margin-left: 10px 给按钮左侧增加了 10 像素的间距。

总结

这段代码定义了一个用于导入 Excel 文件的上传按钮,使用了 Element UI 的 el-upload 组件。用户点击按钮后,可以选择一个 .xls.xlsx 文件上传。上传过程可以通过 beforeUpload 方法进行前置检查,通过 importSuccess 方法处理上传成功后的响应。所有配置(如上传地址、请求头等)都可以通过绑定的 Vue.js 数据动态控制。

// 导入成功的回调
importSuccess(res) {// console.log(res)if (res.status != 200) {return this.$message.error('导入失败,请确认会员名唯一')}this.$message.success('导入成功')this.getMemberList()
},
// 导入前的钩子
beforeUpload(file) {const fileSuffix = file.name.substring(file.name.lastIndexOf('.') + 1)const whiteList = ['xls', 'xlsx']//校验导出的格式if (whiteList.indexOf(fileSuffix) === -1) {this.$message.error('上传文件只能是 xls、xlsx格式')return false}//校验文件的大小  不能大于10MBconst isLt10M = file.size / 1024 / 1024 < 10if (!isLt10M) {this.$message.error('上传文件大小不能超过 10MB')return false}
},

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

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

相关文章

Linux中如何查看一个进程?如何杀死一个进程?如何查看某个端口有没有被占用?

在Linux中 如何查看一个进程&#xff1f; 使用 ps 命令 ps aux这会显示所有正在运行的进程&#xff0c;可以使用 grep 来过滤特定的进程 ps aux | grep process_name使用 top 命令 top这个命令会实时的显示系统重正在运行的进程 如何杀死一个进程&#xff1f; 使用 kill …

8、Django Admin后台中添加Logo

在项目settings.py文件 # 导入os&#xff0c;并且修改DIRS内容如下所示 import os TEMPLATES [{BACKEND: django.template.backends.django.DjangoTemplates,DIRS: [os.path.join(BASE_DIR, templates/)],APP_DIRS: True,OPTIONS: {context_processors: [django.template.con…

WebRTC协议下的视频汇聚融合技术:EasyCVR构建高效视频交互体验

视频汇聚融合技术是指将来自不同源、不同格式、不同网络环境的视频流进行集中处理、整合和展示的技术。随着视频监控、远程会议、在线教育、直播娱乐等领域的快速发展&#xff0c;视频数据的规模急剧增长&#xff0c;对视频处理能力和效率提出了更高要求。视频汇聚融合技术通过…

excel扒数据到ini文件小工具

一、源码 注释很详细&#xff0c;就不讲了 #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow> #include <QVariant>QT_BEGIN_NAMESPACE namespace Ui { class MainWindow; } QT_END_NAMESPACEclass MainWindow : public QMainWindow {Q_OBJECTpu…

免费SSL证书申请入口——支持自动续签

SSL证书是一种数字证书&#xff0c;用于在客户端&#xff08;如浏览器&#xff09;与服务器之间建立加密通信&#xff0c;确保数据传输的安全性和完整性。它通过加密技术保护网站免受数据窃取和篡改&#xff0c;同时验证网站的身份&#xff0c;让用户确认他们正在与正确的网站进…

最全盘点!国内外主流的在线CRM有哪些?

本文将盘点10款主流的在线CRM&#xff0c;为企业选型提供参考。 在线 CRM 就如同企业与客户之间的强力纽带&#xff0c;能把企业的客户关系管理得妥妥当当。 对于企业来说&#xff0c;如果没有好用的在线 CRM&#xff0c;就像航海者失去了罗盘&#xff0c;在市场的海洋中容易迷…

48.【C语言】结构体补充

承接20.【C语言】初识结构体&#xff08;重要&#xff09;中的结构体成员的访问 目录&#xff1a; 1.结构体创建 2.利用函数控制结构体 3.使用“结构体指针变量-->结构体成员变量”来修改结构体的数据 4.传值还是传址&#xff1f; 1.结构体创建 依据第20篇&#xff0c;可以…

Learning——protobuf的下载

目录 一、protobuf在windows下安装 1.下载地址 2.配置环境变量 ①打开设置 ②搜索框中搜索编译环境变量 ③ 点击“环境变量” ④ 找到PATH并双击打开编辑 ⑤配置环境变量后点击确定 3.检验是否安装成功 二、protobuf在Linux下安装 1.库依赖安装 2.下载地址 我不能使用…

二异硬脂醇苹果酸酯行业分析:前三大厂商占有大约51.0%的市场份额

二异硬脂醇苹果酸酯&#xff08;Distearyl Malate&#xff09;是一种由苹果酸与硬脂醇反应生成的酯类化合物&#xff0c;常用于化妆品和护肤品中作为润肤剂、增稠剂和乳化剂。其特点是具有良好的保湿和滋润效果&#xff0c;同时能提供丝滑的质地和优越的使用感&#xff0c;适合…

12款图纸加密软件大盘点,2024图纸加密软件最新推荐

图纸不仅是设计师的灵感结晶&#xff0c;更是企业宝贵的无形资产。然而&#xff0c;随着网络安全的日益严峻&#xff0c;如何确保这些图纸的安全&#xff0c;防止未经授权的访问和泄露&#xff0c;成为了每个企业和设计师不得不面对的问题。今天&#xff0c;就让我们一起揭开12…

Windows10上Nginx如何通过自签名证书方式发布Https服务(上)

背景 在Android开发中使用平板设备进行调试,Android版本是13。在调试中遇到一个这样的报错信息:“java.io.IOException: Cleartext HTTP traffic to 192.168.137.1 not permitted”,然后查了下报错原因是:应用正在尝试通过不安全的HTTP协议进行网络通信,而你的应用运行的环…

SQL【2】稍稍进阶

目录 首先&#xff0c;怎么安装&#xff0c;环境怎么调。 alter——改变&#xff08;此段Al&#xff09; 创建于删除数据库、表格 上一节进阶 预设值default​编辑 关于插入顺序 有条件的删除DELETE FROM 表 WHERE 条件 多种语句组合查看 查看排序​编辑 LIMIT 2只取前…

大模型入门 ch01:大模型概述

本文是github上的大模型教程LLMs-from-scratch的学习笔记&#xff0c;教程地址&#xff1a;教程链接 STAGE 1&#xff1a; BUILDING 1. 数据准备与采样 LLM的预测过程&#xff0c;是一个不断预测下一个词&#xff08;准确的说是token&#xff09;的过程&#xff0c;每次根据输…

计算机网络(八股文)

这里写目录标题 计算机网络一、网络分层模型1. TCP/IP四层架构和OSI七层架构⭐️⭐️⭐️⭐️⭐️2. 为什么网络要分层&#xff1f;⭐️⭐️⭐️3. 各层都有那些协议&#xff1f;⭐️⭐️⭐️⭐️ 二、HTTP【重要】1. http状态码&#xff1f;⭐️⭐️⭐️2. 从输入URL到页面展示…

佰朔资本:两步走!“科创板八条”后首单,亮点多多!

“科创板八条”后首单并购重组 普源精电创立于1998年&#xff0c;是国产电子测量仪器领军企业&#xff0c;公司拥有数字示波器、射频类仪器、波形发生器、电源及电子负载、万用表及数据收集五大产品族、八大产品线&#xff0c;并供应芯片级、模块级和系统级多层次处理方案&…

Carla自动驾驶仿真十:Carlaviz三维可视化平台搭建

文章目录 前言一、环境准备1、docker安装2、websocket-client安装3、carlaviz代码下载 二、carlaviz使用1、打开carla客户端2、输入启动命令3、进入carlaviz4、修改manual_control.py脚本5、运行manual_control.py脚本6、运行carlaviz官方脚本&#xff08;推荐&#xff09; 前言…

Oracle授权如何购买?多少钱?如何计算?

前言 作为DBA时常也会遇到一些商务的问题&#xff0c;比如购买Oracle 的授权&#xff0c;比如老板问用oracle有没有法律风险&#xff0c;这个组件是否收费&#xff1f;如何计算授权数&#xff1f;等等&#xff0c;本文根据博主的经验和一些Oracle公开的资料&#xff0c;来做一个…

戴尔科技领涨市场,AI服务器需求成关键驱动力

戴尔科技强劲上涨&#xff0c;AI服务器需求激增 戴尔科技公司日内股价飙升4.2%&#xff0c;达到115.42美元&#xff0c;接近一个月高点。这一强劲表现主要得益于该公司上调了年度盈利预期&#xff0c;原因是对Nvidia驱动的人工智能优化服务器的需求显著增加。戴尔将2025财年的年…

智能的JavaScript开发工具WebStorm v2024.2全新发布

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具&#xff0c;被广大中国JS开发者誉为"Web前端开发神器""强大的HTML5编辑器""智能的JavaSscript IDE"等。与IntelliJ IDEA同源&#xff0c;继承了IntelliJ IDEA强大的JS部分的功能。 立即获…

mate-indicators占用内存过高导致熔断

目录&#xff1a; 1、问题现象2、解决方法 1、问题现象 mate-indicators占用内存达30.9%&#xff08;内存溢出&#xff09;导致内存不足服务熔断。 2、解决方法 发现mate-indicators进程占用内存资源达到节点总内存40%&#xff0c;导致服务出现内存熔断 临时解决 systemct…