将excel数据上传到django而不保存文件

时间:2014-10-16 10:55:08

标签: python django excel xls xlrd

我是django的新手,我迫切需要帮助上传和阅读Excel数据而不实际保存机器上的数据。我已经写了一些代码并从我在线完成的研究中得到了一些代码。

以下是我的问题:  
1。如何上载Excel文件(不将其保存在计算机上)。我只是希望excel文件填充一些django字段而不保存它。

  1. 如何让django读取excel文件中的列并将其提供给另一页上的其他字段。 (我如何将它们联系起来?)

  2. 我见过的大多数文档要求我对excel文件的名称及其位置进行硬编码。由于我不知道用户可能在哪里上传,因此我可以解决这个问题。从。 请咨询。

  3. 我的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>
    

1 个答案:

答案 0 :(得分:1)

回答问题1:

如果您的上传文件少于FILE_UPLOAD_MAX_MEMORY_SIZE(2.5MB),则django会将the uploaded file放入内存中。如果您的文件大于2.5MB,则可以在设置文件中更改 FILE_UPLOAD_MAX_MEMORY_SIZE