利用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 01 Python
以Python的Pyspider为例剖析搜索引擎的网络爬虫实现方法
Mar 30 Python
win7上python2.7连接mysql数据库的方法
Jan 14 Python
Python爬虫实例爬取网站搞笑段子
Nov 08 Python
Python使用pyh生成HTML文档的方法示例
Mar 10 Python
python如何拆分含有多种分隔符的字符串
Mar 20 Python
对python抓取需要登录网站数据的方法详解
May 21 Python
Flask项目中实现短信验证码和邮箱验证码功能
Dec 05 Python
Python3.9又更新了:dict内置新功能
Feb 28 Python
python3.6.8 + pycharm + PyQt5 环境搭建的图文教程
Jun 11 Python
python 逆向爬虫正确调用 JAR 加密逻辑
Jan 12 Python
Python可变与不可变数据和深拷贝与浅拷贝
Apr 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/01 无线电
php 遍历数据表数据并列表横向排列的代码
2009/09/05 PHP
PHP 开发环境配置(Zend Studio)
2010/04/28 PHP
PHP读取文件并可支持远程文件的代码分享
2012/10/03 PHP
在phpstudy集成环境下的nginx服务器下配置url重写
2019/12/02 PHP
谈谈关于JavaScript 中的 MVC 模式
2013/04/11 Javascript
JS获取地址栏参数的几种方法小结
2014/02/28 Javascript
js实现点击切换TAB标签实例
2015/08/21 Javascript
使用bootstrap-paginator.js 分页来进行ajax 异步分页请求示例
2017/03/09 Javascript
BootStrap表单时间选择器详解
2017/05/09 Javascript
Vue-Cli中自定义过滤器的实现代码
2017/08/12 Javascript
使用D3.js制作图表详解
2017/08/13 Javascript
JavaScript实现换肤功能
2017/09/15 Javascript
解决JQuery全选/反选第二次失效的问题
2017/10/11 jQuery
jquery 键盘事件 keypress() keydown() keyup()用法总结
2019/10/23 jQuery
vue+flask实现视频合成功能(拖拽上传)
2021/03/04 Vue.js
从零学Python之入门(五)缩进和选择
2014/05/27 Python
使用py2exe在Windows下将Python程序转为exe文件
2016/03/04 Python
Python内置模块hashlib、hmac与uuid用法分析
2018/02/12 Python
详谈pandas中agg函数和apply函数的区别
2018/04/20 Python
Php多进程实现代码
2018/05/07 Python
Python3.5实现的三级菜单功能示例
2019/03/25 Python
python实现扫描局域网指定网段ip的方法
2019/04/16 Python
Python调用JavaScript代码的方法
2020/10/27 Python
pandas统计重复值次数的方法实现
2021/02/20 Python
英国水族馆和池塘用品购物网站:Warehouse Aquatics
2019/08/29 全球购物
护士的岗位职责
2013/12/04 职场文书
采购部部长岗位职责
2014/02/06 职场文书
党员群众路线自我剖析材料
2014/10/06 职场文书
医生见习报告范文
2014/11/03 职场文书
2014年精神文明建设工作总结
2014/11/19 职场文书
2014年生活老师工作总结
2014/12/23 职场文书
员工工作能力评语
2014/12/31 职场文书
歌咏比赛口号大全
2015/12/25 职场文书
生产实习心得体会范文
2016/01/22 职场文书
python单元测试之pytest的使用
2021/06/07 Python