Django上传excel表格并将数据写入数据库

前言:

  最近公司领导要统计技术部门在各个业务条线花费的工时百分比,而 jira 当前的 Tempo 插件只能统计个人工时。于是就写了个报表工具,将 jira 中导出的个人工时excel表格 导入数据库,在后端处理各个业务工时占比。后来研究了 jira 的 API 文档 ,放弃了之前的思路,直接调用 jira  API 处理数据 ,这个先不谈。这篇博客主要介绍 Django 上传文件,然后解析 excel 导入数据库。

一、上传文件:

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

1.配置 setting.py

1# 文件上传配置 2UPLOAD_ROOT = os.path.join(BASE_DIR,'upload')

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

1{% extends 'base.html' %} 2 3{% block content %} 4<body> 5 <form id="form" enctype="multipart/form-data" action="/upload/" method="post"> 6 <p><input type="file" name="file"></p> 7 <input type="submit" name="提交"> 8 </form> 9</body> 10{% endblock %}

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

1@csrf_exempt 2def upload(request): 3 # 根name取 file 的值 4 file = request.FILES.get('file') 5 logger.log().info('uplaod:%s'% file) 6 # 创建upload文件夹 7 if not os.path.exists(settings.UPLOAD_ROOT): 8 os.makedirs(settings.UPLOAD_ROOT) 9 try: 10 if file is None: 11 return HttpResponse('请选择要上传的文件') 12 # 循环二进制写入 13 with open(settings.UPLOAD_ROOT + "/" + file.name, 'wb') as f: 14 for i in file.readlines(): 15 f.write(i) 16 except Exception as e: 17 return HttpResponse(e) 18 19 20 return HttpResponse('上传成功')

二、解析 excel  导入数据库

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

1# 将excel数据写入mysql 2def wrdb(filename): 3 # 打开上传 excel 表格 4 readboot = xlrd.open_workbook(settings.UPLOAD_ROOT + "/" + filename) 5 sheet = readboot.sheet_by_index(0) 6 #获取excel的行和列 7 nrows = sheet.nrows 8 ncols = sheet.ncols 9 print(ncols,nrows) 10 sql = "insert into working_hours (jobnum,name,workingtime,category,project,date,createtime) VALUES" 11 for i in range(1,nrows): 12 row = sheet.row_values(i) 13 jobnum = row[4] 14 name = row[5] 15 workingtime = row[2] 16 category = row[8] 17 project = row[1] 18 date = xldate_as_datetime(row[3],0).strftime('%Y/%m/%d') 19 values = "('%s','%s','%s','%s','%s','%s','%s')"%(jobnum,name,workingtime,category,project,date,datetime.datetime.now()) 20 sql = sql + values +"," 21  # 为了提高运行效率,一次性把数据 insert 进数据库   22 sql = sql[:-1] 23 # 写入数据库 24 # DataConnection 是自定义的公共模块,用的是第三方库,用来操作数据库。没有用 ORM ,后续有 group by 等复杂 sql 不好操作。 25 DataConnection.MysqlConnection().insert('work',sql) 26 27 28@csrf_exempt 29def upload(request): 30 # 根name取 file 的值 31 file = request.FILES.get('file') 32 print('uplaod:%s'% file) 33 # 创建upload文件夹 34 if not os.path.exists(settings.UPLOAD_ROOT): 35 os.makedirs(settings.UPLOAD_ROOT) 36 try: 37 if file is None: 38 return HttpResponse('请选择要上传的文件') 39 # 循环二进制写入 40 with open(settings.UPLOAD_ROOT + "/" + file.name, 'wb') as f: 41 for i in file.readlines(): 42 f.write(i) 43 44 # 写入 mysql 45 wrdb(file.name) 46 except Exception as e: 47 return HttpResponse(e) 48 49 return HttpResponse('导入成功')

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

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

java将前端的json数组字符串转换为列表

记录下在前端通过ajax提交了一个json数组的字符串,在后端如何转换为列表。前端数据转化与请求varcontracts{id:'1',name:'yanggb合同1'},{id:'2',name:'yanggb合同2'},{id:'3',name:'yang

Django上传excel表格并将数据写入数据库 - HelloWorld