1.前端部分
1.1 api设置
// 导入用户
export function uploadUser(data) {const formData = new FormData();formData.append('file', data); // data 是从文件上传事件中获取的文件对象return request({url: '/users/upload',method: 'post',headers: {'Content-Type': 'multipart/form-data'},data: formData,transformRequest: [(data) => data] // 禁用默认的序列化行为})
}
1.2 导入按钮
<el-uploadclass="upload-demo"ref="upload"action="dummy-action":show-file-list="false" :before-upload="handleImportUser"><el-button type="primary" icon="el-icon-download" style="margin-left: 20px">导入</el-button></el-upload>
1.3 按钮点击事件调用接口
// 导入的回调async handleImportUser(file) {if (!file.name.endsWith('.xlsx')) return this.$message.error('请上传Excel文件!')if (file.size > 1024 * 1024 * 5) return this.$message.error('文件大小不能超过5MB!')const res = await uploadUser(file)if (res.code !== 200) return this.$message.error('导入失败!')this.$message.success('导入成功!')this.getUserList()}
2. 后端部分
@user_router.post('/upload', summary='导入用户')
async def user_upload(file: UploadFile):# 检查文件类型是否为 Excelif not file.filename.endswith(('.xls', '.xlsx')):return base_response(code=400, msg='文件格式错误!')if file.size > 1024 * 1024 * 5:return base_response(code=400, msg='文件大小不能超过5MB!')# 读取 Excel 文件wb = openpyxl.load_workbook(file.file)ws = wb.active# 遍历 Excel 表格的每一行数据并保存到数据库中for row in ws.iter_rows(min_row=2, values_only=True): # Assuming first row is headertry:name, nick_name, phone, password = row# 数据校验if not name or not password:raise ValueError('姓名和密码不能为空!')if await User.exists(name=name):raise ValueError('用户已存在!')if not re.match(r'^1[3-9]\d{9}$', str(phone)):raise ValueError('手机号码格式错误!')# 将有效数据保存到数据库中,这里假设有一个数据库操作函数 save_user()await User.create(name=name, nick_name=nick_name, phone=phone, password=hash_password(str(password)))except ValueError as e:print(f"数据导入失败:{e}")return base_response(code=200, msg='导入用户成功!')