前端使用xlsx插件读取excel文件数据(保姆级教程)

news2024/11/19 9:37:44

本人属于一个实习菜鸟,大神请谨慎阅读............

      在开发过程中,难免会碰到用前端来处理excel文件的需求,我们需要解析出excel文件的内容然后在以对象的形式展示或者与后端对接

功能的实现思路:

     文件选择   =>  FileReader对象得到二进制数据  =>  XLSX处理二进制数据 => 得到数据

1.导入按钮的样式与事件(element ui)

        首先我们需要的是一个导入的按钮但是我们导入按钮并不好处理触发选择文件(file)的change事件所以我们可以用定位来解决这个问题,原理就是:选择文件按钮(file)覆盖在正常按钮上面然后在把选择文件按钮(file)透明的变为0即可

<el-button size="mini" type="success" style="margin-top: 10px" :disabled="disabled" 
class="el-dialog-position">
    <span v-if="importStatus === false">
        导入<i class="el-icon-upload el-icon--right" />
        <input ref="files" type="file" v-if="!disabled" class="excelFile" @change="excelFileMethod" />
    </span>
    <span v-if="importStatus === true">
        导入中<i class="el-icon-loading el-icon--right" />
    </span>
</el-button>

        接下来就是chnage事件了,当用户更改 input、select 和textarea元素的值时,change 事件在这些元素上触发。和 input 事件不同的是,并不是每次元素的 value 改变时都会触发 change 事件。我们选择文件并确认以后得到了下面着一些大堆数据

这一大堆的数据我们不用管,我们只关注target对象里面的files对象就可以了因为等一下我们需要用到,但是注意这里的只是文件的信息并不是数据更不是二进制文件!!!!!!

2.对得到的文件信息进行处理(fileReader的使用)

        先对fileReader做个介绍,FileReader 对象允许 Web 应用程序异步读取存储在用户计算机上的文件(或原始数据缓冲区)的内容,使用 File 或 Blob 对象指定要读取的文件或数据。(官网原文)这里给你们个地址自己去看属性和方法的使用我就不做过多的介绍了.........先看代码:

// change事件
excelFileMethod(e) {
    var _this = this
	//  excel文件信息
	const files = e.target.files
	console.log(files);
	// 构建fileReader对象
	const fileReader = new FileReader()
	// 读取操作完成时
	fileReader.onload = function(e) {
		try {
			// 二进制数据
			console.log(e.target.result)
			
		} catch (e) {
			console.log('文件类型不正确')
			return
		}
	}
	// 读取指定文件内容
	fileReader.readAsBinaryString(files[0])
}
  • 第一步我们需要构建一个新的FileReader对象
  • 第二步使用FileReader.readAsBinaryString()读取指定的Blob中的内容。一旦完成,result属性中将包含所读取文件的原始二进制数据。
  • 第三步就是FileReader.onLoad该事件在读取操作完成时触发。

3.对得到的二进制数据进行处理(XLSX插件的使用)

        XLSX插件的使用,使用前我们需要下载并CND使用也可以是npm安装看个人需求,我这里是vue项目所以就是npm安装了然后还需要我们引入XLSX,方法如下:

import XLSX from 'xlsx'

通过上面的代码我们已经得到了二进制数据了,我们就开始对二进制数据进行解析吧!使用XLSX.read(data, { type: type})方法来实现,type主要取值如下:

  • base64:以base64方式读取
  • binary:BinaryString格式( byte n is data.charCodeAt(n) )
  • string:UTF8编码的字符串
  • buffer:nodejs Buffer
  • array:Uint8Array,8位无符号数组
  • file:文件的路径(仅nodejs下支持)

这个方法返回一个workBook对象,对象的内容如下:

可以看到workBook对象,sheetNames里面保存了所有的sheet名字,然后Sheets则保存了每个sheet的具体内容(我们称之为Sheet Object)。每一个sheet是通过类似A1这样的键值保存每个单元格的内容,我们称之为单元格对象(Cell Object)

解析workBook对象的方法

  • XLSX.utils.sheet_to_csv:生成CSV格式
  • XLSX.utils.sheet_to_txt:生成纯文本格式
  • XLSX.utils.sheet_to_html:生成HTML格式
  • XLSX.utils.sheet_to_json:输出JSON格式

