vue 使用js XLSX读取 excel 转换日期格式

2 篇文章 0 订阅
2 篇文章 0 订阅

最近要实现一个功能,大概就是前端读取excel 文件,excel内容展示在页面上,用户确认无误后再上传至后端,使用的XLSX来解析excel,读取日期的时候是数字,解决这个问题花了蛮久时间,记录一下

xlsx 官方github

1.首先要 安装 XLSX

npm install xlsx
npm install moment

2.再导入

import XLSX from 'xlsx'
import moment from 'moment'

3.用的是element-ui 的 el-upload组件上传,绑定upload

upload (file, fileList) {
      let files = {0: file.raw}
      this.readExcel1(files)
    }

4.读取excel,日期格式需要加上 cellDates: true  参数, el-table-column  需要显示的时候也要格式化

 readExcel1 (files) {
      // console.log(files)
      if (files.length <= 0) {
        return false
      } else if (!/\.(xls|xlsx)$/.test(files[0].name.toLowerCase())) {
        this.$Message.error('上传格式不正确,请上传xls或者xlsx格式')
        return false
      }

      const fileReader = new FileReader()
      fileReader.onload = (ev) => {
        try {
          const data = ev.target.result
          const workbook = XLSX.read(data, {
            type: 'binary',
            cellDates: true
          })
          const wsname = workbook.SheetNames[0]// 取第一张表
          const ws = XLSX.utils.sheet_to_json(workbook.Sheets[wsname])// 生成json表格内容
          this.list = ws
        } catch (e) {
          return false
        }
      }
      fileReader.readAsBinaryString(files[0])
    }
<el-table-column :formatter="dateFormat" align="center" label="日期" prop="日期" />
dateFormat: function (row, column) {
      var date = row[column.property]
      if (date === undefined) {
        return ''
      }
      return moment(date).format('YYYY-MM-DD')
    }

最后附在所有代码

<template>
  <div class="app-container">
    <!-- 查询和其他操作 -->
    <el-upload
      class="upload-demo"
      ref="upload"
      :action=uploadUrl()
      :on-preview="handlePreview"
      :on-remove="handleRemove"
      :on-success="handleAvatarSuccess"
      :on-change="upload"
      accept=".xlsx"
      :file-list="fileList"
      :auto-upload="false">
      <el-button slot="trigger" size="small" type="primary">选取文件</el-button>
      <el-button style="margin-left: 10px;" size="small" type="success" @click="submitUpload">上传到服务器</el-button>
      <div slot="tip" class="el-upload__tip">只能上传xlsx文件,选取文件确认无误后点击上传服务器</div>
    </el-upload>

    <!-- 查询结果 -->
    <el-table v-loading="listLoading" :data="list" element-loading-text="正在查询中。。。" border size="mini" highlight-current-row>
      <el-table-column :formatter="dateFormat" align="center" label="日期" prop="日期" />
      <el-table-column align="center" label="应用名称" prop="应用名称" />
      <el-table-column align="center" label="广告id" prop="广告id" />
      <el-table-column align="center" label="广告源" prop="广告源" />
      <el-table-column align="center" label="收入金额" prop="收入金额"/>
      <el-table-column align="center" label="广告触发类型" prop="广告触发类型"/>
    </el-table>
  </div>
</template>

<script>
import XLSX from 'xlsx'
import moment from 'moment'
export default {
  name: 'importAdIncome',
  data () {
    return {
      fileList: [],
      downloadLoading: false,
      listLoading: false,
      list: []
    }
  },
  created () {
  },
  methods: {
    submitUpload () {
      this.$refs.upload.submit()
    },
    handleRemove (file, fileList) {
      // console.log(file, fileList)
    },
    handlePreview (file) {
      // console.log(file)
    },
    handleAvatarSuccess (response, file, fileList) {
      // console.log(response)
      if (response && response.code === '200') {
        this.$notify.success({
          title: '成功',
          message: '导入成功'})
      }
    },
    upload (file, fileList) {
      let files = {0: file.raw}
      this.readExcel1(files)
    },
    readExcel1 (files) {
      // console.log(files)
      if (files.length <= 0) {
        return false
      } else if (!/\.(xls|xlsx)$/.test(files[0].name.toLowerCase())) {
        this.$Message.error('上传格式不正确,请上传xls或者xlsx格式')
        return false
      }

      const fileReader = new FileReader()
      fileReader.onload = (ev) => {
        try {
          const data = ev.target.result
          const workbook = XLSX.read(data, {
            type: 'binary',
            cellDates: true
          })
          const wsname = workbook.SheetNames[0]// 取第一张表
          const ws = XLSX.utils.sheet_to_json(workbook.Sheets[wsname])// 生成json表格内容
          this.list = ws
        } catch (e) {
          return false
        }
      }
      fileReader.readAsBinaryString(files[0])
    },
    uploadUrl () {
      return process.env.BASE_API + '/upload/importIncomeExcel'
    },
    dateFormat: function (row, column) {
      var date = row[column.property]
      if (date === undefined) {
        return ''
      }
      return moment(date).format('YYYY-MM-DD')
    }
  }
}
</script>

<style scoped>
</style>

 

  • 5
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值