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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 21:50:06