Django框架上传excel表格并将数据写入数据库超详细步骤

一、上传文件:

将文件上传到服务器指定路径,其实很简单,一共有三个步骤:

1.配置 setting.py

1

2

# 文件上传配置

UPLOAD_ROOT = os.path.join(BASE_DIR,'upload')

2.前端代码如下,使用 <form> 表单提交,"/upload/" 路由配置在 urls 中,这个就不再多说了。

1

2

3

4

5

6

7

8

9

10

{% extends 'base.html' %}

{% block content %}

<body>

     <form id="form"  enctype="multipart/form-data" action="/upload/" method="post">

      <p><input type="file"  name="file"></p>

         <input type="submit" name="提交">

    </form>

</body>

{% endblock %}

3.后端代码如下,这段代码可以上传任意格式的文件,没有校验文件类型。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

@csrf_exempt

def upload(request):

    # 根name取 file 的值

    file = request.FILES.get('file')

    logger.log().info('uplaod:%s'% file)

    # 创建upload文件夹

    if not os.path.exists(settings.UPLOAD_ROOT):

        os.makedirs(settings.UPLOAD_ROOT)

    try:

        if file is None:

            return HttpResponse('请选择要上传的文件')

        # 循环二进制写入

        with open(settings.UPLOAD_ROOT + "/" + file.name, 'wb') as f:

            for i in file.readlines():

                f.write(i)

    except Exception as e:

        return HttpResponse(e)

    return HttpResponse('上传成功')

二、解析 excel 导入数据库

1.文件上传结束后,接下来读取刚上传到服务器的 excel 表格,然后写入数据库。所以整个后端代码是这样的:

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

40

41

42

43

44

45

46

47

# 将excel数据写入mysql

def wrdb(filename):

    # 打开上传 excel 表格

    readboot = xlrd.open_workbook(settings.UPLOAD_ROOT + "/" + filename)

    sheet = readboot.sheet_by_index(0)

    #获取excel的行和列

    nrows = sheet.nrows

    ncols = sheet.ncols

    print(ncols,nrows)

    sql = "insert into working_hours (jobnum,name,workingtime,category,project,date,createtime) VALUES"

    for i in range(1,nrows):

        row = sheet.row_values(i)

        jobnum = row[4]

        name = row[5]

        workingtime = row[2]

        category = row[8]

        project = row[1]

        date = xldate_as_datetime(row[3],0).strftime('%Y/%m/%d')

        values = "('%s','%s','%s','%s','%s','%s','%s')"%(jobnum,name,workingtime,category,project,date,datetime.datetime.now())

        sql = sql + values +","

    # 为了提高运行效率,一次性把数据 insert 进数据库   

    sql = sql[:-1]

    # 写入数据库 

    # DataConnection 是自定义的公共模块,用的是第三方库,用来操作数据库。没有用 ORM ,后续有 group by 等复杂 sql 不好操作。

    DataConnection.MysqlConnection().insert('work',sql)

@csrf_exempt

def upload(request):

    # 根name取 file 的值

    file = request.FILES.get('file')

    print('uplaod:%s'% file)

    # 创建upload文件夹

    if not os.path.exists(settings.UPLOAD_ROOT):

        os.makedirs(settings.UPLOAD_ROOT)

    try:

        if file is None:

            return HttpResponse('请选择要上传的文件')

        # 循环二进制写入

        with open(settings.UPLOAD_ROOT + "/" + file.name, 'wb') as f:

            for i in file.readlines():

                f.write(i)

        # 写入 mysql

        wrdb(file.name)

    except Exception as e:

        return HttpResponse(e)

    return HttpResponse('导入成功')

2.数据导入后,通过一些处理就得到了我们想要的数据。报表其中之一的饼图:

  • 22
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
前端部分: 1.使用vue框架编写前端页面,包括上传控件和表格展示区域。 2.使用axios库将文件上传后端服务器: ```javascript methods: { /* 上传Excel文件 */ handleUpload (file) { let formData = new FormData() formData.append('file', file) axios.post('/upload/excel', formData) .then(res => { /* 处理返回的数据,例如将表格数据展示在页面上 */ }).catch(err => { console.error(err) }) }, } ``` 3.在页面上展示表格数据: ```javascript data () { return { tableData: [] // 表格数据数组 } }, methods: { /* 处理上传Excel文件返回的表格数据 */ handleTableData (data) { /* 将data解析成表格数据数组,例如: for (let i = 0; i < data.length; i++) { this.tableData.push({ id: data[i].id, name: data[i].name, ... }) } */ }, }, ``` 4.将表格数据展示在页面的table组件中: ```html <el-table :data="tableData"> <el-table-column prop="id" label="ID"></el-table-column> <el-table-column prop="name" label="名称"></el-table-column> ... </el-table> ``` 后端部分: 1.使用django框架编写后端接口,包括文件上传接口和表格数据查询接口。 2.使用pandas库处理Excel文件,并将数据写入数据库: ```python import pandas as pd from .models import TableModel def upload_excel(request): file = request.FILES['file'] data = pd.read_excel(file) # 将数据写入数据库 for index, row in data.iterrows(): TableModel.objects.update_or_create( id=row['id'], defaults={ 'name': row['name'], ... } ) return HttpResponse('success') ``` 3.查询数据库并返回表格数据: ```python from .models import TableModel def get_table_data(request): data = [] for row in TableModel.objects.all(): data.append({ 'id': row.id, 'name': row.name, ... }) return JsonResponse(data, safe=False) ``` 4.配置路由,使前后端能够通过接口进行通信: ```python from django.conf.urls.static import static from django.conf import settings from django.urls import path from . import views urlpatterns = [ path('upload/excel', views.upload_excel), path('get/table', views.get_table_data), ] urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) ``` 需要注意的是,在上传Excel文件的时候,需要在django的settings文件中设置MEDIA_ROOT和MEDIA_URL。在前端页面中的表格数据展示组件中,需要填写表格数据的属性名和标签名,以及请求接口的地址和方法等信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zxj19880502

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值