0

0

使用openpyxl在Django中实现Excel数据批量导入

DDD

DDD

发布时间:2025-12-04 13:02:33

|

477人浏览过

|

来源于php中文网

原创

使用openpyxl在django中实现excel数据批量导入

本教程详细指导如何在Django项目中实现Excel文件数据批量导入功能。我们将涵盖环境配置、前端文件上传表单的构建、后端视图逻辑处理,包括使用`openpyxl`库解析Excel文件、逐行读取数据并将其高效地保存到Django模型中,以及提供必要的代码示例和注意事项,帮助开发者轻松集成此功能。

在现代Web应用中,批量导入数据是一个常见需求,尤其是在需要初始化大量数据或定期更新数据时。手动输入效率低下且易出错,而通过Excel文件导入则能大大提高效率。本教程将以一个计算机产品管理系统为例,演示如何在Django中实现这一功能。

1. 准备工作:安装依赖

实现Excel文件导入功能的核心是使用一个能够解析Excel文件的Python库。openpyxl是广泛推荐且功能强大的选择,它支持读写.xlsx格式的Excel文件。

首先,请确保你的Python环境中安装了openpyxl:

pip install openpyxl

2. 定义Django模型

我们需要一个Django模型来存储从Excel文件中导入的数据。以下是一个示例模型,用于存储计算机产品信息:

MusicAI
MusicAI

AI音乐生成工具

下载
# myapp/models.py
from django.db import models
from django.utils import timezone

class Product(models.Model):
    """
    用于存储计算机产品信息的模型。
    """
    model = models.CharField(max_length=50, null=True, verbose_name="型号")
    serial = models.CharField(max_length=50, null=True, verbose_name="序列号", unique=True) # 序列号通常是唯一的
    hd_size = models.CharField(max_length=50, null=True, verbose_name="硬盘大小")
    ram = models.CharField(max_length=50, null=True, verbose_name="内存")
    processor = models.CharField(max_length=50, null=True, verbose_name="处理器")
    date_created = models.DateTimeField(default=timezone.now, verbose_name="创建日期")
    date_updated = models.DateTimeField(auto_now=True, verbose_name="更新日期")

    class Meta:
        verbose_name = "产品"
        verbose_name_plural = "产品"
        ordering = ['-date_created'] # 按创建日期降序排序

    def __str__(self):
        return f"{self.serial} - {self.model}"

这个Product模型定义了计算机的型号、序列号、硬盘大小、内存和处理器等字段,以及创建和更新时间戳。注意,我们将serial字段设置为unique=True,以确保序列号的唯一性。

3. 创建文件上传前端页面

用户需要一个界面来选择并上传Excel文件。这通常通过一个HTML表单实现,该表单必须包含enctype="multipart/form-data"属性,以便正确处理文件上传。

创建一个名为import_product.html的模板文件(例如,在myapp/templates/myapp/目录下):

