• django上传excel并读入数据库


    在web开发中,难免会遇到批量导入信息的操作。一般来说,给一个excel模版然后自己在本地填写完成后提交,并上传到对应的数据库中。在此之前,我也看了不少人的代码,但是运行起来都或多或少存在问题,所以索性写了这篇博客,以供参考和学习。

    当然在上传到数据库中后需要对表的内容进行对比,然后筛选出相应的内容,这将是我后面需要写的内容了,这一部分其实没什么好说的了,就是简单的读,可以使用多种方法来进行。

    关于django-admin startprocject项目等架构,包括设置settings.py和ORM建表命令等请参考我之前的博客内容,不再做过多的阐释了。这是我的测试项目文件目录。
    在这里插入图片描述

    在视图部分,建了跳转页面与上传文件的视图函数,在视图函数中也包含了对数据库的操作(见models.py)
    需要上传的excel文件,注意格式是 xlsx
    在这里插入图片描述

    views.py 注意xlrd需要下载1.2.0,如果版本过高存在无法读取xlrd的情况。其中为了方便,我在中途打印了里面的数据,以测试是否正常。

    import xlrd
    from django.db import transaction
    
    from django.shortcuts import render,HttpResponse,redirect
    from TestDjan import models
    
    def upload(request):
        return render(request,"upload.html")
    
    def excel_upload(request):
        if request.method == "POST":
            file=request.FILES['my_file']
            print(file)
            type_file = file.name.split('.')[1]
            print(type_file)
            if type_file == 'xlsx':
                read_file = xlrd.open_workbook(filename=None,file_contents=file.read())
                file_table = read_file.sheets()[0]
                print(file_table)
                file_table_rows = file_table.nrows
                print(file_table_rows)
    
                try:
                    with transaction.atomic():
                    	# 读表格数据,从第二行开始,一般第一行都是说明
                        for i in range(1,file_table_rows):
                            print(i)
                            a=file_table.cell(i,0)
                            print(a.value)
                            b= file_table.cell(i,1)
                            print(b.value)
                            c=file_table.cell(i,2)
                            print(c.value)
                            models.test_excel_info.objects.create(name=a.value,pcnum=b.value,cause=c.value)
                except Exception as e:
                    return render(request,"upload1.html",{'msg':e})
                return render(request,"upload1.html",{'msg':"suss"})
            return HttpResponse(render(request,"upload1.html",{'msg':"no"}))
        return HttpResponse(render(request,"upload1.html",{'msg':"none"}))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39

    models.py ,这里是简单的一个表结构,不要忘记使用建表命令。

    from django.db import models
    
    class test_excel_info(models.Model):
        name = models.CharField('名称',max_length=20)
        pcnum = models.CharField('电脑编号',max_length=30)
        cause = models.CharField('理由',max_length=30)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    urls.py

    	path('upload/',views.upload),
        path('upload1',views.excel_upload),
    
    • 1
    • 2

    下面是简单的前端测试代码:
    upload.html,这是此页面
    在这里插入图片描述

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <form action="/upload1" method="post" enctype="multipart/form-data">
    
            {% csrf_token %}
            <input type="file" name="my_file">
            <input type="submit" value="提交">
        </form>
        <a href="/download_template" >点击下载模版文件</a>
    </body>
    </html>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    选择浏览文件,点击上传后的页面,符合前面的逻辑。
    在这里插入图片描述
    upload1.html

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    {{ msg }}
    </body>
    </html>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    进入到suss说明已经成功了,可以选择在数据库中查看是否已经导入完毕:
    在这里插入图片描述
    当然了,这是上传的excel工作,为了保证实际工作中不引起格式的混乱,将在前端页面中展示相应的下载模版文件选项。
    views.py

    def download_template(request):
        file = open('Templates/test.xlsx', 'rb') # 路径不要写错了。
        response = FileResponse(file)
        response['Content-Type'] = 'application/octet-stream'
        response['Content-Disposition'] = 'attachment;filename="test.xlsx"'
        return response
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    urls.py

    	path('download_template/',views.download_template),
    
    • 1

    前端页面也在upload.html给出。

    以上就是在django框架体系中对excel下载与上传内容。

  • 相关阅读:
    【JavaScript系列】01_初识JS
    探索未来科技:量子计算的前沿与挑战
    javascript的键值对的问题
    实力认证|万应工场荣膺2022中国低代码平台行业应用卓越奖!
    一种语音情感深度迁移识别算法
    linux基本指令(上)
    骑士CMS01 74cms v4.2.111 后台getshell漏洞复现
    敏捷开发最佳实践:质量维度实践案例之软硬一体持续交付
    Spring 声明式事务机制
    web前端期末大作业:基于HTML+CSS+JavaScript奥迪企业bootstrap响应式网站
  • 原文地址:https://blog.csdn.net/QAZJOU/article/details/126299161