利用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实现的简单猜数字游戏
Apr 04 Python
Python利用ansible分发处理任务
Aug 04 Python
星球大战与Python之间的那些事
Jan 07 Python
利用PyInstaller将python程序.py转为.exe的方法详解
May 03 Python
python 定时修改数据库的示例代码
Apr 08 Python
Pycharm在创建py文件时,自动添加文件头注释的实例
May 07 Python
详解pyppeteer(python版puppeteer)基本使用
Jun 12 Python
Django使用Channels实现WebSocket的方法
Jul 28 Python
利用Python产生加密表和解密表的实现方法
Oct 15 Python
python如何实现不可变字典inmutabledict
Jan 08 Python
Pytorch在dataloader类中设置shuffle的随机数种子方式
Jan 14 Python
python 获取当前目录下的文件目录和文件名实例代码详解
Mar 10 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
编译php 5.2.14+fpm+memcached(具体操作详解)
2013/06/18 PHP
php json与xml序列化/反序列化
2013/10/28 PHP
PHP $_FILES中error返回值详解
2014/01/30 PHP
PHP PDOStatement::execute讲解
2019/01/31 PHP
JavaScript的目的分析
2007/01/05 Javascript
jQuery中dom元素上绑定的事件详解
2015/04/24 Javascript
javascript实现类似java中getClass()得到对象类名的方法
2015/07/27 Javascript
利用HTML5的画布Canvas实现刮刮卡效果
2015/09/06 Javascript
jquery实现仿新浪微博带动画效果弹出层代码(可关闭、可拖动)
2015/10/12 Javascript
基于JavaScript实现鼠标悬浮弹出跟随鼠标移动的带箭头的信息层
2016/01/18 Javascript
JS实现页面打印(整体、局部)
2017/08/18 Javascript
JS中常用的消息框总结
2018/02/24 Javascript
详解javascript 变量提升(Hoisting)
2019/03/12 Javascript
JavaScript碰撞检测原理及其实现代码
2020/03/12 Javascript
vue 使用原生组件上传图片的实例
2020/09/08 Javascript
js实现购物车商品数量加减
2020/09/21 Javascript
[01:06]DOTA2亚洲邀请赛专属珍藏-荧煌之礼
2017/03/24 DOTA
[01:10:30]DOTA2-DPC中国联赛正赛 Dragon vs Dynasty BO3 第一场 3月4日
2021/03/11 DOTA
零基础写python爬虫之抓取糗事百科代码分享
2014/11/06 Python
基于Python实现通过微信搜索功能查看谁把你删除了
2016/01/27 Python
使用Python绘制图表大全总结
2017/02/11 Python
Python字符串的全排列算法实例详解
2019/01/07 Python
Python多进程入门、分布式进程数据共享实例详解
2019/06/03 Python
深入解析神经网络从原理到实现
2019/07/26 Python
Django上使用数据可视化利器Bokeh解析
2019/07/31 Python
python绘制随机网络图形示例
2019/11/21 Python
python 轮询执行某函数的2种方式
2020/05/03 Python
Python3 pyecharts生成Html文件柱状图及折线图代码实例
2020/09/29 Python
智利最大的网上商店:Linio智利
2016/11/24 全球购物
巴塞罗那观光通票:Barcelona Pass
2019/10/30 全球购物
Booking.com缤客中国:全球酒店在线预订网站
2020/05/03 全球购物
关于赌博的检讨书
2014/01/08 职场文书
企业公益活动策划方案
2014/08/24 职场文书
2014个人年终工作总结范文
2014/12/15 职场文书
2019餐饮行业创业计划书!
2019/06/27 职场文书
IIS服务器中设置HTTP重定向访问HTTPS
2022/04/29 Servers