<!-- myapp/templates/myapp/import_product.html -->
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>导入产品数据</title>
    <style>
        body { font-family: Arial, sans-serif; background-color: #f4f4f4; padding: 20px; }
        .container { max-width: 600px; margin: 0 auto; background-color: #fff; padding: 30px; border-radius: 8px; box-shadow: 0 2px 10px rgba(0,0,0,0.1); }
        h1 { color: #333; text-align: center; margin-bottom: 30px; }
        p { color: #555; font-size: 16px; margin-bottom: 20px; text-align: center; }
        form { display: flex; flex-direction: column; align-items: center; }
        input[type="file"] { margin-bottom: 20px; padding: 10px; border: 1px solid #ddd; border-radius: 4px; width: 100%; max-width: 300px; }
        button { background-color: #007bff; color: white; padding: 10px 20px; border: none; border-radius: 4px; cursor: pointer; font-size: 16px; transition: background-color 0.3s ease; }
        button:hover { background-color: #0056b3; }
        .error-message { color: red; text-align: center; margin-top: 15px; font-weight: bold; }
        .success-message { color: green; text-align: center; margin-top: 15px; font-weight: bold; }
        .back-button { display: block; text-align: center; margin-top: 25px; }
        .back-button button { background-color: #6c757d; }
        .back-button button:hover { background-color: #5a6268; }
    </style>
</head>
<body>
    <div class="container">
        <h1>导入产品数据</h1>
        <p>请选择一个包含计算机产品信息的Excel文件进行导入。</p>

        {% if error_message %}
            <p class="error-message">{{ error_message }}</p>
        {% endif %}
        {% if success_message %}
            <p class="success-message">{{ success_message }}</p>
        {% endif %}

        <form method="post" enctype="multipart/form-data">
            {% csrf_token %}
            <input type="file" name="excel_file" accept=".xlsx, .xls">
            <button type="submit">开始导入</button>
        </form>

        <div class="back-button">
            <button onclick="history.back()">返回上一页</button>
        </div>
    </div>
</body>
</html>
  • enctype="multipart/form-data":这是处理文件上传的关键属性,确保浏览器以正确的方式编码文件数据。
  • {% csrf_token %}:Django的安全机制,用于防止跨站请求伪造攻击(CSRF)。
  • <input type="file" name="excel_file">:允许用户选择文件。name="excel_file"是后端视图中获取文件的键。
  • accept=".xlsx, .xls": 建议添加此属性以限制用户只能选择Excel文件类型,提高用户体验并减少后端不必要的文件类型检查。
  • onclick="history.back()": 提供一个简单的返回按钮,提升用户导航体验。

4. 实现后端导入逻辑

在Django的views.py文件中,我们将创建一个视图函数来处理文件上传和数据导入。

# myapp/views.py
import openpyxl
from django.shortcuts import render, redirect
from django.urls import reverse
from .models import Product # 假设Product模型在当前应用的models.py中

def import_product(request):
    """
    处理Excel文件上传并导入产品数据到数据库。
    """
    if request.method == 'POST':
        # 1. 获取上传的Excel文件
        if 'excel_file' not in request.FILES:
            return render(request, 'myapp/import_product.html', {'error_message': '请选择一个Excel文件。'})

        excel_file = request.FILES['excel_file']

        # 2. 验证文件类型(可选但推荐)
        # 检查文件扩展名是否为 .xlsx 或 .xls
        if not excel_file.name.endswith(('.xlsx', '.xls')):
            return render(request, 'myapp/import_product.html', {'error_message': '文件类型不正确,请上传Excel文件(.xlsx或.xls)。'})

        imported_count = 0
        errors = []

        try:
            # 3. 加载Excel工作簿
            wb = openpyxl.load_workbook(excel_file)
            # 4. 获取活动工作表(或指定名称的工作表,例如 wb['Sheet1'])
            ws = wb.active 

            # 用于批量创建对象的列表
            products_to_create = []

            # 5. 遍历工作表中的每一行数据
            # min_row=2 表示从第二行开始读取,跳过表头
            for row_idx, row in enumerate(ws.iter_rows(min_row=2, values_only=True), start=2):
                try:
                    # 6. 解包行数据并准备创建Product实例
                    # 确保Excel列的顺序与模型的字段顺序一致:型号, 序列号, 硬盘大小, 内存, 处理器
                    if len(row) < 5: # 检查列数是否足够
                        errors.append(f"第 {row_idx} 行数据不完整,跳过。")
                        continue

                    model, serial, hd_size, ram, processor = row[:5] # 只取前5列

                    # 简单的数据清洗和验证
                    if not serial:
                        errors.append(f"第 {row_idx} 行序列号为空,跳过。")
                        continue

                    # 检查序列号是否已存在 (在批量创建前进行预检查)
                    if Product.objects.filter(serial=serial).exists():
                        errors.append(f"第 {row_idx} 行序列号 '{serial}' 已存在,跳过。")
                        continue

                    products_to_create.append(Product(
                        model=model, 
                        serial=serial, 
                        hd_size=hd_

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
Python Web 框架 Django 深度开发
Python Web 框架 Django 深度开发

本专题系统讲解 Python Django 框架的核心功能与进阶开发技巧,包括 Django 项目结构、数据库模型与迁移、视图与模板渲染、表单与认证管理、RESTful API 开发、Django 中间件与缓存优化、部署与性能调优。通过实战案例,帮助学习者掌握 使用 Django 快速构建功能全面的 Web 应用与全栈开发能力。

167

2026.02.04

点击input框没有光标怎么办
点击input框没有光标怎么办

点击input框没有光标的解决办法:1、确认输入框焦点;2、清除浏览器缓存;3、更新浏览器;4、使用JavaScript;5、检查硬件设备;6、检查输入框属性;7、调试JavaScript代码;8、检查页面其他元素;9、考虑浏览器兼容性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

197

2023.11.24

excel对比两列数据异同
excel对比两列数据异同

Excel作为数据的小型载体,在日常工作中经常会遇到需要核对两列数据的情况,本专题为大家提供excel对比两列数据异同相关的文章,大家可以免费体验。

1455

2023.07.25

excel重复项筛选标色
excel重复项筛选标色

excel的重复项筛选标色功能使我们能够快速找到和处理数据中的重复值。本专题为大家提供excel重复项筛选标色的相关的文章、下载、课程内容,供大家免费下载体验。

428

2023.07.31

excel复制表格怎么复制出来和原来一样大
excel复制表格怎么复制出来和原来一样大

本专题为大家带来excel复制表格怎么复制出来和原来一样大相关文章,帮助大家解决问题。

573

2023.08.02

excel表格斜线一分为二
excel表格斜线一分为二

在Excel表格中,我们可以使用斜线将单元格一分为二。本专题为大家带来excel表格斜线一分为二怎么弄的相关文章,希望可以帮到大家。

1264

2023.08.02

excel斜线表头一分为二
excel斜线表头一分为二

excel斜线表头一分为二的方法有使用合并单元格功能方法、使用文本框功能方法、使用自定义格式方法。本专题为大家提供excel斜线表头一分为二相关的各种文章、以及下载和课程。

377

2023.08.02

绝对引用的输入方法
绝对引用的输入方法

绝对引用允许在公式中引用一个固定的单元格,而不会随着公式的复制和粘贴而改变引用的单元格。本专题为大家提供绝对引用相关内容的文章,大家可以免费体验。

4564

2023.08.09

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

49

2026.03.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Excel 教程
Excel 教程

共162课时 | 21.4万人学习

成为PHP架构师-自制PHP框架
成为PHP架构师-自制PHP框架

共28课时 | 2.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号