如何修改现有代码用xlrd将Excel所有数据行上传至Django模型
Excel全量数据导入修改方案
原代码核心问题
- 硬编码固定读取第2行(xlrd行索引从0开始,即
rowx=1对应的行)数据,没有遍历工作表内的所有有效数据行,因此仅能导入单条记录 - 存在潜在代码缺陷:GET请求时
message变量未初始化,模板渲染时会触发变量未定义错误
关键修改逻辑
- 以表头行(索引0)为起点,循环遍历从第1行到工作表最后一行的所有行
- 增加空行校验,避免将Excel中的空白行作为无效数据入库
- 提前初始化模板上下文变量,解决代码运行报错
- 大数量导入场景可替换单条
save()为批量插入提升性能
修改后完整可运行代码
import os import tempfile import xlrd from django.shortcuts import render # 注:原有依赖的NewTeachersForm、TeacherData模型需保持正常导入 def UploadTeacherView(request): # 提前初始化message,避免GET请求时模板获取变量报错 message = '' if request.method == 'POST': form = NewTeachersForm(request.POST, request.FILES) if form.is_valid(): excel_file = request.FILES['file'] fd, path = tempfile.mkstemp() skipped_empty = 0 try: with os.fdopen(fd, 'wb') as tmp: tmp.write(excel_file.read()) book = xlrd.open_workbook(path) sheet = book.sheet_by_index(0) # 遍历范围:从第1行(跳过0行表头)到工作表最后一行 for row_idx in range(1, sheet.nrows): row_values = sheet.row_values(row_idx) # 校验当前行目标列范围是否全为空,空行则跳过计数 if not any(row_values[1:7]): skipped_empty += 1 continue TeacherData( school_id = row_values[1], code = row_values[2], first_name = row_values[3], last_name = row_values[4], email = row_values[5], phone = row_values[6], ).save() message = f'导入完成,共录入{sheet.nrows - 1 - skipped_empty}条有效教师数据' finally: os.remove(path) else: message = 'Invalid Entries' else: form = NewTeachersForm() return render(request,'new_teacher.html', {'form':form,'message':message})
可选性能优化
如果单次导入的教师数据量超过百条,可将循环内单条创建的对象存入临时列表,最后通过bulk_create批量插入数据库,大幅减少数据库IO开销:
# 循环内替换单条save()的逻辑 batch_objs = [] for row_idx in range(1, sheet.nrows): row_values = sheet.row_values(row_idx) if not any(row_values[1:7]): skipped_empty +=1 continue batch_objs.append(TeacherData( school_id = row_values[1], code = row_values[2], first_name = row_values[3], last_name = row_values[4], email = row_values[5], phone = row_values[6], )) # 循环结束后一次性批量插入 TeacherData.objects.bulk_create(batch_objs)
内容的提问来源于stack exchange,提问作者fakeMake
相关产品推荐
相关产品推荐

