Ошибка атрибута при загрузке файла Excel в Django - PullRequest
0 голосов
/ 27 сентября 2018

У меня проблемы с загрузкой файла Excel в мое приложение django.Это очень простое приложение, которое должно позволять пользователю загружать файл Excel с 3 столбцами.Приложение прочитает содержимое этого файла и обработает его в кучу вычислений

, вот мои 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

Я также могу успешно загрузить файл .csv, используя следующий код views.py:

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 голосов
/ 27 сентября 2018

Вы правильно инициализируете свою форму для случая .CSV, но не в своем случае Excel:

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

Не инициализируйте с помощью request.FILES['FileLocation'], поскольку это передает неправильный тип в форму.Он ожидает MultiValueDict загруженных файлов, а не один загруженный файл.Вот почему происходит сбой при вызове get.

Далее, вы не можете передать ExcelInMemoryUploadedFile в xlrd.get_workbook().Сначала нужно сохранить файл на диск, а затем передать его путь методу get_workbook().Документация django-excel предоставляет несколько более простых методов:

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

или прямой доступ к листу:

sheet = request.FILES['FileLocation'].get_sheet('sheet1')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...