如何在Django中读取选中Excel文件列并导入多表头数据至模型
多表头Excel指定列数据导入Django模型步骤
1. 安装依赖工具
处理多表头Excel用pandas最省心,搭配openpyxl读取xlsx格式文件,先装依赖:
pip install pandas openpyxl
2. 读取并规整多表头Excel
假设你的Excel是双层表头(比如第一行是分类、第二行是具体字段),先读取文件并把表头改成和Django模型匹配的字段名:
import pandas as pd # header=[0,1]表示用前两行作为表头 df = pd.read_excel('你的文件路径.xlsx', header=[0,1]) # 重命名列(把双层表头简化成模型对应字段,比如原表头是("用户信息", "姓名"),改成"name") df.columns = ['name', 'phone', 'email', 'address'] # 按你实际需要的列顺序命名 # 只保留需要导入的列 selected_df = df[['name', 'phone', 'email']]
3. 清洗数据
导入前先处理空值、异常格式,避免出错:
# 去掉关键字段(比如姓名)为空的行 selected_df = selected_df.dropna(subset=['name']) # 把手机号转成字符串(防止Excel里的长数字变成科学计数法) selected_df['phone'] = selected_df['phone'].astype(str)
4. 导入Django模型
方法一:在Django Shell临时操作
先激活Django环境:
python manage.py shell
然后执行导入代码:
from myapp.models import Person # 替换成你的模型路径 import pandas as pd # 重复步骤2、3的读取和清洗逻辑 df = pd.read_excel('你的文件路径.xlsx', header=[0,1]) df.columns = ['name', 'phone', 'email'] selected_df = df[['name', 'phone', 'email']].dropna(subset=['name']) selected_df['phone'] = selected_df['phone'].astype(str) # 用get_or_create避免重复导入同一数据 for _, row in selected_df.iterrows(): Person.objects.get_or_create( name=row['name'], defaults={ 'phone': row['phone'], 'email': row['email'] } )
方法二:写自定义管理命令(适合重复使用)
在你的app下创建management/commands目录,新建import_excel.py文件:
from django.core.management.base import BaseCommand from myapp.models import Person import pandas as pd class Command(BaseCommand): help = '导入多表头Excel数据到Person模型' def handle(self, *args, **options): # 读取并处理Excel df = pd.read_excel('你的文件路径.xlsx', header=[0,1]) df.columns = ['name', 'phone', 'email'] selected_df = df[['name', 'phone', 'email']].dropna(subset=['name']) selected_df['phone'] = selected_df['phone'].astype(str) # 用bulk_create批量导入,数据量大时效率更高 persons = [] for _, row in selected_df.iterrows(): persons.append(Person( name=row['name'], phone=row['phone'], email=row['email'] )) Person.objects.bulk_create(persons) self.stdout.write(self.style.SUCCESS('数据导入完成'))
然后运行命令完成导入:
python manage.py import_excel
注意事项
- 用绝对路径指定Excel文件,避免因路径问题报错
- 确保Excel数据类型和Django模型字段匹配:比如邮箱列格式要符合
EmailField要求,日期列要转成datetime类型 bulk_create效率高但不会触发模型的save信号,也不自动去重,需要提前处理重复数据
内容的提问来源于stack exchange,提问作者user25037826
相关产品推荐
相关产品推荐

