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


使用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文件中导入的数据。以下是一个示例模型,用于存储计算机产品信息:

# 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,以确保序列号的唯一性。

Krikey AI Krikey AI

Krikey AI 113 查看详情 Krikey AI

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)。
  • :允许用户选择文件。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_

以上就是使用openpyxl在Django中实现Excel数据批量导入的详细内容,更多请关注其它相关文章!


# 微博推广营销的三种类型  # 表单  # 如何在  # 请选择  # 上传  # 创建一个  # 如何用  # 兰州营销型网站推广  # 滁州整合营销推广哪里有  # 是一个  # 营销推广方案模板范本  # 佛山网站快速建设  # seo教程案例 杨圣亮  # 江苏营销推广质量保证  # 东城区网站建设维护  # 济南抖音快速推广引流营销  # 灵宝网站建设报价  # app  # python  # html  # 前端  # go  # 计算机  # 处理器  # 编码  # 浏览器  # excel  # 硬盘  # 后端  # ai  # 数据清洗  # dja  # 文件上传  # 跳过 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 优化推广96088 】 【 技术知识133117 】 【 IDC资讯59369 】 【 网络运营7196 】 【 IT资讯61894 】


相关推荐: 键盘保修需要什么_键盘售后维修流程  三星M34录音变声问题_Samsung M34麦克风调整  HTML Canvas文本样式定制指南:解决外部字体加载与应用难题  小红书网页版怎么进 小红书网页版通用入口  CSS如何在页面中引入重置样式_使用Normalize.css或Reset.css统一浏览器默认样式  windows10怎么开启wsl_windows10安装linux子系统教程  谷歌浏览器官方镜像获取方法_谷歌浏览器网页版入口极速直达  使用TinyButStrong生成HTML并结合Dompdf创建PDF教程  composer licenses 命令:如何检查项目依赖的许可证?  漫蛙manwa2网页版书签同步链接_漫蛙manwa多设备登录入口  网页版网易云音乐入口_网易云音乐在线官网登录  《咸鱼之王》新版孙坚技能解析  一点万象签到领积分指南  windows10怎么关闭自动安装应用_windows10禁止推广应用下载  Python实战:高效处理实时数据流中的最小/最大值  《偃武》甘宁技能详解  发布小红书怎么屏蔽粉丝?屏蔽粉丝能看到吗?  抖音团长模式怎么做?团长模式是什么意思?  mysql归档数据怎么导出为csv_mysql归档数据导出为csv文件的方法  照片整理的黄金法则是怎样的? 理解“收集-筛选-归档-备份”四步流程  163邮箱登录入口官网 163.com邮箱登录入口  iPhone 14 Pro如何更改区域设置_iPhone 14 Pro地区语言修改教程  qq邮箱格式填写示例 qq邮箱标准填写规范  《密马》发布账号方法  多闪APP官方下载安装入口_多闪最新版本获取入口  虫虫助手如何更新游戏  圆通快递官方入口不需要登录 在线查询入口快速查询  教育查询官方网站入口 教育个人档案查询免费官网  招商淘客入门指南  realme 10 Pro息屏方案_realme 10 Pro省电策略  《万兴喵影》导出视频方法  如何在CSS中使用过渡制作按钮边框渐变_border-color transition实现  掌握Go App Engine项目结构与GOPATH:包管理与导入实践  苹果手机如何清理系统缓存数据 iPhone非越狱清理垃圾文件的技巧【系统优化】  如何配置VS Code作为您Git操作的默认编辑器  抖音网页版官方链接 抖音网页版官网链接入口  Python模块化编程:避免循环导入与共享函数的最佳实践  Go语言中方法接收器的选择:值类型还是指针类型?  Symfony路由参数转换器:实体存在性验证与错误处理策略  抖音商城官网是什么_抖音商城官方网址与访问方法  php如何实现多域名共享session_php存储session到redis与跨域读取配置  苹果iPhone14ProMax如何新建AppleID_iPhone14ProMax新建AppleID具体流程  荣耀 Magic10 Pro 系统更新提示失败_荣耀 Magic10 Pro 升级修复  J*aScript事件处理:优化键盘输入与表单提交的实践指南  如何修改Windows截图的默认保存位置_告别C盘让桌面更整洁【教程】  4399正版网页版入口高清直达链接  j*a中赋值运算符是什么?  深入理解Python对象引用与链表属性赋值  Win10共享文件夹设置方法 Win10局域网文件共享全攻略【教程】  铁路12306买票怎么选双人铺 铁路12306卧铺分配规则说明 

 2025-12-04

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

运城市盐湖区信雨科技有限公司


运城市盐湖区信雨科技有限公司

运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。

 8156699

 13765294890

 8156699@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.