vue中使用el-upload上传excel生成table数据

vue中使用el-upload上传excel生成table数据

最近公司有个需要上传excel的需求,可以让上传的excel转换为table数据,方便用户查看,由于之前没做过此类的需求,所以我百度了一波,了解到xlsx这个插件可以转换进行导入导出excel,既然如此,那就决定用你了.以下是功能展示

在这里插入图片描述在这里插入图片描述
好了 接下里说如何实现此功能

首先我们先下载xlsx这个包

npm i xlsx

然后在你想要实现的地方导入

import xlsx from "xlsx";

我在这里展示以下我的结构

<div class="excel">
    <el-upload
      class="upload-demo"
      action=""
      accept=".xls, .xlsx"
      :auto-upload="false"
      :show-file-list="false"
      :on-change="handleChange"
    >
      <el-button
        size="small"
        type="primary"
      >点击上传excel</el-button>
    </el-upload>
    <div class="table">
      <el-table
        v-if="tableData.length > 0"
        :data="tableData"
      >
        <el-table-column
          v-for="item in tableHeader"
          :key="item"
          :prop="item"
          :label="item"
        ></el-table-column>
      </el-table>
    </div>

我是在el-upload的on-change事件中读取上传的文件的

 async handleChange(file, fileList) {
      var data = file.raw;
      const excel = await this.readFile(data);
      // 使用xlsx读取二进制数据 生成excel的全部信息
      var workbook = xlsx.read(excel, { type: "binary" });
      // 通过xlsx转换为可读的表格数据 
      //workbook.Sheets[workbook.SheetNames[0]] 获取当前上传的表格的信息,例如总共有几行几列啥的
      data = xlsx.utils.sheet_to_json(workbook.Sheets[workbook.SheetNames[0]]);
      const header = this.getHeaderRow(workbook.Sheets[workbook.SheetNames[0]]);
      this.tableData = data;
      this.tableHeader = header;
    },

readFile方法如下

 // 读取上传的文件
    readFile(file) {
      return new Promise((resolve, reject) => {
        var reader = new FileReader();
        // 把文件转为二进制
        reader.readAsBinaryString(file);
        reader.onload = e => {
          // console.log(e.target.result);
          resolve(e.target.result);
        };
      });
    },

此时我们已经获取到了转换好的数组对象数据,如下
在这里插入图片描述
但是el-table是需要表头信息的 可以仔细查看我的on-change事件里面是有一个getHeaderRow方法来获取表头信息的

 // 获取表头信息
    getHeaderRow(sheet) {
      const headers = [];
      //获取总共的行数和列数
      const range = xlsx.utils.decode_range(sheet["!ref"]);
      let C;
      const R = range.s.r; // 开始行
      //遍历每列
      for (C = range.s.c; C <= range.e.c; ++C) {
        // 找到每列的第一行数据即使表头
        const cell = sheet[xlsx.utils.encode_cell({ c: C, r: R })];
        let hdr = "UNKNOWN " + C;
        if (cell && cell.t) hdr = xlsx.utils.format_cell(cell);
        headers.push(hdr);
      }
      return headers;
    }

至此 ,excel已经成功生成到页面tablel了,因为我是写的demo所以有些判断就没写的那么详细,比如可能需要判断是否是以xxx后缀才能上传,上传表格的大小不能超过多少,当然,你也可以把这些代码封装成一个组件…

好了以上就是我分享的如何在vue中上传excel文件,如果你觉得有帮助的话,可以为我点一个赞哦,搬运请写明出处,万分感谢!!!

  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
使用Element UI的el-upload组件上传Excel文件并预览可以分为以下几个步骤: 1. 安装Element UI和xlsx依赖。在命令行执行以下命令: ``` npm install element-ui xlsx --save ``` 2. 在Vue组件引入Element UI和xlsx。例如: ```javascript import { ElUpload, ElButton } from 'element-ui'; import XLSX from 'xlsx'; ``` 3. 在Vue组件使用el-upload组件创建文件上传并预览的功能。例如: ```html <template> <el-upload class="upload-demo" action="" :on-change="handleFileUpload" :before-upload="beforeUpload" :file-list="fileList" :auto-upload="false" :accept=".xlsx, .xls" :show-file-list="false"> <el-button size="small" type="primary">点击上传</el-button> <div slot="tip" class="el-upload__tip">只能上传Excel文件</div> </el-upload> <table> <thead> <tr> <th v-for="header in headers" :key="header">{{ header }}</th> </tr> </thead> <tbody> <tr v-for="(row, index) in data" :key="index"> <td v-for="(value, key) in row" :key="key">{{ value }}</td> </tr> </tbody> </table> </template> ``` 4. 在Vue组件定义beforeUpload方法,用于限制只能上传Excel文件。例如: ```javascript beforeUpload(file) { const fileType = file.name.split('.').pop(); if (fileType !== 'xlsx' && fileType !== 'xls') { this.$message.error('只能上传Excel文件'); return false; } } ``` 5. 在Vue组件定义handleFileUpload方法,用于处理上传Excel文件。例如: ```javascript handleFileUpload(file) { const reader = new FileReader(); reader.onload = (e) => { const data = e.target.result; const workbook = XLSX.read(data, { type: 'binary' }); const sheetName = workbook.SheetNames[0]; const sheet = workbook.Sheets[sheetName]; const jsonData = XLSX.utils.sheet_to_json(sheet, { header: 1 }); this.headers = jsonData[0]; this.data = jsonData.slice(1); }; reader.readAsBinaryString(file.raw); } ``` 6. 在Vue组件定义fileList、headers和data变量,用于存储上传Excel文件信息和解析后的数据。例如: ```javascript data() { return { fileList: [], headers: [], data: [] }; } ``` 7. 根据需要自定义样式和其他功能。例如: ```css .upload-demo { margin-top: 20px; width: 100%; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值