vue获取excel文件数据

vue获取excel文件数据并用表格展示

1、安装xlsx paparse及handsontable

npm install xlsx
npm install papaparse
npm install handsontable @handsontable/vue

2、页面引入

import xlsx from 'xlsx'
import Papa from 'papaparse'
import {HotTable} from '@handsontable/vue'

3、判断文件类型

getFileType(fileurl){
  var suffix = ""  //获取文件后缀
  var result = ""  //获取结果类型
  try {
    var fileArr = filename.split('.')
    suffix = fileArr[fileArr.length-1]
  } catch (err) {
    suffix = ""
  }
  //filename无后缀时,返回false
  if(!suffix){
    result = false
    return result
  }
  // 图片
  var imglist = ['png', 'jpg', 'jpeg', 'bmp', 'gif']
  result = imglist.some(function(item) {
    return item === suffix
  })
  if(result) {
    result = 'image'
    return result
  }
  // txt
  var txtlist = ['txt']
  result = txtlist.some(function(item) {
    return item === suffix
  })
  if(result) {
    result = 'txt'
    return result
  }
  // excel
  var excellist = ['xls', 'xlsx']
  result = excellist.some(function(item) {
    return item === suffix
  })
  if(result) {
    result = 'excel'
    return result
  }
  // csv
  var csvlist = ['csv']
  result = csvlist.some(function(item) {
    return item === suffix
  })
  if(result) {
    result = 'csv'
    return result
  }
  // 以此类推
}

4、解析excel内容

const type = this.getFileTypr(fileurl)

1、excel文件

if(type==="excel") {
  const xhr = new XMLHttpRequest()
  xhr.open('GET', fileurl, true)
  xhr.responseType = 'blob'
  const rhis = this
  xhr.onload = function() {
    const blob = this.response
    const reader = new FileReader()
    reader.onload = function(e) {
      const wb = xlsx.read(e.target.result, { type: 'binary' })
      rhis.outputExcel(wb)  //处理数据
    }
    reader.readAsBinaryString(blob)
  }
  xhr.send()
}
outputExcel(wb) {
  this.sheetData = []
  var sheetNames = wb.SheetNames  //工作表名称集合
  sheetNames.foreach(name => {
    var worksheet = wb.Sheets[name]  //只能通过工作表名称来获取指定工作表
    var data = xlsx.utils.sheet_to_csv(worksheet)

    Papa.parse(data, {  //使用papaparse解析csv数据
      complete: res => {
        const arrs = res.data
        //去除最后的空行
        const lastItem = arrs[arrs.length - 1].every(val => val === "")
        lastItem && arrs.pop()
        this.sheetData = arrs
      }
    })
  })
}

2、csv文件

if(type === "csv") {
  this.sheetData = []
  Papa.parse(fileurl, 
    {
      download: true,
      complete: res => {
	    const arrs = res.data
	    //去除最后的空行
	    const lastItem = arrs[arrs.length - 1].every(val => val === "")
	    lastItem && arrs.pop()
	    this.sheetData = arrs
      }
   })
}

5、页面展示

<sheet :data="sheetData"/>
import sheet from './commonSheet'

commonSheet组件如下:

<template>
  <div class="overf">
    <div id="table" class="sheet">
      <hot-table ref="hot" :data="data" :settings="hotSetting" />
    </div>
  </div>
</template>
<script>
import { HotTable } from '@handsontable/vue
import 'handsontable/dist/handsontable.full.css
export default {
  components: { HotTable },
  props: {
    data: {
      type: Array,
      default() {
        return []
      }
    }
  },
  data() {
    return {
      hot: null,
      hotSettings: {
        readOnly: true,  // 表格只读
      }
    }
  },
  watch: {
    data(newValue) {
      this.$refs.hot.hotInstance.loadData(newValue)
    }
  }
}
</script>
<style lang="scss" scope>
.overf{
  height: 300px; overflow: hidden;
}
.sheet{
  height: 100%; overflow: auto;
  &>>>#hot-display-license-info{
    display: none;
  }
}
</style>
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值