vue上传Excel文件并直接点击文件列表进行预览
本文主要内容:用elementui的Upload 组件上传Excel文件,上传后的列表采用xlsx插件实现点击预览表格内容效果。
在项目中可能会有这样的需求,有很多种方法实现。但是不想要跳转外部地址,所以用了xlsx插件来解析表格,并展示表格内容。
1.安装或CDN引用xlsx插件
xlsx插件,通常指的是SheetJS/js-xlsx,是一个功能强大的JavaScript库,它允许开发者在浏览器或Node.js环境中读取、创建、编辑和导出Excel文件(包括.xls、.xlsx、.csv、.ods等多种格式)。这个库是由纯JavaScript编写的,不依赖于任何外部库,非常适合在前端应用中处理Excel数据,也适用于服务器端处理。
对于Vue开发者来说,vue-xlsx是一个专门为Vue框架设计的轻量级封装库,提供了Vue组件和更加Vue友好的API,它使得在Vue应用中处理Excel文件变得更加简单和直接。在这里我使用的是xlsx。
(1)在项目中安装xlsx
npm install vue-xlsx //安装的是vue-xlsx库,基于SheetJS/js-xlsx的Vue封装库,专门为Vue框架设计
yarn add vue-xlsx
npm install xlsx //安装的是SheetJS/js-xlsx库,纯JavaScript编写的库
yarn add xlsx
(2)CDN引入xlsx
直接添加script标签引入
<script src="https://cdnjs.cloudflare.com/ajax/libs/xlsx/0.18.5/xlsx.full.min.js"></script>
动态添加script标签引入
mounted() {// 引入xlsx插件const script = document.createElement("script");script.src = "https://cdnjs.cloudflare.com/ajax/libs/xlsx/0.18.5/xlsx.full.min.js";//使用.full.min.js引入成功,其他不行script.onload = () =>{console.log("xlsx脚本加载完成");}document.body.appendChild(script);this.assignmentQueryForm()
},
这里的资源是从免费的开源CDN服务网站上copy下来的,cdnjs网站地址:https://cdnjs.com/libraries/xlsx(需要不同版本的请前往)或开发文档概述 | SheetJS 中文网 (nodejs.cn)
(3)CDN引入xlsx没有起作用的解决方法
我这里引入了xlsx的CDN链接,但是运用xlsx还是报错。经过解决,发现使用xlsx.full.min.js这个后缀的文件可以,也不知道为什么。SheetJS开发文档说xlsx.full.min.js是完整的独立脚本。
2.导入xlsx
(1)安装的需要在Vue组件中导入vue-xlsx
import { XlSX } from 'vue-xlsx';
import { XlSX } from 'xlsx';
(2)CDN引入的xlsx直接使用
3.利用vue组件上传Excel文件
ref: 为上传组件设置了一个引用名。
action: 上传地址的URL,但这里设置为#
,表明实际的上传逻辑将不会通过action
属性指定的URL进行,而是通过:http-request
属性自定义。
:on-preview: 点击已上传的文件链接时的回调。
:on-remove: 文件列表移除文件时的回调。
:file-list: 已经上传的文件列表,绑定到fileList
数据属性。
:auto-upload: 是否在选取文件后立即进行上传,这里设置为false
,表示需要手动触发上传。
:http-request: 覆盖默认的上传行为,可以自定义上传的实现。
:on-change: 文件状态改变时的回调。
multiple: 是否支持多文件上传。
因为只做了Excel文件解析,所以可以在upload组件中设置accept属性,限制只上传表格文件。
accept=".xls, .xlsx"
代码如下:
<el-dialog title="批量导入" :visible.sync="dialogVisible1" width="30%"><el-form :model="importForm1" ref="removeControl" :rules="rules" label-position="right" label-width="auto"style="width: 50%"><el-form-item label="附件:" ref="myfile" style="background-color: #ffffff;"><div style="display: flex"><el-upload ref="upload" action="#" :on-preview="handleView" :on-remove="handleRemove" :file-list="fileList":auto-upload="false" :http-request="uploadFile" :on-change="onChange" multiple><el-button slot="trigger" size="small" type="primary" icon="el-icon-upload2"style="padding: 10px 20px">上传文件</el-button></el-upload></div></el-form-item><span @click="down()" style="cursor: pointer; color: blue">下载模板</span></el-form><span slot="footer" class="dialog-footer"><el-button @click="dialogVisible1 = false">取 消</el-button><el-button type="primary" @click="goUpload()">确 定</el-button></span>
</el-dialog>
4.解析并预览Excel文件
(1)文件上传成功后,点击解析文件
这里会用到upload组件的on-preview(点击已上传的文件链接时的回调)。
(2)解析Excel文件步骤
- 使用
new FileReader()
创建一个文件存储,用于异步读取用户的文件内容。 -
当文件读取操作成功完成时,触发
onload
事件。通过e.target.result
获取到文件的内容。 -
使用
XLSX.read(data, { type: 'array'
})
将array格式的数据解析为Excel工作簿对象。 -
通过
tablelook.SheetNames[0]
获取第一个工作表的名称,并通过tablelook.Sheets[firstSheetName]
获取该工作表的数据。 -
使用
XLSX.utils.sheet_to_json(tablesheet, { header: 1 })
将工作表的数据转换为JSON格式,其中{ header: 1 }
表示第一行作为表头。 -
使用FileReader接口的
readAsArrayBuffer()
方法用于开始读取指定Blob或File的内容。
(3)处理JSON数据(可根据自己需求)
- 使用
jsonData.shift()
移除并保存表头(即第一行数据) - 通过
filter
方法过滤掉包含空值(null
、undefined
、空字符串''
)的行 - 使用
map
方法将数据中的每一行数据转换为一个对象,对象的键是表头,值是对应的数据。
我这里处理成了elementui的table格式数据,点击文件列表就可以直接展示表格解析的内容。
代码如下:
handleView(file) {const reader = new FileReader();reader.onload = (e) => {const data = e.target.result;const tablelook = XLSX.read(data, { type: 'array' });const firstSheetName = tablelook.SheetNames[0];const tablesheet = tablelook.Sheets[firstSheetName];const jsonData = XLSX.utils.sheet_to_json(tablesheet, { header: 1 });this.whiteListHeaders = jsonData.shift();// 过滤空数据 this.whiteListTable = jsonData.filter(row => { return row.some(item => item !== null && item !== undefined && item !== ''); }); // 表格数据处理this.tableData2 = this.whiteListTable.map(row => { const obj = {}; this.whiteListHeaders.forEach((header, cellIndex) => { obj[header] = row[cellIndex]; }); return obj; }); console.log("表格头", this.whiteListHeaders); console.log("表格数据", this.whiteListTable); console.log("this.tableData2", this.tableData2); }reader.onerror = (error) => { console.error('读取文件错误:', error); };reader.readAsArrayBuffer(file.raw)this.dialogVisible2 = true;
},
预览文件表格展示
<el-dialog :visible.sync="dialogVisible2" title=" " width="50%"><el-table :data="tableData2" style="width: 100%" :cell-style="{ 'text-align': 'center' }":header-cell-style="{background: '#E5F2FF',color: '#000','text-align': 'center',}"> <el-table-column v-for="header in whiteListHeaders" :key="header" :prop="header" :label="header" width="140"> </el-table-column> </el-table>
</el-dialog>
注意:对于大型的Excel文件或需要进行复杂数据处理的场景,可能需要使用后端API来接收上传的Excel文件,在后端解析文件数据后返回给前端在展示,这样有利于提高性能。
相关文章:

vue上传Excel文件并直接点击文件列表进行预览
本文主要内容:用elementui的Upload 组件上传Excel文件,上传后的列表采用xlsx插件实现点击预览表格内容效果。 在项目中可能会有这样的需求,有很多种方法实现。但是不想要跳转外部地址,所以用了xlsx插件来解析表格,并展…...

OpenCV 像素操作—证件照换底色详细原理 C++纯手写实现
文章目录 总体步骤1.RGB转HSV2.找出要换的底色3.取反,黑白颠倒4.将原图像的非背景部分复制到新背景上 完整代码1.C纯手写版2.官方API版本 总体步骤 1.RGB转HSV 为什么一定要转为HSV 颜色空间? 将图像从BGR颜色空间转换为HSV颜色空间是因为HSV颜色空间更…...

tinygrad框架简介;MLX框架简介
目录 tinygrad框架简介 MLX框架简介 LLaMA编辑 Stable Diffusion编辑 tinygrad框架简介 极简主义与易扩展性 tinygrad 的设计理念是极简主义。与 XLA 类比,如果 XLA 是复杂指令集计算 (CISC),那么 tinygrad 就是精简指令集计算 (RISC)。这种简约的设计使得它成为添加…...

服务器重启了之后就卡在某个页面了,花屏,如何解决??
🏆本文收录于《CSDN问答解惑-专业版》专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收…...

Hospital 14.6.0全开源医院管理预约系统源码
InfyHMS 具有 60 种功能和 9 种不同类型的用户类型, 他们可以登录系统并根据他们的角色访问他们的数据。 源码下载:https://download.csdn.net/download/m0_66047725/89580674 更多资源下载:关注我。...

C/C++樱花树代码
目录 写在前面 系列文章 C简介 完整代码 代码分析 写在后面 写在前面 C实现精美的樱花树,只需这100行代码! 系列文章 序号目录直达链接1爱心代码https://want595.blog.csdn.net/article/details/1363606842李峋同款跳动的爱心https://want595.b…...
sklearn基础学习
1. 简介 1.1 什么是sklearn sklearn,或者更正式地称为scikit-learn,是一个基于Python的开源机器学习库。它建立在NumPy、SciPy和matplotlib之上,提供了简单而有效的工具用于数据挖掘和数据分析。sklearn支持监督学习和无监督学习算法&#…...

SpringBoot 自动配置原理
一、Condition Condition 是在 Spring 4.0 增加的条件判断功能,通过这个可以功能可以实现选择性的创建 Bean 操 作。 思考: SpringBoot 是如何知道要创建哪个 Bean 的?比如 SpringBoot 是如何知道要创建 RedisTemplate 的? …...
Redisson中RQueue的使用场景附一个异步的例子
RQueue 是一个基于 Redis 的分布式作业队列系统,它允许开发者在 Ruby 应用程序中实现异步任务处理和计划任务调度。由于 Redis 提供了高性能的内存数据结构存储,RQueue 可以快速地存储和检索队列中的任务,这使得它非常适合于高并发和低延迟的…...

SpringMVC 控制层框架-下
五、SpringMVC其他扩展 1. 异常处理机制 1.1 异常处理概念 开发过程中是不可避免地会出现各种异常情况,例如网络连接异常、数据格式异常、空指针异常等等。异常的出现可能导致程序的运行出现问题,甚至直接导致程序崩溃。因此,在开发过程中&a…...
(四)js前端开发中设计模式之工厂方法模式
工厂方法模式,通过对产品类的抽象,使其创建业务主要用于负责创建多类产品的实例 const Java function (content) {this.content content;(function () {let oDiv document.createElement(div)oDiv.innerHTML contentoDiv.style.color greendocument.getElement…...

新版GPT-4omini上线!快!真TM快!
大半夜,OpenAI突然推出了GPT-4o mini版本。 当我看到这条消息时,正准备去睡觉。mini版本质上是GPT-4o模型的精简版本,没有什么革命性的创新,因此我并没有太在意。 结果今天早上一觉醒来发现伴随GPT-4o mini上线,官网和…...
【Unity】RPG2D龙城纷争(十七)敌方常规AI(Normal)的实现
更新日期:2024年7月24日。 项目源码:第五章发布(正式开始游戏逻辑的章节) 索引 简介一、AI_Normal类二、AI调遣策略第一阶段:收集1.提供战场数据收集方法2.收集战场数据三、AI调遣策略第二阶段:评估四、AI调遣策略第三阶段:行动简介 AI_Normal定位为框架自带的最基础的…...
Tracy 小笔记:微信小程序 mpx 雷达图的实现
使用文档: https://www.kancloud.cn/xchhhh/wx-chart/399337 https://github.com/xiaolin3303/wx-charts https://gitee.com/mirrors/wx-charts/#wx-charts 参数说明: https://github.com/xiaolin3303/wx-charts/issues/56 下载 dist 里的 wx-charts-…...

Unity UGUI 之 Input Field
本文仅作学习笔记与交流,不作任何商业用途 本文包括但不限于unity官方手册,唐老狮,麦扣教程知识,引用会标记,如有不足还请斧正 1.Input Field是什么? 给玩家提供输入的输入框 2.重要参数 中英文对照着看…...
SpringBoot接入mongodb例子,并有增删改查功能
1,首先,在pom.xml中添加依赖: <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-mongodb</artifactId></dependency><!--上面这…...

类和对象(三)
目录 一. 构造函数初始化列表 二. 类型转换 三. static成员 四. 友元 五. 内部类 六. 匿名对象 七. 对象拷贝时的编译器优化 一. 构造函数初始化列表 1. 之前我们实现构造函数时,初始化成员变量主要使用函数体内赋值,构造函数初始化还有一种方式&…...
Android SurfaceFlinger——GraphicBuffer初始化(二十九)
在 SurfaceFlinger 中,GraphicBuffer 是一个关键的数据结构,用于封装和管理图形数据的内存缓冲区。它不仅在 SurfaceFlinger 内部使用,也被其他组件如 GPU 驱动、摄像头服务、视频解码器等广泛利用,以实现高效的数据交换和图形渲染。 一、概述 GraphicBuffer 对象封装了一…...

pytest:4种方法实现 - 重复执行用例 - 展示迭代次数
简介:在软件测试中,我们经常需要重复执行测试用例,以确保代码的稳定性和可靠性。在本文中,我们将介绍四种方法来实现重复执行测试用例,并显示当前迭代次数和剩余执行次数。这些方法将帮助你更好地追踪测试执行过程&…...

一文入门SpringSecurity 5
目录 提示 Apache Shiro和Spring Security 认证和授权 RBAC Demo 环境 Controller 引入Spring Security 初探Security原理 认证授权图示编辑 图中涉及的类和接口 流程总结 提示 Spring Security源码的接口名和方法名都很长,看源码的时候要见名知意&am…...
应用升级/灾备测试时使用guarantee 闪回点迅速回退
1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间, 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点,不需要开启数据库闪回。…...

RocketMQ延迟消息机制
两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数,对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后…...

【入坑系列】TiDB 强制索引在不同库下不生效问题
文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...
linux 错误码总结
1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...
Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!
一、引言 在数据驱动的背景下,知识图谱凭借其高效的信息组织能力,正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合,探讨知识图谱开发的实现细节,帮助读者掌握该技术栈在实际项目中的落地方法。 …...
聊一聊接口测试的意义有哪些?
目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开,首…...
ThreadLocal 源码
ThreadLocal 源码 此类提供线程局部变量。这些变量不同于它们的普通对应物,因为每个访问一个线程局部变量的线程(通过其 get 或 set 方法)都有自己独立初始化的变量副本。ThreadLocal 实例通常是类中的私有静态字段,这些类希望将…...

Linux-进程间的通信
1、IPC: Inter Process Communication(进程间通信): 由于每个进程在操作系统中有独立的地址空间,它们不能像线程那样直接访问彼此的内存,所以必须通过某种方式进行通信。 常见的 IPC 方式包括&#…...
接口 RESTful 中的超媒体:REST 架构的灵魂驱动
在 RESTful 架构中,** 超媒体(Hypermedia)** 是一个核心概念,它体现了 REST 的 “表述性状态转移(Representational State Transfer)” 的本质,也是区分 “真 RESTful API” 与 “伪 RESTful AP…...