这里用到的是XLSX.utils.sheet_to_json所以我着重介绍,XLSX.utils.sheet_to_json(data, type)有两个参数,第一个是我们wordBook对象里面Sheets对象对应的数据,第二个参数配置如下:

  • raw: 使用原始值 (true) 或格式化字符串 (false)  (默认值:true
  • dateNF: 在字符串输出中使用指定的日期格式(默认值:FMT 14
  • defval: 使用指定值代替 null 或 undefined ()
  • blankrows: 在输出中包含空行**(默认值:** )
  • range: 

            (number)使用工作表范围,但将起始行设置为值

            (String)使用指定范围(A1 样式的有界范围字符串

            (default)使用工作表范围 ( worksheet[‘!ref’])

  • header:

            1: 生成数组数组(“二维数组”)

            "A".行对象键是文字列标签

            array of strings: 使用指定的字符串作为行对象中的键

            (default): 将第一行作为键读取并消除歧义

下面就是整个导入excel文件并读取数据的代码流程了,我们可以对得到的数据作为参数与后端接口进行对接就可以了!

// 处理excel文件
excelFileMethod(e) {
    // 导入状态和文件信息
    var _this = this
    _this.importStatus = true
    const excelFile = e.target.files
    // 构建fileReader对象
    const fileReader = new FileReader()
    // 该事件为读取完成时触发
    fileReader.onload = function (ev) {
      try {
        const data = ev.target.result
        const workbook = XLSX.read(data, {type: 'binary'})
        const list = ''
        const listNew = list.concat(XLSX.utils.sheet_to_json(workbook.Sheets['sheets1'], {header: 1}))
        _this.excelData.list = listNew.slice(6).split(',')
        // 得到的数据发送axios请求
        importExcel(_this.excelData).then(res => {
          console.log(res)
          _this.importStatus = false
          if (res.code === 200) {
            _this.$alert(res.data.msg, '导入成功', {
              confirmButtonText: '确定',
              callback: () => {
                // 确认后做什么
              }
            })
          } else {
            _this.$alert(res.data.msg, '导入失败', {
              confirmButtonText: '确定',
              callback: () => {
                // 确认后做什么
              }
            })
          }
        })
      } catch (e) {
        _this.$message({message: '文件类型不正确', type: 'warning'})
      }
    }
    // 读取数据
    fileReader.readAsBinaryString(excelFile[0])
}

后续还会持续更新技术问题感兴趣的小伙伴可以点关注或者是私信我哦!!!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

微信小程序中使用vant框架,方法步骤清晰,简单适用

1.说到vant框架相信大家应该并不陌生了吧&#xff0c;做过移动端开发的小伙伴们应该都知道它吧。 2.Vant 是有赞前端团队开源的移动端组件库&#xff0c;于 2017 年开源&#xff0c;已持续维护 4 年时间。Vant 对内承载了有赞所有核心业务&#xff0c;对外服务十多万开发者&am…

Vue 权限菜单(动态路由)详解

今天记录一下Vue的权限菜单&#xff08;动态路由&#xff09;&#xff0c;在我们写后台的时候用的比较多&#xff0c;Vue的权限菜单分两种&#xff0c;一种是通过本地进行&#xff0c;根据账号的权限进行筛选出可用的权限&#xff0c;组合菜单并在页面上渲染显示&#xff0c;另…

Vue3 从入门到放弃 (第一篇.环境准备)

什么是 Vue&#xff1f;# Vue (发音为 /vjuː/&#xff0c;类似 view) 是一款用于构建用户界面的 JavaScript 框架。它基于标准 HTML、CSS 和 JavaScript 构建&#xff0c;并提供了一套声明式的、组件化的编程模型&#xff0c;帮助你高效地开发用户界面。无论是简单还是复杂的…

uniapp-路由uni-simple-router

背景 专为uniapp打造的路由器&#xff0c;和uniapp深度集成通配小程序、App和H5端H5能完全使用vue-router开发模块化、查询、通配符、路由参数使 uni-app实现嵌套路由&#xff08;仅H5端完全使用vue-router&#xff09;uniapp用到了很多vue的api&#xff0c;但在路由管理的功能…

vue 上传文件和下载文件

vue 上传文件和下载文件1. 上传文件2. 下载文件1. 上传文件 上传文件我所使用的组件是element ui 的 el-upload&#xff0c;我一共进行了如下两步&#xff0c;第一步&#xff1a;修改样式&#xff0c;因为el-upload的样式不是我所要的&#xff0c;我想要这种的 代码如下 <…

【Vue 项目】使用 vuedraggable 实现拖拽效果时遇到的问题及解决方案总结(允许 el-table 行拖拽、部分元素不允许拖拽、拖拽避免影响文字复制和输入框输入文字)

由于在自己的工作和学习过程中&#xff0c;只查看某个大佬的教程或文章无法满足自己的学习需求和解决遇到的问题&#xff0c;所以自己在追赶大佬们步伐的基础上&#xff0c;又自己总结、整理、汇总了一些资料&#xff0c;方便自己理解和后续回顾&#xff0c;同时也希望给大家带…

【Node.js】深度解析常用核心模块-path模块

✅ 作者简介&#xff1a;一名将要迈入大三的大学生&#xff0c;致力于提高前端开发能力 ✨ 个人主页&#xff1a;前端小白在前进的主页 &#x1f525; 系列专栏 &#xff1a; node.js学习专栏 ⭐️ 个人社区 : 个人交流社区 &#x1f340; 学习格言: ☀️ 打不倒你的会使你更强…

本地存储(Local Storage) 和 会话存储(Session Storage)

我不会告诉你任何定义和概念&#xff0c;上车&#xff0c;读完这篇博客&#xff0c;你就会对本地存储(Local Storage) 和 会话存储(Session Storage)有一个清晰的认识。 目录前提知识范例示例1&#xff1a;将键值对提供给本地存储示例2: 本地存储中设置键值对示例3: 获取空值示…

浏览器链接跳转进入小程序指定页面(适用安卓和iOS)

安卓和ios 浏览器外部链接跳转进入小程序 需求&#xff1a;用户点击链接进入小程序 第一步&#xff1a; 需要后端配合调用微信官方提供的接口方法 生成小程序的链接。 官方文档如下&#xff1a; https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/url-…

async与await异步编程

ECMA2017中新加入了两个关键字async与await 简单来说它们是基于promise之上的的语法糖&#xff0c;可以让异步操作更加地简单明了 首先我们需要用async关键字&#xff0c;将函数标记为异步函数 async function f() {} f()异步函数就是指&#xff1a;返回值为promise对象的函…

IDEA如何完美配置Servlet(适用于IDEA 2022及以下版本)

目录 准备Java文件 导入servlet-api.jar 配置Tomcat服务器 准备Java文件 1.首先新建Java项目 选择新建项目&#xff0c;构建系统选择Maven&#xff0c;点击创建 2.选择添加框架支持&#xff08;英文为Add Framework Support&#xff09; 3.选择添加web应用程序&#xff08;…

dom-to-image

前言 之前的文章&#xff1a;vue基于html2canvas和jspdf 生成pdf 、解决jspdf中文乱码问题 简单介绍了html2canvas的基本使用&#xff0c;html2canvas 只能截取可视区域&#xff0c;对于含有滚动条的无法完全截取。后来发现还有一个dom-to-image的库可以支持&#xff0c;并且能…

【C#+JavaScript+SQL Server】实现Web端考试系统 六:后台管理模块设计(附源码和资源)

需要源码和资源请点赞关注收藏后评论区留言私信~~~ 一、后台管理模块概述 在线考试系统中&#xff0c;后台管理员模块具有最高权限&#xff0c;管理员通过登录模块成功登录之后&#xff0c;可以对试题信息&#xff0c;教师信息&#xff0c;考生信息&#xff0c;考试科目信息以…

CSS渐变背景看这一篇就够了

CSS渐变背景看这一篇就够了 在我们自己设计网页的时候&#xff0c;为了好看美观&#xff0c;颜色可谓是最让人头疼的一部分。尤其是在配色上又找不到一些好看的网站。今天我就来记录一些好看的渐变式背景&#xff0c;和一些常用的颜色网站。 CSS 渐变使可以显示两种或多种指定…

Vue Admin Template关闭eslint校验,lintOnSave:false设置无效解决办法

目录 第一步&#xff1a;lintOnSave&#xff1a;false 第二步&#xff1a;修改package.json中的配置 最后一步&#xff1a; 使用Vue Admin Template 二次开发是一件非常愉悦的事情&#xff0c;可是它里面的eslint真的是十分恶心人啊&#xff0c;对此我找了很多方法都没有解决…

浏览器强缓存与协商缓存详解以及实践

"我这边把代码更新上服务器了&#xff0c;你那边看一下呢?" "我这边还有这个问题&#xff0c;你改没改哦?" "我改了啊&#xff0c;不信你看我代码......噢&#xff0c;可能是浏览器缓存问题&#xff0c; 你F5刷新一下试试&#xff0c;如果不行 就Ct…

超星章节内ppt课件下载

超星章节内课件下载 欢迎访问个人博客&#xff1a;www.xuanworld.top 前言 ​ 一般来说&#xff0c;如果老师设置超星学习通章节内的ppt加密&#xff0c;那么ppt是无法下载的&#xff0c;超星不会提供下载接口&#xff0c;但是我们可以通过网络抓包的方式来截取到pdf&#x…

vue-router控制台异常:Uncaught (in promise) Error: Redirected when going from “/“ to “/foo“

qian kun微前端在子应用的路由配置中添加了一个全局前置导航守beforeEach&#xff0c;在前置导航守卫中调用next方法时重写了路由的path&#xff0c;结果控制台每次在路由跳转时都会报异常&#xff0c;但是不影响功能。 这里&#xff0c;我们将这个场景从微前端摘出来&#xf…

uniapp登录拦截器(未登录点击其他地方跳转登录页)

项目场景&#xff1a; 例如&#xff1a;客户要求用户在未登录的情况下&#xff0c;用户只可以在底部导航栏操作&#xff0c;点击其他的的功能都要跳转到登录页面。 uni.addInterceptor拦截器 是uni-app官网提供的拦截器&#xff0c;可以利用它来实现登录拦截器&#xff0c;用户…

vue3+pinia+vuerouter4动态路由菜单

文章目录前言一、用户权限和菜单列表数据二、pinia存储数据状态共享1.创建存储用户详情的user.ts文件2.创建存储用户菜单和权限的menus.ts文件三、设置动态路由1.在router文件夹下面创建routers.ts文件2.设置前置路由守卫3.左侧导航菜单前言 最近在做一个通用后台管理系统的框架…