前言:

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

一、上传文件:

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

1.配置 setting.py

  1. # 文件上传配置
  2. UPLOAD_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
  2. def 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. return HttpResponse('上传成功')

二、解析 excel  导入数据库

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

  1. # 将excel数据写入mysql
  2. def 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. @csrf_exempt
  28. def upload(request):
  29. # 根name取 file 的值
  30. file = request.FILES.get('file')
  31. print('uplaod:%s'% file)
  32. # 创建upload文件夹
  33. if not os.path.exists(settings.UPLOAD_ROOT):
  34. os.makedirs(settings.UPLOAD_ROOT)
  35. try:
  36. if file is None:
  37. return HttpResponse('请选择要上传的文件')
  38. # 循环二进制写入
  39. with open(settings.UPLOAD_ROOT + "/" + file.name, 'wb') as f:
  40. for i in file.readlines():
  41. f.write(i)
  42.  
  43. # 写入 mysql
  44. wrdb(file.name)
  45. except Exception as e:
  46. return HttpResponse(e)
  47.  
  48. return HttpResponse('导入成功')

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

Django上传excel表格并将数据写入数据库的更多相关文章

  1. 【Javaweb】poi实现通过上传excel表格批量导入数据到数据库

    1.导入poi相关jar包 对于只操作2003及以前版本的excel,只需要导入poi-XXX.jar ,如果还需要对2007及以后版本进行操作,则需要导入 poi-ooxml-XXX.jar poi ...

  2. 通过POI实现上传EXCEL的批量读取数据写入数据库

    最近公司新增功能要求导入excel,并读取其中数据批量写入数据库.于是就开始了这个事情,之前的文章,记录了上传文件,本篇记录如何通过POI读取excel数据并封装为对象上传. 上代码: 1.首先这是一 ...

  3. Java -> 把Excel表格中的数据写入数据库与从数据库中读出到本地 (未完善)

    写入:没有关闭流,容错并不完善. private void insertFile(HttpServletRequest request, HttpServletResponse response) t ...

  4. 微信公众平台上如何上传excel表格?

    微信公众平台上如何上传excel表格?   我们都知道创建一个微信公众号,在公众号中发布一些文章是非常简单的,但公众号添加附件下载的功能却被限制,如今可以使用小程序“微附件”进行在公众号中添加附件. ...

  5. 怎么把excel表格内的数据导入数据库?

    第一种方法: 思路:想要把excel表格内的数据直接导入数据库不是那么容易,可以把excel表格另存为.csv格式的文档(特点:内容以逗号分割):然后通过一系列的文档操作函数处理成为一个二维数组,然后 ...

  6. django上传excel文件

    def uploadGrade(request): ''' 班级信息导入 :param request: :return: ''' if request.method == 'POST': f = r ...

  7. 【asp.net】asp.net实现上传Excel文件并读取数据

    #前台代码:使用服务端控件实现上传 <form id="form1" runat="server"> <div> <asp:Fil ...

  8. Springboot 上传CSV文件并将数据存入数据库

    .xml文件依赖配置 <!--csv依赖 --> <dependency> <groupId>org.apache.commons</groupId> ...

  9. eclipse中git推送上传错误 没有足够的数据写入

    Can't connect to any repository: https://github.com/jiashubing/test.git (https://github.com/jiashubi ...

随机推荐

  1. 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 ...

  2. Chrome开发者工具使用指南

    前言 工欲善其事,必先利其器. 在前端工作中,我们常常使用到Chrome开发者工具去做各种各样的事情. 但是您真的了解这些开发者工具吗? 官方文档还是挺详细的:chrome-devtools文档. 但 ...

  3. pikachu-不安全的文件下载和上传

    一.文件下载漏洞 1.1 概述     很多网站都会提供文件下载的功能,即用户可以通过点击下载链接,下载到链接所对应的文件.但是,如果文件下载功能设计不当,则可能导致攻击者可以通过构造文件路径,从而获 ...

  4. UML之三、建模元素(2)

    本章继续介绍建模元素 https://blog.csdn.net/bit_kaki/article/details/78471760 1:边界 任何一个对象都有一个边界,外界只能通过这个边界来认识对象 ...

  5. Android 有关在ListView RecycleView 中使用EditText Checkbox的坑

    这是一篇文字超多的博客,哈哈哈,废话自行过滤··· 遇到问题 在开发中我们常会在ListView , RecycleView 列表中添加EditText输入框,或者checkbox复选框.   复选框 ...

  6. Java基础之二、类的知识

    类定义---方法及其处理的数据对象的集合结构 将现实的对象(物体)和概念映射到程序中的对象(变量)中 1:使用new运算符创建的类类型的主体称为实例,创建实例的操作称为实例化, new Account ...

  7. RAID | 故障处理

    RAID | 故障处理 Unconfigured(good), Spun Up 背景:磁盘替换后在导入外部配置时提示失败,磁盘状态如题. MegaCli -pdgetmissing -a0查看miss ...

  8. 《茶余饭后小故事》MV*、MVC、MVP、MVVM的前世今生

    今天我们讲讲历史,讲讲故事,不扯高深术语. MV*表示的意思是:M(Model逻辑层) + View(视图层) + *(中间者).上帝提出了这个逻辑与视图分离,用中间者进行连接的伟大思想,并将实现这个 ...

  9. Umi 小白纪实(二)—— model 的注册与使用

    Umi 通常会搭配 Dva 使用,用于管理页面状态和逻辑 一.注册 model 首先需要在 .umirc.js 中启用 dva 插件 export default { plugins: [ ['umi ...

  10. zabbix默认监控负载取值不准确

    今天碰到个负载高引起的问题但是查看zabbix监控并没有报警,检查后发现监控取值与实际服务器内负载不一致. 使用zabbix_get命令在服务器内测试 zabbix默认模板键值 取值内容 [root@ ...