vue中导入导出excel

1 excel模板导出

 <el-form-item>
              <el-button type="primary" plain @click="download">下载模板</el-button>
 </el-form-item>
download() {
        companyApi.download('员工信息模板.xlsx');
},
import request from '../router/axios';
import * as urls from '@/config/env';
import Vue from 'vue'

let companyApi = {
  apiBaseUrl: urls.apiBaseUrl,
  shareBaseUrl: urls.shareBaseUrl,
download: function (fileName) {
    let url = this.apiBaseUrl + '/api/console/company/employee/download';
    // 下载是get请求,增加毫秒值避免浏览器的请求缓存问题
    let time = Date.parse(new Date()) / 1000
    if (url.indexOf('?') === -1) {
      url += '?t=' + time
    } else {
      url += '&t=' + time
    }
    const loading = Vue.prototype.$loading()
    request.get(url, {
      responseType: 'blob'
    }).then(res => {
      this.downloadHandler(res, fileName)
    }).catch((error) => {
      console.log('downloading error!', error)
    }).finally(() => {
      loading.close()
    })
  },
  downloadHandler: function (res, fileName) {
    //let type = res.data.type
    // 如果没找到文件,返回值为application/json
    /* if (type.indexOf('json') !== -1) {
       let reader = new FileReader()
       let data = res.data
       reader.readAsText(data, 'utf-8')
       reader.onload = function () {
         data = JSON.parse(String(reader.result))
         Vue.prototype.$message({
           message: data.errorMessage || '文件下载失败!',
           type: 'error'
         })
       }
       return
     }*/
    // 如果前端传了文件名时,优先用前端传的
    if (!fileName) {
      let content = res.headers['content-disposition']
      fileName = decodeURIComponent(content.substr(content.indexOf('filename=') + 9))
    }

    if ('msSaveOrOpenBlob' in navigator) {
      window.navigator.msSaveOrOpenBlob(new Blob([res.data]), fileName)
    } else {
      let url = window.URL.createObjectURL(new Blob([res.data]))
      let link = document.createElement('a')
      link.style.display = 'none'
      link.href = url
      link.setAttribute('download', fileName)
      document.body.appendChild(link)
      link.click()
    }
  },

2 导入excel模板

<el-form-item>
              <el-upload
                ref="upload"
                action="string"
                accept=".xlsx"
                :limit="1"
                :http-request="uploadExcel"
                :before-upload="beforeAvatarUpload"
                :show-file-list="false"
                :auto-upload="true"
              >
                <el-button type="primary" plain>点击上传</el-button>
              </el-upload>
            </el-form-item>
            
            //http-request="uploadExcel" 自定义上传方法
uploadExcel(params) {
        //调用clearFiles(),清除上次上传的文件,不然只能触发一次上传
        this.$refs.upload.clearFiles();
        let formData = new FormData();
        formData.append("file", params.file)
        companyApi.upload(formData).then((result) => {
          if (result.data.status === 200) {
            //导出错误记录
            if (result.data.data === 1) {
              this.$message.success("导入成功");
            } else {
              this.$message.error("导入员工信息有误,请查看错误报告!")
              companyApi.downloadError(result.data.data);
            }
          } else {
            this.$message.error(result.data.message);
          }
          this.handleList();
        });
      },
2.1 导入没有错误
  if (result.data.data === 1) {
              this.$message.success("导入成功");
  } 

导入时,出现不刷新页面只能导入一次,this.$refs.upload.clearFiles();清理文件后就可以多次导入

2.2 导入,后台验证返回验证不通过的错误模板excel。

post带list参数导出 responseType: ‘blob’

    downloadError: function (data) {
    request({
      url: this.apiBaseUrl + '/api/console/company/employee/downloadErrorExcel',
      method: 'post',
      data: data,
      responseType: 'blob'
    }).then(res => {

      this.downloadHandler(res, "错误报告.xlsx")
    }).catch((error) => {
      console.log('downloading error!', error)
    })
  }, 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值