vue 实现excel本地预览

 安装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>

仅用于记录

作者gitee地址:src/App.vue · 王佳斌/(Vue)本地上传 Excel 文件页面表格预览(配合 ElementUI 带分页) - Gitee.com

### 在 Vue.js 中集成 Excel 文件在线预览 为了在 Vue.js 项目中实现 Excel 文件的在线预览功能,可以采用 `@vue-office/excel` 或者基于 SheetJS 的解决方案来完成这一需求。 #### 方案一:使用 @vue-office/excel 插件 此方案适用于希望快速集成且不需要过多自定义的情况。首先需安装必要的依赖项: ```bash npm install vue-demi npm install @vue-office/excel ``` 接着可以在组件内导入并注册该插件[^1]: ```javascript import { defineComponent } from 'vue'; import { ExcelViewer } from '@vue-office/excel'; export default defineComponent({ components: { ExcelViewer, }, }); ``` 模板部分则可以直接使用 `<excel-viewer>` 标签加载文件路径或 Blob 数据源: ```html <template> <div> <!-- 假设已有一个获取到文件 URL 的变量 fileUrl --> <excel-viewer :src="fileUrl"></excel-viewer> </div> </template> ``` #### 方案二:利用 SheetJS 解析与展示 对于更灵活的需求场景,则可以选择通过 SheetJS 来手动处理 Excel 文件的内容,并将其转换为 HTML 表格形式显示出来。这通常涉及以下几个方面的工作: - **文件上传**:提供一个用于选择本地 Excel 文件的功能; - **解析数据**:借助 SheetJS 库读取选中的 Excel 文件内容; - **渲染界面**:将解析后的表格数据显示在一个合适的 UI 组件里(比如 Element Plus 提供的 Table); 具体操作步骤如下所示[^3]: 1. 安装所需 NPM 包: ```bash npm i xlsx --save ``` 2. 创建文件输入控件以便用户选取要查看的 Excel 文档: ```html <input type="file" id="uploadFile"/> ``` 3. 编写 JavaScript 函数负责监听文件变化事件、调用 SheetJS 进行解析以及更新视图状态: ```javascript import * as XLSX from 'xlsx'; import { ElTable, ElTableColumn } from 'element-plus'; // 如果选用Element Plus作为UI框架 document.getElementById('uploadFile').addEventListener('change', function(e){ const files = e.target.files; if (files.length === 0) return; let reader = new FileReader(); reader.onload = async function(event){ /* Parse data */ var workbook = XLSX.read(event.target.result,{type:'binary'}); /* Get first worksheet */ var sheet_name_list = workbook.SheetNames; var xlData = XLSX.utils.sheet_to_json(workbook.Sheets[sheet_name_list[0]]); // 更新state或者其他方式传递给ElTable的数据属性data this.$refs.tableRef.data = xlData; }; reader.readAsBinaryString(files[0]); }); ``` 4. 渲染表格结构: ```html <el-table ref="tableRef"> <el-table-column prop="date" label="日期" width="180"> </el-table-column> <el-table-column prop="name" label="姓名" width="180"> </el-table-column> <el-table-column prop="address" label="地址"> </el-table-column> </el-table> ``` 以上两种方法都可以有效地帮助开发者实现Vue.js 应用程序内的 Excel 文件在线预览特性。前者更加简便易用,而后者提供了更大的灵活性和控制力。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值