<template><el-dialogwidth="500px"title="员工导入":visible="showExcelDialog"@close="$emit('update:showExcelDialog', false)"><el-row type="flex" justify="center"><div class="upload-excel"><inputref="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"><!-- update:props属性名,值 直接修改 .sync修饰符的属性值 --><el-buttonsize="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-关闭弹层
<inputref="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 需要文件fileconst 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 {// 不论成功或者失败都会执行finallythis.$refs['excel-upload-input'].value = ''}}
}
//接口
export function uploadExcel(data) {return request({url: "/sys/user/import",method: "post",data, // form-data类型 因为要上传文件类型});
}
上传成功
1、首先封装一个员工导入组件,利用elementUI提供的组件铺设静态页面,
2、给导入模板绑定点击事件,弹出弹层,封装下载Excel模板接口,调用接口,这里和导出一样,需要用到file-saver来下载模板。
3、给点击上传按钮绑定点击事件,这里我们使用的是模拟点击,其实真正被点击的是input文本框,由于它放置页面不太协调,所以采用模拟点击。
4、封装上传Excel模板文件接口,这里上传data必须是formdata类型,因为要上传文件类型,调用接口,监听change事件,当用户选择了文件,而且这个文件和上次的不一样,就会触发change,所以这里使用e.target.files,files是数组,如果files的长度大于0,说明有文件要上传,此时就把文件封装到formdata对象中,根据文档提示,这里需要file类型,然后将文件参数加入到formData中,成功就提示父组件刷新页面,关闭弹层,失败就清空文件,这里即使上传成功也一样要清空文件,所以使用finally来控制。