vue项目导入 .xlsx 文件

直接上代码,简单示例:

        点击导入按钮,弹出导入弹窗;

template 部分的代码:

<div>
  <el-button
    class="filter-item"
    style="margin-left: 10px; margin-bottom: 20px; height: 30px"
    type="primary"
    @click="importFile()"
  >
    导入调整下达表
  </el-button>
</div>
<el-dialog
  :title="title"
  :visible.sync="dialogVisible"
  width="40%"
  :before-close="importClose"
>
  <div style="display: flex; align-items: center">
    <a
      herf="javaScript:;"
      style="
        font-weight: bold;
        color: #d89a54;
        margin-right: 10px;
        margin-bottom: 18px;
        font-size: 16px;
      "
      @click="downloadModel()"
    >【模版下载】</a>
  </div>
  <div>
    <el-form style="display: flex; align-items: center">
      <el-form-item
        label="导入年份"
        label-width="88px"
        class="importYearSty"
      >
        <el-date-picker
          v-model="importYear"
          value-format="yyyy"
          clearable
          type="year"
        />
      </el-form-item>
      <el-form-item label="导入月份" label-width="88px">
        <el-select
          v-model="importMonth"
          placeholder="请选择"
          style="width: 140px"
          clearable
        >
          <el-option label="一月" value="一月"></el-option>
          <el-option label="二月" value="二月"></el-option>
          <el-option label="三月" value="三月"></el-option>
          <el-option label="四月" value="四月"></el-option>
          <el-option label="五月" value="五月"></el-option>
          <el-option label="六月" value="六月"></el-option>
          <el-option label="七月" value="七月"></el-option>
          <el-option label="八月" value="八月"></el-option>
          <el-option label="九月" value="九月"></el-option>
          <el-option label="十月" value="十月"></el-option>
          <el-option label="十一月" value="十一月"></el-option>
          <el-option label="十二月" value="十二月"></el-option>
        </el-select>
      </el-form-item>
    </el-form>
  </div>
  <br /><br />
  <div style="margin: 30px; padding-left: 100px; box-sizing: box-sizing">
    <el-upload
      ref="upload"
      action="#"
      :limit="1"
      class="upload-demo"
      drag
      :on-change="handleChange"
      :accept="accept"
      :multiple="false"
      :auto-upload="false"
    >
      <i class="el-icon-upload" />
      <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
      <div slot="tip" class="el-upload__tip">
        只能上传excel文件,且不超过100M
      </div>
    </el-upload>
  </div>
  <span slot="footer" class="dialog-footer">
    <el-button @click="dialogVisible = false">取 消</el-button>
    <el-button type="primary" @click="subMit">提交</el-button>
  </span>
</el-dialog>

data 部分的代码:

data() {
  return {
    // 导入excel文件配置
    fileMIMEList: [
      'application/vnd.ms-excel',
      'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
      ''
    ],
    // 可导入文件类型
    accept: '.xls,.xlsx',
    // 弹窗标题
    title: '导入文件',
    // 弹窗是否展示,默认不展示
    dialogVisible: false,
    file:null,
    // 导入数据的月份
    importMonth: '',
    // 导入年份,默认当前年份
    importYear: new Date().getFullYear().toString()
  }
}

引入的js:

import { getDiaLog } from '@/api/ims-demo/scProjInfo'; // 获取模板的方法
import axios from 'axios';
import { getCookieCode, getCookieToken } from '@/utils/auth'; // 获取token和code

methods 部分的代码:

