Django上传excel表格并将数据写入数据库
前言:
最近公司领导要统计技术部门在各个业务条线花费的工时百分比,而 jira 当前的 Tempo 插件只能统计个人工时。于是就写了个报表工具,将 jira 中导出的个人工时excel表格 导入数据库,在后端处理各个业务工时占比。后来研究了 jira 的 API 文档 ,放弃了之前的思路,直接调用 jira API 处理数据 ,这个先不谈。这篇博客主要介绍 Django 上传文件,然后解析 excel 导入数据库。
一、上传文件:
将文件上传到服务器指定路径,其实很简单,一共有三个步骤:
1.配置 setting.py
- # 文件上传配置
- UPLOAD_ROOT = os.path.join(BASE_DIR,'upload')
2.前端代码如下,使用 <form> 表单提交,"/upload/" 路由配置在 urls 中,这个就不再多说了。
- {% 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.后端代码如下,这段代码可以上传任意格式的文件,没有校验文件类型。
- @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 表格,然后写入数据库。所以整个后端代码是这样的:
- # 将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.数据导入后,通过一些处理就得到了我们想要的数据。报表其中之一的饼图:
Django上传excel表格并将数据写入数据库的更多相关文章
- 【Javaweb】poi实现通过上传excel表格批量导入数据到数据库
1.导入poi相关jar包 对于只操作2003及以前版本的excel,只需要导入poi-XXX.jar ,如果还需要对2007及以后版本进行操作,则需要导入 poi-ooxml-XXX.jar poi ...
- 通过POI实现上传EXCEL的批量读取数据写入数据库
最近公司新增功能要求导入excel,并读取其中数据批量写入数据库.于是就开始了这个事情,之前的文章,记录了上传文件,本篇记录如何通过POI读取excel数据并封装为对象上传. 上代码: 1.首先这是一 ...
- Java -> 把Excel表格中的数据写入数据库与从数据库中读出到本地 (未完善)
写入:没有关闭流,容错并不完善. private void insertFile(HttpServletRequest request, HttpServletResponse response) t ...
- 微信公众平台上如何上传excel表格?
微信公众平台上如何上传excel表格? 我们都知道创建一个微信公众号,在公众号中发布一些文章是非常简单的,但公众号添加附件下载的功能却被限制,如今可以使用小程序“微附件”进行在公众号中添加附件. ...
- 怎么把excel表格内的数据导入数据库?
第一种方法: 思路:想要把excel表格内的数据直接导入数据库不是那么容易,可以把excel表格另存为.csv格式的文档(特点:内容以逗号分割):然后通过一系列的文档操作函数处理成为一个二维数组,然后 ...
- django上传excel文件
def uploadGrade(request): ''' 班级信息导入 :param request: :return: ''' if request.method == 'POST': f = r ...
- 【asp.net】asp.net实现上传Excel文件并读取数据
#前台代码:使用服务端控件实现上传 <form id="form1" runat="server"> <div> <asp:Fil ...
- Springboot 上传CSV文件并将数据存入数据库
.xml文件依赖配置 <!--csv依赖 --> <dependency> <groupId>org.apache.commons</groupId> ...
- eclipse中git推送上传错误 没有足够的数据写入
Can't connect to any repository: https://github.com/jiashubing/test.git (https://github.com/jiashubi ...
随机推荐
- Mac解决:xcode-select: error: command line tools are already installed, use "Software Update" to install updates
1.因为node项目终端报错: No receipt for 'com.apple.pkg.CLTools_Executables' found at '/'. No receipt for 'com ...
- Chrome开发者工具使用指南
前言 工欲善其事,必先利其器. 在前端工作中,我们常常使用到Chrome开发者工具去做各种各样的事情. 但是您真的了解这些开发者工具吗? 官方文档还是挺详细的:chrome-devtools文档. 但 ...
- pikachu-不安全的文件下载和上传
一.文件下载漏洞 1.1 概述 很多网站都会提供文件下载的功能,即用户可以通过点击下载链接,下载到链接所对应的文件.但是,如果文件下载功能设计不当,则可能导致攻击者可以通过构造文件路径,从而获 ...
- UML之三、建模元素(2)
本章继续介绍建模元素 https://blog.csdn.net/bit_kaki/article/details/78471760 1:边界 任何一个对象都有一个边界,外界只能通过这个边界来认识对象 ...
- Android 有关在ListView RecycleView 中使用EditText Checkbox的坑
这是一篇文字超多的博客,哈哈哈,废话自行过滤··· 遇到问题 在开发中我们常会在ListView , RecycleView 列表中添加EditText输入框,或者checkbox复选框. 复选框 ...
- Java基础之二、类的知识
类定义---方法及其处理的数据对象的集合结构 将现实的对象(物体)和概念映射到程序中的对象(变量)中 1:使用new运算符创建的类类型的主体称为实例,创建实例的操作称为实例化, new Account ...
- RAID | 故障处理
RAID | 故障处理 Unconfigured(good), Spun Up 背景:磁盘替换后在导入外部配置时提示失败,磁盘状态如题. MegaCli -pdgetmissing -a0查看miss ...
- 《茶余饭后小故事》MV*、MVC、MVP、MVVM的前世今生
今天我们讲讲历史,讲讲故事,不扯高深术语. MV*表示的意思是:M(Model逻辑层) + View(视图层) + *(中间者).上帝提出了这个逻辑与视图分离,用中间者进行连接的伟大思想,并将实现这个 ...
- Umi 小白纪实(二)—— model 的注册与使用
Umi 通常会搭配 Dva 使用,用于管理页面状态和逻辑 一.注册 model 首先需要在 .umirc.js 中启用 dva 插件 export default { plugins: [ ['umi ...
- zabbix默认监控负载取值不准确
今天碰到个负载高引起的问题但是查看zabbix监控并没有报警,检查后发现监控取值与实际服务器内负载不一致. 使用zabbix_get命令在服务器内测试 zabbix默认模板键值 取值内容 [root@ ...