将Excel文件上传到Django

时间:2018-09-27 19:28:25

标签: django excel python-3.x file-upload

我无法将excel文件上传到我的Django应用程序。这是一个非常简单的应用程序,应该允许用户上传3列的excel文件。应用程序将读取该文件的内容并将其处理为一堆计算

这是我的 forms.py

class InputForm(forms.Form):
FileLocation = forms.FileField(label='Import Data',required=True,widget=forms.FileInput(attrs={'accept': ".xlsx"}))

settings.py

FILE_UPLOAD_HANDLERS = ["django_excel.ExcelMemoryFileUploadHandler",
                    "django_excel.TemporaryExcelFileUploadHandler"]

views.py

import xlrd
from django.shortcuts import render_to_response, render
from django.conf.urls.static import static
from django.contrib import admin
from django.contrib.staticfiles.urls import staticfiles_urlpatterns
from django.template.context_processors import csrf
from io import TextIOWrapper
from WebApp.forms import *
from django.core.mail import send_mail
from django.utils.safestring import mark_safe
from django.db import connection
import os
import csv
def analyze(request):
     if request.method == 'POST':
        form = InputForm(request.POST,request.FILES['FileLocation'])


     if form.is_valid():
         book = xlrd.open_workbook(request.FILES('FileLocation'))
         for sheet in book.sheets():
             number_of_rows = sheet.nrows
             number_of_columns = sheet.ncols
             print(number_of_rows)

我以表格形式上传文件,但出现错误:

    AttributeError at /app/analyze/

    'ExcelInMemoryUploadedFile' object has no attribute 'get'

Request Method:     POST
Request URL:    http://127.0.0.1:8000/data/analyze/
Django Version:     1.11
Exception Type:     AttributeError
Exception Value:    

Exception Location:     C:\Python36\lib\site-packages\django\forms\widgets.py in value_from_datadict, line 367
    Python Executable:  C:\Python36\python.exe
    Python Version:     3.6.4

我还可以使用以下views.py代码成功上传.csv文件:

def analyze(request):
    c={}
    context = RequestContext(request)
    c.update(csrf(request))
    abc=['a','b','c']
    if request.method == 'POST':
        form = InputForm(request.POST,request.FILES)
        dataType = request.POST.get("DataType")
        print(dataType)
        if form.is_valid():
            cd = form.cleaned_data            #print (cd)

            a =  TextIOWrapper(request.FILES['FileLocation'].file,encoding='ascii',errors='replace')

        #print (request.FILES.keys())
        data = csv.reader(a)
        row1csv = next(data)
        region = row1csv[0]
        metric = row1csv[2]

我尝试了django-excel并出现相同的错误。

1 个答案:

答案 0 :(得分:1)

您正在正确初始化.CSV情况下的表单,但在Excel情况下不是这样:

form = InputForm(request.POST, request.FILES)

请勿使用request.FILES['FileLocation']进行初始化,因为这会将错误的类型传递给表单。期望的是上载文件的MultiValueDict,而不是单个上载的文件。这就是为什么在调用get时失败。

接下来,您不能将ExcelInMemoryUploadedFile传递给xlrd.get_workbook()。您需要先将文件保存到磁盘,然后将其路径传递到get_workbook()方法。 django-excel的documentation提供了一些更简单的方法:

book = request.FILES['FileLocation'].get_book()  # note the square brackets!

或直接访问工作表:

sheet = request.FILES['FileLocation'].get_sheet('sheet1')