利用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求两个文本文件以行为单位的交集、并集与差集的方法
Jun 17 Python
Python应用03 使用PyQT制作视频播放器实例
Dec 07 Python
idea创建springMVC框架和配置小文件的教程图解
Sep 18 Python
python+splinter实现12306网站刷票并自动购票流程
Sep 25 Python
python re库的正则表达式入门学习教程
Mar 08 Python
python给指定csv表格中的联系人群发邮件(带附件的邮件)
Dec 31 Python
简单了解python filter、map、reduce的区别
Jan 14 Python
python爬虫开发之urllib模块详细使用方法与实例全解
Mar 09 Python
Python semaphore evevt生产者消费者模型原理解析
Mar 18 Python
keras自定义回调函数查看训练的loss和accuracy方式
May 23 Python
Jupyter Notebook 安装配置与使用详解
Jan 06 Python
Python可视化神器pyecharts之绘制地理图表练习
Jul 07 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 cli 方式 在crotab中运行解决
2010/02/08 PHP
php守护进程 加linux命令nohup实现任务每秒执行一次
2011/07/04 PHP
php自定义函数截取汉字长度
2014/05/15 PHP
PHP基于单例模式实现的数据库操作基类
2016/01/15 PHP
JS 跳转页面延迟2种方法
2013/03/29 Javascript
jquery ui dialog实现弹窗特效的思路及代码
2013/08/03 Javascript
angularJS提交表单(form)
2015/02/09 Javascript
HTML5使用DeviceOrientation实现摇一摇功能
2015/06/05 Javascript
js+html5获取用户地理位置信息并在Google地图上显示的方法
2015/06/05 Javascript
js实现的黑背景灰色二级导航菜单效果代码
2015/08/24 Javascript
Webwork 实现文件上传下载代码详解
2016/02/02 Javascript
jquery遍历table的tr获取td的值实现方法
2016/05/19 Javascript
关于Vue.js 2.0的Vuex 2.0 你需要更新的知识库
2016/11/30 Javascript
Node.js Koa2使用JWT进行鉴权的方法示例
2018/08/17 Javascript
解决v-for中使用v-if或者v-bind:class失效的问题
2018/09/25 Javascript
Bootstrap table 实现树形表格联动选中联动取消功能
2019/09/30 Javascript
echarts实现获取datazoom的起始值(包括x轴和y轴)
2020/07/20 Javascript
浅谈Vuex的this.$store.commit和在Vue项目中引用公共方法
2020/07/24 Javascript
JavaScript中变量提升和函数提升的详解
2020/08/07 Javascript
详解Vue3 Teleport 的实践及原理
2020/12/02 Vue.js
Python动态生成多维数组的方法示例
2018/08/09 Python
Python Numpy 实现交换两行和两列的方法
2019/06/26 Python
python正则-re的用法详解
2019/07/28 Python
Python爬虫运用正则表达式的方法和优缺点
2019/08/25 Python
Python中zip()函数的简单用法举例
2019/09/02 Python
Python 类的私有属性和私有方法实例分析
2019/09/29 Python
Python xmltodict模块安装及代码实例
2020/10/05 Python
Python中logging日志的四个等级和使用
2020/11/17 Python
新加坡最早生产电动滑板车的制造商之一:FunsToTheFore
2020/09/08 全球购物
部队领导证婚词
2014/01/12 职场文书
产品开发计划书
2014/04/27 职场文书
党委书记个人检查对照材料思想汇报
2014/10/11 职场文书
通知函格式范文
2015/04/27 职场文书
用Python爬取各大高校并可视化帮弟弟选大学,弟弟直呼牛X
2021/06/11 Python
MySQL之select、distinct、limit的使用
2021/11/11 MySQL
Python使用MapReduce进行简单的销售统计
2022/04/22 Python