You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改现有代码用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.27 00:27:03