vue 实现excel本地预览

2022年6月11日08:38:40

 安装npm依赖

npm i xlsx -S

   1、点击button 打开上传文件页面

 2、解析数据

 3、完整代码

<template>
  <div class="excel-wrapper">

    <!-- 上传按钮 -->
    <input class="input-file"
           type="file"
           @change="exportData"
           style="display:none"
           accept=".csv, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-excel" />
    <el-button type="success"
               size="small"
               @click="btnClick">上传excel</el-button>
    <!-- END -->

    <!-- 表格 -->
    <el-table :data="tableData"
              style="width: 100%"
              height="450"
              size="mini">
      <el-table-column :prop="item"
                       :label="item"
                       width="140"
                       v-for="(item,index) in checkboxTableColumn"
                       :key="'column'+index">
      </el-table-column>
    </el-table>
    <!-- END -->

    <!-- 分页 -->
    <el-pagination v-if="excelData != 0"
                   @size-change="handleSizeChange"
                   @current-change="CurrentChange"
                   :current-page="currentPage"
                   :page-sizes="[10, 20, 30,40,50,100,200,500]"
                   :page-size="pageSize"
                   layout="total, sizes, prev, pager, next, jumper"
                   :total="total">
    </el-pagination>
    <!-- END -->

  </div>
</template>

<script>
import * as XLSX from 'xlsx'
export default {
  data() {
    return {
      //所有键的值
      columnHeader: [],

      // 导入的excel的数据
      excelData: [],

      // 表格显示列
      checkboxTableColumn: [],

      //表格数据
      tableData: [],

      // 当前分页
      currentPage: 1,

      // 每页显示数量
      pageSize: 10,

      // 数据总数
      total: 0,
    }
  },

  methods: {
    // 将上传input框点击事件改为按钮
    btnClick() {
      document.querySelector('.input-file').click()
    },

    // 解析excel
    exportData(event) {
      if (!event.currentTarget.files.length) {
        return
      }
      const that = this
      // 拿取文件对象
      let f = event.currentTarget.files[0]
      //这里已经拿到了excel的file文件,若是项目需求,可直接$emit丢出文件
      // that.$emit('getMyExcelData',f);
      // 用FileReader来读取
      let reader = new FileReader()
      // 重写FileReader上的readAsBinaryString方法
      // FileReader.prototype.readAsBinaryString = function(f) {
      //   let binary = "";
      //   let wb; // 读取完成的数据
      //   let outdata; // 你需要的数据
      //   let reader = new FileReader();
      reader.onload = function (e) {
        // 读取成Uint8Array,再转换为Unicode编码(Unicode占两个字节)
        // let bytes = new Uint8Array(reader.result);
        // let length = bytes.byteLength;
        // for (let i = 0; i < length; i++) {
        //   binary += String.fromCharCode(bytes[i]);
        // }
        var data = e.target.result
        // 接下来就是xlsx
        var wb = XLSX.read(data, {
          type: 'buffer',
        })
        var outdata = XLSX.utils.sheet_to_json(wb.Sheets[wb.SheetNames[0]])
        // 导出格式为json,{表数据:[]}
        console.log(outdata)
        that.excelData = outdata
        that.tableData = outdata.slice(0, 10)
        that.total = outdata.length

        // 获取数据的key
        var importDataThead = Array.from(Object.keys(outdata[0])).map(
          (item) => {
            return item
          }
        )

        that.columnHeader = importDataThead
        that.checkboxTableColumn = importDataThead.slice(0, 9)
        console.log(importDataThead)
      }
      reader.readAsArrayBuffer(f)
      // };
      // reader.readAsBinaryString(f);
    },

    // 分页切换
    CurrentChange(val) {
      this.currentPage = val

      this.tableData = this.excelData.slice(
        (val - 1) * this.pageSize,
        val * this.pageSize - 1
      )
    },
    // 每页显示数量改变
    handleSizeChange(val) {
      this.pageSize = val
      this.tableData = this.excelData.slice(
        (this.currentPage - 1) * val,
        this.currentPage * val - 1
      )
    },
  },
}
</script>
<style  scoped>
.excel-wrapper {
  /* height: 100vh; */
  /* width: 600px; */
  overflow: scroll;
  background: rgb(226, 226, 226);
  padding: 20px;
}
</style>

  • 作者:小任睡不醒`
  • 原文链接:https://blog.csdn.net/m0_55969466/article/details/124280333
    更新时间:2022年6月11日08:38:40 ,共 2733 字。