html
<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">
<!-- update:props属性名,值 直接修改 .sync修饰符的属性值 -->
<el-button
size="mini"
type="primary"
@click="$emit('update:showExcelDialog', false)"
>取消</el-button
>
</el-row>
</el-dialog>
</template>
点击上传-弹出文件选择框
html
<el-button type="text" @click="handleUpload">点击上传</el-button>
javascript
methods:{
// 上传
handleUpload() {
this.$refs["excel-upload-input"].click();// this.$refs.属性名 和 this.$refs[属性名] 等价
},
}
监听文件改变-上传excel-关闭弹层
javascript
<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类型 因为要上传文件类型
});
}
上传成功
1、首先封装一个员工导入组件,利用elementUI提供的组件铺设静态页面,
2、给导入模板绑定点击事件,弹出弹层,封装下载Excel模板接口,调用接口,这里和导出一样,需要用到file-saver来下载模板。
3、给点击上传按钮绑定点击事件,这里我们使用的是模拟点击,其实真正被点击的是input文本框,由于它放置页面不太协调,所以采用模拟点击。
4、封装上传Excel模板文件接口,这里上传data必须是formdata类型,因为要上传文件类型,调用接口,监听change事件,当用户选择了文件,而且这个文件和上次的不一样,就会触发change,所以这里使用e.target.files,files是数组,如果files的长度大于0,说明有文件要上传,此时就把文件封装到formdata对象中,根据文档提示,这里需要file类型,然后将文件参数加入到formData中,成功就提示父组件刷新页面,关闭弹层,失败就清空文件,这里即使上传成功也一样要清空文件,所以使用finally来控制。