zoukankan      html  css  js  c++  java
  • 利用django如何解析用户上传的excel文件

    https://www.jb51.net/article/119452.htm

    前言

    我们在工作中的时候,会有这种需求:用户上传一个格式固定excel表格到网站上,然后程序负债解析内容并进行处理。我最近在工作中就遇到了,所以想着将解决的过程总结分享出来,方便大家参考学习,下面话不多说,来一起看看详细的介绍:

    举一个简单的栗子,比如我们有这样一个HTML:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <!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文件内容如下,编写一个简单的判断后缀的验证:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    # 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中可以内存直接读取内容而不用写磁盘再读取了:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    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有关的资源:

    总结

    以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

     
  • 相关阅读:
    Q:简单实现URL只能页面跳转,禁止直接访问
    Q:elementUI中tree组件动态展开
    一个切图仔的 JS 笔记
    一个切图仔的HTML笔记
    一个切图仔的 CSS 笔记
    GnuPG使用笔记
    SQL Svr 2012 Enterprise/Always-on节点连接超时导致节点重启——case分享
    网卡配置文件备份在原目录下引起网络配置异常
    python培训
    service脚本的写法
  • 原文地址:https://www.cnblogs.com/linkenpark/p/9607402.html
Copyright © 2011-2022 走看看