vue+element 导入excel数据并转化为json存入el-table

项目开发过程中有个需求,仓库系统入库的时候需求是把填好的入库单excel表格直接导入到vue前端页面上,并展示出来,没有问题的话以表单的形式存入数据库。

将excel表格内容展示到页面中,经过不懈的学习 特意总结一下子(学习前辈经验,自我总结)

要实现的功能是,通过点击el-button按钮 上传一个xslx格式的文件

 

 然后达到如下的效果:

 效果大概就是这样,需求也已经梳理清楚 接下来就是我总结的直接可以使用的代码

vue的代码主要是这样子的(与我实际版本相比阉割)

 <el-upload
    class="upload-demo"
    action=""
    :on-change="handleChange"
    :show-file-list="false"
    :auto-upload="false">
    <el-button size="small" type="primary" style="margin-bottom:15px;">读取excel文件</el-button>
  </el-upload>
  <el-table
    :data="tableData"
    style="width: 100%">
  <el-table-column
                prop="id"
                label="序号"
                v-if="false"
            ></el-table-column>
            <el-table-column
                prop="pinleiName"
                label="物资品类"
            ></el-table-column>
  </el-table>

1. action 属性必须要有,可以为空,但是不能没有,不然控制台会报错
2. 钩子函数必须是 on-change 这个钩子,只有这个钩子可以添加文件,其他都是上传,

然后就是js的方法:

首先现在前端文件夹安装一个工具,直接运行命令

npm install xlsx

// data 部分的数据
data () {
  return {
    tableData: [],
    fileContent: '',
    file: '',
    data: ''
  }
},
// 处理方法(核心部分)
methods: {
// 核心部分代码(handleChange 和 importfile)
handleChange (file) {
  this.fileContent = file.raw
  const fileName = file.name
  const fileType = fileName.substring(fileName.lastIndexOf('.') + 1)
    if (this.fileContent) {
      if (fileType === 'xlsx' || fileType === 'xls') {
        this.importfile(this.fileContent)
      } else {
        this.$message({
          type: 'warning',
          message: '附件格式错误,请重新上传!'
        })
      }
    } else {
      this.$message({
        type: 'warning',
        message: '请上传附件!'
      })
    }
  },
 importfile (obj) {
   const reader = new FileReader()
   const _this = this
   reader.readAsArrayBuffer(obj)
   reader.onload = function () {
     const buffer = reader.result
     const bytes = new Uint8Array(buffer)
     const length = bytes.byteLength
     let binary = ''
     for (let i = 0; i < length; i++) {
       binary += String.fromCharCode(bytes[i])
     }
      const XLSX = require('xlsx')
      const wb = XLSX.read(binary, {
        type: 'binary'
      })
      const outdata = XLSX.utils.sheet_to_json(wb.Sheets[wb.SheetNames[0]])
      this.data = [...outdata]
      const arr = []
      this.data.map(v => {
        const obj = {}
       obj.pinmuName = v.物资品目
        arr.push(obj)
      })
      _this.tableData = _this.tableData.concat(arr)
    }
  },
}

outdata是从excel表格里第一个sheet里读取到的数据,前台打印一下获得对应字段

 

此处的obj便是获取表格中的数据进行给表单赋值需要什么字段和值就直接赋给obj对象,然后push进数组中,再_this.tableData = _this.tableData.concat(arr) 把若干个对象传回给表单,从而实现导入数据并显示在页面的功能。其余一些小细节可以根据自己的需求来实现。比如表格中有时间格式的但是拿到之后无法存入数据库,那就可以通过循环把时间修改成相应的格式(虽然傻瓜但是有效)

总结至此,希望对大家有所帮助。

  • 6
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值