利用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正则表达式 findall函数问题详解
Mar 22 Python
Django ManyToManyField 跨越中间表查询的方法
Dec 18 Python
用python打印菱形的实操方法和代码
Jun 25 Python
Python-copy()与deepcopy()区别详解
Jul 12 Python
Python中利用LSTM模型进行时间序列预测分析的实现
Jul 26 Python
在django中实现页面倒数几秒后自动跳转的例子
Aug 16 Python
python批量将excel内容进行翻译写入功能
Oct 10 Python
python错误调试及单元文档测试过程解析
Dec 19 Python
opencv之为图像添加边界的方法示例
Dec 26 Python
Python线程threading模块用法详解
Feb 26 Python
在keras下实现多个模型的融合方式
May 23 Python
使用Python解决图表与画布的间距问题
Apr 11 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
ThinkPHP结合ajax、Mysql实现的客户端通信功能代码示例
2014/06/23 PHP
PHP中一些可以替代正则表达式函数的字符串操作函数
2014/11/17 PHP
隐藏Nginx或Apache以及PHP的版本号的方法
2016/01/03 PHP
PHP实现的DES加密解密封装类完整实例
2017/04/29 PHP
Javascript学习笔记之函数篇(四):arguments 对象
2014/11/23 Javascript
freemarker判断对象是否为空的方法
2015/08/13 Javascript
JavaScript中获取HTML元素值的三种方法
2016/06/20 Javascript
利用yarn实现一个webpack+react种子
2016/10/25 Javascript
Node.js中process模块常用的属性和方法
2016/12/13 Javascript
Bootstrap学习笔记 轮播(Carousel)插件
2017/03/21 Javascript
Mobile Web开发基础之四--处理手机设备的横竖屏问题
2017/08/11 Javascript
解析Json字符串的三种方法日常常用
2018/05/02 Javascript
vue中的provide/inject的学习使用
2018/05/09 Javascript
纯JS实现可用于页码更换的飞页特效示例
2018/05/21 Javascript
微信小程序实现弹出菜单
2018/07/19 Javascript
echarts大屏字体自适应的方法步骤
2019/07/12 Javascript
Vue切换div显示隐藏,多选,单选代码解析
2020/07/14 Javascript
如何在JS文件中获取Vue组件
2020/09/16 Javascript
python3+PyQt5实现柱状图
2018/04/24 Python
pandas.loc 选取指定列进行操作的实例
2018/05/18 Python
python 以16进制打印输出的方法
2018/07/09 Python
Python 从一个文件中调用另一个文件的类方法
2019/01/10 Python
Python集合基本概念与相关操作实例分析
2019/10/30 Python
python实现从尾到头打印单链表操作示例
2020/02/22 Python
浅析python字符串前加r、f、u、l 的区别
2021/01/24 Python
CSS3中使用RGBa来调节透明度的教程
2016/05/09 HTML / CSS
18-35岁旅游团的全球领导者:Contiki
2017/02/08 全球购物
.net开发工程师面试题
2014/02/25 面试题
测试工程师岗位职责
2013/11/28 职场文书
国际商务专业求职信
2014/07/15 职场文书
中秋晚会活动方案
2014/08/31 职场文书
学生吸烟检讨书
2014/09/14 职场文书
2014年销售内勤工作总结
2014/12/01 职场文书
换届选举主持词
2015/07/03 职场文书
Java并发编程必备之Future机制
2021/06/30 Java/Android
Mysql中where与on的区别及何时使用详析
2021/08/04 MySQL