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='導入用戶成功!')