vue中上传读取及下载excel文件

准备工作

1、安装依赖包

npm install -S file-saver (-S用于生产环境)

npm install -S xlsx

npm install -D script-loader  (-D用于开发环境)

2、引入文件

导出excel需要两个文件:Blob.js和Export2Excel.js

链接:https://pan.baidu.com/s/137U5xaym8htX_q2AaVt6Mw 提取码:xue9

 

在src下新建目录vendor,将Blob.js和Export2Excel.js放进去,修改Export2Excel.js文件内容,下列语句表示引入Blob.js,注意修改为自己工程中Blob.js对应的路径,

require('script-loader!vendor/Blob')

或者,在webpack.base.conf.js中指定vendor的路径,

    alias: {
      'vue$': 'vue/dist/vue.esm.js',
      '@': resolve('src'),
      'vendor': path.resolve(__dirname, '../src/vendor')
    }

下载

下载使用Export2Excel.js的export_json_to_excel函数实现

先写一个按钮,给一个click事件

<template>
  <div class="excelDiv">
    <el-button @click="download">下载</el-button>
    <div id="fileselect">
      <el-input style="margin-top: 16px" type="file"></el-input>
    </div>
  </div>
</template>

准备表格数据

table: [{
        id: 1,
        name: '测试1',
        age: 21
      }, {
        id: 2,
        name: '测试2',
        age: 22
      }, {
        id: 3,
        name: '测试3',
        age: 23
      }],

download函数

    download: function () {
      var tHeader = ['id', '姓名', '年龄'] // excel的表头标题
      var filterVal = ['id', 'name', 'age'] // 需要导出对应自己列表中的每项数据
      var list = this.table // 列表数据
      var data = this.formatJson(filterVal, list)
      export_json_to_excel(tHeader, data, 'excelname')
    }

其中export_json_to_excel(tHeader, data, ' excelname')是简写形式,对应的参数是

      excel.export_json_to_excel({
        header: tHeader,
        data,
        filename: 'excelname' // 文件名称,若不写导出文件可能不识别
      })

formatJson函数

    // 在整个列表的数据中过滤导出自己需要的数据
    formatJson (filterVal, jsonData) {
      return jsonData.map(v => filterVal.map(j => v[j]))
    },

上传读取

上传用input的type=”file”实现,读取用FileReader,用xlsx的utils.sheet_to_json方法将读取到的内容转换成json数据,我们就可以就行下一步处理了。

  mounted: function () {
    this.$nextTick(function () {
      this.readFile()
    })
  },
    // 导入设备,监听上传文件并读取
    readFile: function () {
      let fileselect = document.querySelector('#fileselect')
      fileselect.addEventListener('change', function (e) {
        event.preventDefault()
        let file = e.target.files
        if (file.length <= 0) { // 如果没有文件名
          return
        } else if (!/\.(xls|xlsx)$/.test(file[0].name.toLowerCase())) {
          this.$message({
            type: 'info',
            message: '上传格式不正确,请上传xls或者xlsx格式'
          })
          return
        }
        let reader = new FileReader()
        if (typeof FileReader === 'undefined') {
          this.$message({
            type: 'info',
            message: '您的浏览器不支持FileReader接口'
          })
          return
        }
        reader.readAsBinaryString(file[0])
        reader.onload = function (e) {
          try {
            var data = e.target.result
            var workbook = XLSX.read(data, { type: 'binary' })
            var wsname = workbook.SheetNames[0] // 取第一张表
            var ws = XLSX.utils.sheet_to_json(workbook.Sheets[wsname]) // 生成json表格内容          } 
          catch (e) {
            return false
          }
        }
      }.bind(this))
    }

注意XLSX需要引入

import XLSX from 'xlsx'

在读取上传文件之前先判断是不是excel文件,主要通过后缀是否为‘xls’或者‘xlsx’来判断,判断方法有多种,我列出了三种方式以供参考,首先通过e.target.files[0].name获取上传文件的名称然后判断

1、分割字符串

         let arr = e.target.files[0].name.split('.')
          if (arr[1] !== 'xls' && arr[1] !== 'xlsx') {
            this.$message('上传格式不正确,请上传xls或者xlsx格式')
            return
          }

2、正则校验

!/\.(xls|xlsx)$/.test(e.target.files[0].name.toLowerCase())

3、lastIndexOf() 方法检索字符串

e.target.files[0].name.lastIndexOf(".xls") > 0 || e.target.files[0].name.lastIndexOf(".xlsx") > 0

需要注意

ESLint语法会报错Identifier 'export_json_to_excel' is not in camel case,不影响功能。

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Ant Design Vue 提供了一个上传组件 `Upload`,通过这个组件可以上传文件到服务器,然后在服务器端读取 Excel 文件里的值。 以下是一个简单的示例: ```vue <template> <div> <a-upload :before-upload="beforeUpload" :on-success="onSuccess" :show-upload-list="false" > <a-button> <a-icon type="upload"></a-icon> 点击上传 </a-button> </a-upload> <div v-if="excelData"> <table> <thead> <tr> <th v-for="header in excelData.headers" :key="header">{{ header }}</th> </tr> </thead> <tbody> <tr v-for="(row, index) in excelData.rows" :key="index"> <td v-for="(cell, cellIndex) in row" :key="cellIndex">{{ cell }}</td> </tr> </tbody> </table> </div> </div> </template> <script> import XLSX from 'xlsx'; export default { data() { return { excelData: null, }; }, methods: { beforeUpload(file) { const isExcel = /xlsx|xls/.test(file.type); if (!isExcel) { this.$message.error('只能上传 Excel 文件!'); } return isExcel; }, onSuccess(response) { const reader = new FileReader(); reader.onload = (event) => { const data = event.target.result; const workbook = XLSX.read(data, { type: 'binary' }); const sheetName = workbook.SheetNames[0]; const worksheet = workbook.Sheets[sheetName]; const excelData = XLSX.utils.sheet_to_json(worksheet, { header: 1 }); this.excelData = { headers: excelData[0], rows: excelData.slice(1) }; }; reader.readAsBinaryString(response.file); }, }, }; </script> ``` 在这个例子,我们使用 `XLSX` 库来解析 Excel 文件。在上传成功后,我们使用 `FileReader` 对象来读取上传文件,并将其转换为二进制字符串, 然后使用 `XLSX` 库将其转换为 JSON 数据。最后,我们将这些数据存储在 `excelData` 变量,以供渲染。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值