// 点击导入按钮
importFile() {
  if (this.$refs.upload) {
    this.$refs.upload.uploadFiles = []
  }
  this.file = null
  this.dialogVisible = true
  this.title = '上传文件'
},
// 弹窗关闭按钮
importClose() {
  this.dialogVisible = false
},
// 模板下载按钮
downloadModel() {
  let modelKey = 'xxhsjdzbhxmxdb'
  getDiaLog(modelKey).then((res) => {
    const downloadbtn = document.createElement('a')
    const url =
      process.env.VUE_APP_BASE_IMS_EXT +
      'f-center/hadoop/hdfs/download?path=' + res
    downloadbtn.setAttribute('href', url)
    downloadbtn.style.display = 'none'
    document.body.appendChild(downloadbtn)
    downloadbtn.click()
    document.body.removeChild(downloadbtn)
  })
},
// 导入成功时执行
async handleChange(file) {
  if(!this.fileMIMEList.includes(file.raw.type)) {
    this.$message.error(`请上传 ${this.accept} 的文件!`)
     return false
  }

  const data = await this.readFile(file.raw)
  const workbook = XLSX.read(data, {
    type: 'binary',
    cellDates: true
  }) // 解析二进制格式数据
  const worksheet = workbook.Sheets[workbook.SheetNames[0]] // 获取第一个Sheet
  const result = XLSX.utils.sheet_to_json(worksheet) // json数据格式
  this.file = result
},
readFile(file) {
  // 文件读取
  return new Promise((resolve) => {
    const reader = new FileReader()
    reader.readAsBinaryString(file) // 以二进制的方式读取
    reader.onload = (ev) => {
      resolve(ev.target.result)
    }
  })
},
// 提交按钮
subMit() {
  let month = 1
  switch (this.importMonth) {
    case '一月':
      month = 1
      break
    case '二月':
      month = 2
      break
    case '三月':
      month = 3
      break
    case '四月':
      month = 4
      break
    case '五月':
      month = 5
      break
    case '六月':
      month = 6
      break
    case '七月':
      month = 7
      break
    case '八月':
      month = 8
      break
    case '九月':
      month = 9
      break
    case '十月':
      month = 10
      break
    case '十一月':
      month = 11
      break
    case '十二月':
      month = 12
      break
  }
  const FormDatas = new FormData()
  FormDatas.append('excelData', JSON.stringify(this.file))
  FormDatas.append('timeScope', String(month))
  FormDatas.append('year', String(this.importYear))
  // importExcelData(this.file, this.activeTagName, new Date().getFullYear())
  // 根据自己的项目如何调用接口决定,也可在 vueX 中获取登录保存的token和code
  // getCookieToken 获取token,getCookieCode 获取code
  axios({
    method: 'post',
    url: process.env.VUE_APP_BASE_IMS_BUSINESS +
      'sm-scxxh/scProjInfo/importCommitExcelData',
    headers: {
      'Blade-Auth': getCookieToken(),
      code: getCookieCode(),
      'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
    },
    timeout: 1000000,
    data: FormDatas
  }).then((response) => {
    if(response.data.code == 200) {
      this.$message({
        title: '成功',
        message: response.data.msg,
        type: 'success',
        duration: 2000
      })
      this.dialogVisible = false
      // 导入完成,重新调取列表接口,重新渲染表格
      this.getList()
    } else {
      this.$message({
        title: '失败',
        message: response.data.msg,
        type: 'warning',
        duration: 2000
      })
      this.dialogVisible = false
    }
  })
},

有问题请留言。

相关推荐

  1. vue项目导入 .xlsx 文件

    2024-06-17 03:20:03       29 阅读
  2. vue2使用npm依赖包导出xlsx文件

    2024-06-17 03:20:03       64 阅读
  3. Vue 导出前端数据报表为xlsx文件

    2024-06-17 03:20:03       45 阅读
  4. js批量导入获取xlsx文件数据

    2024-06-17 03:20:03       62 阅读
  5. vue:功能【xlsx】纯前端导出Excel

    2024-06-17 03:20:03       45 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-17 03:20:03       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-17 03:20:03       100 阅读
  3. 在Django里面运行非项目文件

    2024-06-17 03:20:03       82 阅读
  4. Python语言-面向对象

    2024-06-17 03:20:03       91 阅读

热门阅读

  1. Eureka注册中心

    2024-06-17 03:20:03       24 阅读
  2. 6月16日-英语学习日记-(专科生)

    2024-06-17 03:20:03       26 阅读
  3. 推荐一个轻量级适合阅读的优秀C++开源项目

    2024-06-17 03:20:03       31 阅读
  4. 华为OD机考题HJ1 字符串最后一个单词的长度

    2024-06-17 03:20:03       31 阅读
  5. Postman接口测试工具详解

    2024-06-17 03:20:03       34 阅读
  6. 中高级软件工程师的c语言面试题

    2024-06-17 03:20:03       19 阅读
  7. TS-语法介绍

    2024-06-17 03:20:03       31 阅读
  8. 无法获取Response Header内容的问题

    2024-06-17 03:20:03       25 阅读
  9. python单元测试

    2024-06-17 03:20:03       20 阅读
  10. exit和_exit函数和atexit函数

    2024-06-17 03:20:03       28 阅读
  11. GitHub项目里的api

    2024-06-17 03:20:03       25 阅读
  12. 算法训练营day60

    2024-06-17 03:20:03       27 阅读