Loading Excel data into django without saving file

I am new to django and I desperately need help loading and reading excel data without actually saving the data to the machine. I wrote some code and took some of the research I have done on the internet.

These are my questions:  
1. How to download an excel file (without saving it on your computer). I just want the excel file to populate the django fields and not save it.

  1. How to make django read columns in excel file and forward to other fields on another page. (How to tie them?)

  2. Most of the docs I have seen require me to hardcode the excel file name and locations. We have a way to work around this as I don't know where the user might be loading from. pls.

My 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)
)

      

My 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()

      

My 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()

      

Then I have a list.html file:

{% 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>

      

+3


source to share


1 answer


Answer to question 1:



If your upload file is smaller than FILE_UPLOAD_MAX_MEMORY_SIZE (2.5MB) , django puts the uploaded file in memory. If your file is larger than 2.5 MB, you can change FILE_UPLOAD_MAX_MEMORY_SIZE in the settings file

+1


source







All Articles