Excel导入操作

<template>
  <el-dialog
    width="500px"
    title="员工导入"
    :visible="showExcelDialog"
    @close="$emit('update:showExcelDialog', false)"
  >
    <el-row type="flex" justify="center">
      <div class="upload-excel">
        <input
          ref="excel-upload-input"
          class="excel-upload-input"
          type="file"
          accept=".xlsx, .xls"
          @change="uploadChange"
        />
        <div class="drop">
          <i class="el-icon-upload" />
          <el-button type="text" @click="getTemplate">下载导入模板el-button>
          <span
            >将文件拖到此处或
            <el-button type="text" @click="handleUpload">点击上传el-button>
          span>
        div>
      div>
    el-row>
    <el-row type="flex" justify="end">
      
      <el-button
        size="mini"
        type="primary"
        @click="$emit('update:showExcelDialog', false)"
        >取消el-button
      >
    el-row>
  el-dialog>
template>

点击上传-弹出文件选择框

 <el-button type="text" @click="handleUpload">点击上传el-button>
methods:{
  // 上传
  handleUpload() {
    this.$refs["excel-upload-input"].click();// this.$refs.属性名 和 this.$refs[属性名] 等价
  },
}

Excel导入操作_第1张图片
监听文件改变-上传excel-关闭弹层

 <input
     ref="excel-upload-input"
      class="excel-upload-input"
      type="file"
      accept=".xlsx, .xls"
      @change="uploadChange"
  >
  async uploadChange(event) {
      console.log(event.target.files)
      // 调用上传接口
      // uploadExcel() // 参数  form-data 需要文件file
      const files = event.target.files // input的文件列表
      if (files.length > 0) {
        // 大于0 说明有文件要上传
        const data = new FormData()
        // file: file类型
        data.append('file', files[0]) // 将文件参数加入到formData中
        try {
          await uploadExcel(data)
          // 成功
          this.$emit('uploadSuccess') // 通知父组件 我上传成功
          this.$emit('update:showExcelDialog', false) // 关闭弹层
          // this.$refs['excel-upload-input'].value = ''
        } catch (error) {
          // 捕获失败
          // this.$refs['excel-upload-input'].value = ''
        } finally {
          // 不论成功或者失败都会执行finally
          this.$refs['excel-upload-input'].value = ''
        }
      }
}
//接口
export function uploadExcel(data) {
  return request({
    url: "/sys/user/import",
    method: "post",
    data, // form-data类型 因为要上传文件类型
  });
}

上传成功
Excel导入操作_第2张图片
1、首先封装一个员工导入组件,利用elementUI提供的组件铺设静态页面,
2、给导入模板绑定点击事件,弹出弹层,封装下载Excel模板接口,调用接口,这里和导出一样,需要用到file-saver来下载模板。
3、给点击上传按钮绑定点击事件,这里我们使用的是模拟点击,其实真正被点击的是input文本框,由于它放置页面不太协调,所以采用模拟点击。
4、封装上传Excel模板文件接口,这里上传data必须是formdata类型,因为要上传文件类型,调用接口,监听change事件,当用户选择了文件,而且这个文件和上次的不一样,就会触发change,所以这里使用e.target.files,files是数组,如果files的长度大于0,说明有文件要上传,此时就把文件封装到formdata对象中,根据文档提示,这里需要file类型,然后将文件参数加入到formData中,成功就提示父组件刷新页面,关闭弹层,失败就清空文件,这里即使上传成功也一样要清空文件,所以使用finally来控制。

你可能感兴趣的:(excel)