利用django如何解析用户上传的excel文件


Posted in Python onJuly 24, 2017

前言

我们在工作中的时候,会有这种需求:用户上传一个格式固定excel表格到网站上,然后程序负债解析内容并进行处理。我最近在工作中就遇到了,所以想着将解决的过程总结分享出来,方便大家参考学习,下面话不多说,来一起看看详细的介绍:

举一个简单的栗子,比如我们有这样一个HTML:

<!DOCTYPE html>
<html>
 <head>
 <meta charset="utf-8">
 </head>
 <body>
 <p>上传EXCEL表格</p>
 <form class="" action="" method="post" enctype="multipart/form-data" >
  {% csrf_token %}
  <input type="file" name="excel">
  <input type="submit" value="上传">
 </form>
 </body>
</html>

forms.py文件内容如下,编写一个简单的判断后缀的验证:

# coding=utf-8
from django import forms
from django.utils.translation import gettext as _
from django.core.exceptions import ValidationError
def validate_excel(value):
 if value.name.split('.')[-1] not in ['xls','xlsx']:
 raise ValidationError(_('Invalid File Type: %(value)s'),params={'value': value},)
class UploadExcelForm(forms.Form):
 excel = forms.FileField(validators=[validate_excel]) #这里使用自定义的验证

处理excel表格我这里使用xlrd库,使用pip安装即可。此时处理POST请求时有2种方法:

  • 将用户上传的excel存储到磁盘中再读取交给xlrd处理。
  • 直接在内存中读取用户上传的excel读取交给xlrd处理。

这里我使用第二个办法——在不修改django默认settings.py配置情况下,用户上传的文件其实是InMemoryUploadedFile类型,这个类型有一个read()方法,所以views.py中可以内存直接读取内容而不用写磁盘再读取了:

def post(self, request, *args, **kwargs):
 form = UploadExcelForm(request.POST, request.FILES)
 if form.is_valid():
 wb = xlrd.open_workbook(
  filename=None, file_contents=request.FILES['excel'].read()) # 关键点在于这里
 table = wb.sheets()[0]
 row = table.nrows
 for i in xrange(1, row):
  col = table.row_values(i)
  print col
 return HttpResponse("ok")

其他文件类型同理,如果不需要保存用户上传的文件到硬盘其实都可以这么处理。这里记录2个和django处理excel有关的资源:

  • django-excel (本地下载)判断用户excel格式的三方库
  • https://assist-software.net/blog/how-export-excel-files-python-django-application 讲解如何导出excel的文章

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Python 相关文章推荐
git使用.gitignore设置不生效或不起作用问题的解决方法
Jun 01 Python
python爬虫之BeautifulSoup 使用select方法详解
Oct 23 Python
浅谈Python中range和xrange的区别
Dec 20 Python
5个很好的Python面试题问题答案及分析
Jan 19 Python
python顺序执行多个py文件的方法
Jun 29 Python
python通过实例讲解反射机制
Oct 17 Python
解决TensorFlow GPU版出现OOM错误的问题
Feb 03 Python
Python实现新型冠状病毒传播模型及预测代码实例
Feb 05 Python
Python定时从Mysql提取数据存入Redis的实现
May 03 Python
python利用platform模块获取系统信息
Oct 09 Python
深度学习tensorflow基础mnist
Apr 14 Python
用Python爬取英雄联盟的皮肤详细示例
Dec 06 Python
Python编程之变量赋值操作实例分析
Jul 24 #Python
Python模块结构与布局操作方法实例分析
Jul 24 #Python
Python列表list操作符实例分析【标准类型操作符、切片、连接字符、列表解析、重复操作等】
Jul 24 #Python
Python列表list内建函数用法实例分析【insert、remove、index、pop等】
Jul 24 #Python
python引入导入自定义模块和外部文件的实例
Jul 24 #Python
Python3.X 线程中信号量的使用方法示例
Jul 24 #Python
Python基于list的append和pop方法实现堆栈与队列功能示例
Jul 24 #Python
You might like
咖啡机如何保养和日常清洁?
2021/03/03 冲泡冲煮
php 301转向实现代码
2008/09/18 PHP
让PHP显示Facebook的粉丝数量方法
2014/01/08 PHP
PHP_Cooikes不同页面无法传递的解决方法
2014/03/07 PHP
PHP中遇到BOM、编码导致json_decode函数无法解析问题
2014/07/02 PHP
LNMP部署laravel以及xhprof安装使用教程
2017/09/14 PHP
PHP实现的猴王算法(猴子选大王)示例
2018/04/30 PHP
php apache开启跨域模式过程详解
2019/07/08 PHP
js禁止document element对象选中文本实现代码
2013/03/21 Javascript
基于JavaScript实现移除(删除)数组中指定元素
2016/01/04 Javascript
jQuery遍历json的方法分析
2016/04/16 Javascript
基于JQuery实现图片上传预览与删除操作
2016/05/24 Javascript
JS去除空格和换行的正则表达式(推荐)
2016/06/14 Javascript
vue-cli webpack 引入jquery的方法
2018/01/10 jQuery
通过js动态创建标签,并设置属性方法
2018/02/24 Javascript
vue组件中使用props传递数据的实例详解
2018/04/08 Javascript
vue 录制视频并压缩视频文件的方法
2018/07/27 Javascript
Vue实现购物小球抛物线的方法实例
2020/11/22 Vue.js
[05:10]2014DOTA2国际邀请赛 通往胜利之匙赛场探秘之旅
2014/07/18 DOTA
[01:14:34]DOTA2上海特级锦标赛C组资格赛#2 LGD VS Newbee第一局
2016/02/28 DOTA
[53:43]VP vs NewBee Supermajor 胜者组 BO3 第三场 6.5
2018/06/06 DOTA
[09:34]2018DOTA2国际邀请赛寻真——永不放弃的iG
2018/08/14 DOTA
Python基于回溯法子集树模板解决马踏棋盘问题示例
2017/09/11 Python
Python两个字典键同值相加的几种方法
2019/03/05 Python
Python测试线程应用程序过程解析
2019/12/31 Python
Python request使用方法及问题总结
2020/04/26 Python
Python中免验证跳转到内容页的实例代码
2020/10/23 Python
世界上最值得信赖的多日游在线市场:TourRadar
2018/07/20 全球购物
Nike德国官网:Nike.com (DE)
2018/11/13 全球购物
公路绿化方案
2014/05/12 职场文书
统计学教授推荐信
2014/09/18 职场文书
党员查摆剖析材料
2014/10/10 职场文书
国际贸易实训总结
2015/08/03 职场文书
学生会宣传部竞选稿
2015/11/21 职场文书
springboot集成springCloud中gateway时启动报错的解决
2021/07/16 Java/Android
logback 实现给变量指定默认值
2021/08/30 Java/Android