我无法将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并出现相同的错误。
答案 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')