2014-10-16 106 views
3

我是django的新手,我非常渴望幫助上傳和讀取excel數據,而不實際保存數據在機器上。我寫了一些代碼,並從我在線完成的研究中拿了一些。將excel數據上傳到django中而不保存文件

這是我的問題:
1.如何上傳Excel文件(而不會被保存在機器上)。我只想讓excel文件填充一些django字段並不保存它。

  1. 如何讓django讀取excel文件中的列並將其饋送到另一頁上的其他字段。 (我如何鏈接它們?)

  2. 我見過的大多數文檔都要求我硬編碼excel文件的名稱及其位置.IS有一種解決方法,因爲我不知道在哪裏用戶可能正在上傳。 請指教。

我views.py:

from django.shortcuts import render_to_response 
from django.template import RequestContext 
from django.http import HttpResponseRedirect 
from django.core.urlresolvers import reverse 
from credit.models import Document 
from credit.forms import DocumentForm 

def list(request): 

if request.method == 'POST': 
    form = DocumentForm(request.POST, request.FILES) 
    if form.is_valid(): 

     newdoc = Document(docfile = request.FILES['docfile']) 
     newdoc.save() 

     return HttpResponseRedirect(reverse('credit.views.list')) 
else: 
    form = DocumentForm() 

documents = Document.objects.all() 

return render_to_response('credit/list.html', 
    {'documents': documents, 'form': form}, 
    context_instance=RequestContext(request) 
) 

我的models.py是:

class Document(models.Model): 
    docfile = models.FileField(upload_to='documents/') 
#these are the models I want the excel columns to feed into 
policies = DecimalNumberField() 
capital = DecimalNumberField() 
inflation = DecimalNumberField() 

我forms.py是:

import os 
import xlrd 

IMPORT_FILE_TYPES = ['.xls', ] 

class DocumentForm(forms.Form): 
docfile = forms.FileField(label='Select a file') 

def clean(self): 
    data = super(DocumentForm, self).clean() 

    if 'docfile' not in data: 
     raise forms.ValidationError(_('The Excel file is required to proceed')) 

    docfile = data['docfile'] 
    extension = os.path.splitext(docfile.name)[1] 
    if not (extension in IMPORT_FILE_TYPES): 
     raise forms.ValidationError(u'%s is not a valid Excel file. Please make sure your input file is an Excel file)' % docfile.name) 

    file_data = StringIO.StringIO() 
    for chunk in docfile.chunks(): 
     file_data.write(chunk) 
    data['file_data'] = file_data.getvalue() 
    file_data.close() 

    try: 
     xlrd.open_workbook(file_contents=data['file_data']) 
    except xlrd.XLRDError, e: 
     raise forms.ValidationError(_('Unable to open XLS file: %s' % e)) 

    return data 
#i do not want to do this (specify the exact file name). Need an alternative 
sh = xlrd.open_workbook('documents\june.xls').sheet_by_index(1) 
inflation = open("inflation.txt", 'w') 
policies= open("policies.txt", 'w') 
capital= open("access_to_finance.txt", 'w') 

try: 
    for rownum in range(sh.nrows): 
     inflation.write(str(rownum)+ " = " +str(sh.cell(rownum, 1).value)+"\n") 
     policies.write(str(rownum)+ " = " +str(sh.cell(rownum, 2).value)+"\n") 
     capital.write(str(rownum)+ " = " +str(sh.cell(rownum, 3).value)+"\n") 

finally: 
    inflation.close() 
    policies.close() 
    capital.close() 

然後,我有一個list.html文件:

{% if documents %} 
    <ul class="nav nav-tabs"> 
    {% for document in documents %} 
     <li><a href="{{ document.docfile.url }}">{{ document.docfile.name }}</a></li> 
    {% endfor %} 
    </ul> 
{% else %} 
    <p>Click Upload to go to Upload page</p> 
{% endif %} 

    <form action="{% url list %}" method="post" enctype="multipart/form-data"> 
     {% csrf_token %} 
     <p>{{ form.non_field_errors }}</p> 
     <p>{{ form.docfile.label_tag }} {{ form.docfile.help_text }}</p> 
     <p> 
      {{ form.docfile.errors }} 
      {{ form.docfile }} 
     </p> 
     <p><input type="submit" value="Upload" /></p> 
    </form> 

回答

相關問題