利用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 相关文章推荐
python快速查找算法应用实例
Sep 26 Python
python实现bucket排序算法实例分析
May 04 Python
python处理二进制数据的方法
Jun 03 Python
Python的多维空数组赋值方法
Apr 13 Python
opencv python 图像去噪的实现方法
Aug 31 Python
Linux上使用Python统计每天的键盘输入次数
Apr 17 Python
Python考拉兹猜想输出序列代码实践
Jul 05 Python
python Pandas如何对数据集随机抽样
Jul 29 Python
Django rest framework分页接口实现原理解析
Aug 21 Python
使用django自带的user做外键的方法
Nov 30 Python
python爬取代理ip的示例
Dec 18 Python
Python爬虫实战之爬取携程评论
Jun 02 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
zen cart新进商品的随机排序修改方法
2010/09/10 PHP
php用ini_get获取php.ini里变量值的方法
2015/03/04 PHP
CI框架附属类用法分析
2018/12/26 PHP
JS实多级联动下拉菜单类,简单实现省市区联动菜单!
2007/05/03 Javascript
IE iframe的onload方法分析小结
2010/01/07 Javascript
jquery1.5.1中根据元素ID获取元素对象的代码
2011/04/02 Javascript
两个数组去重的JS代码
2013/12/04 Javascript
查找Oracle高消耗语句的方法
2014/03/22 Javascript
node.js中的events.emitter.removeAllListeners方法使用说明
2014/12/10 Javascript
jQuery Ajax 上传文件处理方式介绍(推荐)
2016/06/30 Javascript
Vue获取DOM元素样式和样式更改示例
2017/03/07 Javascript
js简单实现网页换肤功能
2017/04/07 Javascript
Node.js学习之查询字符串解析querystring详解
2017/09/28 Javascript
ES6与CommonJS中的模块处理的区别
2018/06/13 Javascript
使用JS实现导航切换时高亮显示的示例讲解
2018/08/22 Javascript
Vue Element UI + OSS实现上传文件功能
2019/07/31 Javascript
vue移动端下拉刷新和上滑加载
2020/10/27 Javascript
Python实现多线程HTTP下载器示例
2017/02/11 Python
分享一下Python数据分析常用的8款工具
2018/04/29 Python
10个Python小技巧你值得拥有
2018/09/29 Python
python 对字典按照value进行排序的方法
2019/05/09 Python
PyQt5实现简易电子词典
2019/06/25 Python
使用python实现画AR模型时序图
2019/11/20 Python
pycharm中leetcode插件使用图文详解
2020/12/07 Python
CSS3绘制有活力的链接下划线
2016/07/14 HTML / CSS
HTML5 CSS3打造相册效果附源码下载
2014/06/16 HTML / CSS
基督教卡片、励志礼品、家居装饰等:DaySpring
2018/10/12 全球购物
美国知名的隐形眼镜电商:Contacts America
2019/11/19 全球购物
介绍一下Java的安全机制
2012/06/28 面试题
银行委托书范本
2014/04/04 职场文书
健康教育评估方案
2014/05/25 职场文书
我的中国梦演讲稿高中篇
2014/08/19 职场文书
工作失误检讨书(经典集锦版)
2014/10/17 职场文书
幼儿园中班教育随笔
2015/08/14 职场文书
《比尾巴》教学反思
2016/02/24 职场文书
windows10声卡驱动怎么安装?win10声卡驱动安装操作步骤教程
2022/08/05 数码科技