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

Python 将excel数据上载到django而不保存文件,python,django,excel,xls,xlrd,Python,Django,Excel,Xls,Xlrd,我是django的新手,我迫切需要帮助上传和读取excel数据,而不是将数据保存在机器上。我已经写了一些代码,并从我在网上做的研究中获取了一些 以下是我的问题: 一,。如何上载excel文件(不将其保存在计算机上)。我只希望excel文件填充一些django字段,而不是保存它 如何让django读取excel文件中的列,并将其输入到另一页上的其他字段中。(我如何将它们连接起来?) 我看到的大多数文档都要求我硬编码excel文件的名称及其位置。有没有办法解决这个问题,因为我不知道用户可能从哪里上传

我是django的新手,我迫切需要帮助上传和读取excel数据,而不是将数据保存在机器上。我已经写了一些代码,并从我在网上做的研究中获取了一些

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

  • 如何让django读取excel文件中的列,并将其输入到另一页上的其他字段中。(我如何将它们连接起来?)

  • 我看到的大多数文档都要求我硬编码excel文件的名称及其位置。有没有办法解决这个问题,因为我不知道用户可能从哪里上传。 请指教

  • 我的观点。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)
    )
    
    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()
    
    {% 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>
    
    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是:

    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)
    )
    
    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()
    
    {% 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>
    
    然后我有一个list.html文件:

    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)
    )
    
    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()
    
    {% 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>
    
    {%if文档%}
    
      {文档%中的文档为%}
    • {%endfor%}
    {%else%} 单击上载转到上载页面

    {%endif%} {%csrf_令牌%} {{form.non_field_errors}}

    {{form.docfile.label_tag}{{{form.docfile.help_text}}

    {{form.docfile.errors} {{form.docfile}


    问题1的答案:

    如果您的上传文件小于此值,django会将其放入内存。如果您的文件大于2.5MB,您可以在设置文件中更改文件\上传\最大内存\大小