前言:

  最近公司领导要统计技术部门在各个业务条线花费的工时百分比,而 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表格并将数据写入数据库的更多相关文章

  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. 设置允许外网访问MySQL

    1:设置mysql的配置文件     /etc/mysql/my.cnf      找到 bind-address  =127.0.0.1  将其注释掉://作用是使得不再只允许本地访问:  重启my ...

  2. asp.net core 3.x 授权中的概念

    前言 预计是通过三篇来将清楚asp.net core 3.x中的授权:1.基本概念介绍:2.asp.net core 3.x中授权的默认流程:3.扩展. 在完全没有概念的情况下无论是看官方文档还是源码 ...

  3. Spring Cloud(八):使用Spring Cloud Bus来实现配置动态更新

    使用Spring Cloud Config我们能实现服务配置的集中化管理,在服务启动时从Config Server获取需要的配置属性.但如果在服务运行过程中,我们需要将某个配置属性进行修改,比如将验证 ...

  4. 子组件获取父组件数据 propsDown, 父组件获取子组件数据 eventUp

    (一) popsDowm 三种方法获取父组件数据:被动获得(1):主动获取(2). 1.被动获得: 父组件:v-bind: 绑定变量参数和方法参数:子组件:props 接收参数.可以在模板中直接使用也 ...

  5. Nuget打包没有注释显示

    1.选中项目-->属性-->生成-->选中 XML文档文件(xml路径和该项目相同) 2.选择生成序列化程序集:自动/开

  6. 关于js获取元素在屏幕中的位置的方法

    针对我们获取元素在页面中的位置的问题,我们还是用老师一峰老师的方法来解决吧 下面上HTML代码 <div class="left_footer"> <p data ...

  7. Resnet——深度残差网络(一)

    我们都知道随着神经网络深度的加深,训练过程中会很容易产生误差的积累,从而出现梯度爆炸和梯度消散的问题,这是由于随着网络层数的增多,在网络中反向传播的梯度会随着连乘变得不稳定(特别大或特别小),出现最多 ...

  8. 1级搭建类104-Oracle 12cR2 单实例 FS(阿里云)公开

    项目文档引子系列是根据项目原型,制作的测试实验文档,目的是为了提升项目过程中的实际动手能力,打造精品文档AskScuti. 项目文档引子系列目前不对外发布,仅作为博客记录.如学员在实际工作过程中需提前 ...

  9. SQL Server数据库、表、数据类型基本概念

    一.SQL Server的数据存储结构 SQL Server是一个数据库管理系统,需要以有效方式存储高容量数据.要更好地理解SQL Server处理数据的方式,就需要了解数据的存储结构. 1.文件类型 ...

  10. 【39】为什么使用卷积?(Why convolutions?)

    为什么使用卷积?(Why convolutions?) 我们来分析一下卷积在神经网络中如此受用的原因,然后对如何整合这些卷积,如何通过一个标注过的训练集训练卷积神经网络做个简单概括.和只用全连接层相比 ...