Django将excel文件导入django模型

时间:2018-02-12 18:08:22

标签: python django excel

我需要用户通过提供的表单上传excel文件,我需要处理上传的excel文件以将数据保存在我的模型中。

models.py

class Patient_Record(models.Model):

    Patient_id=models.IntegerField(unique=True)
    Patient_sex=models.CharField(max_length=1,choices=Gender)
    Patient_name=models.CharField(max_length=20)
    Patient_sugar=models.DecimalField(decimal_places=3,max_digits=6)
    Patient_chlorestrol=models.DecimalField(decimal_places=3,max_digits=6)
    Patient_iron=models.DecimalField(decimal_places=3,max_digits=6)
    Patient_haemoglobin=models.DecimalField(decimal_places=3,max_digits=6)

    def __str__(self):
        return self.pat_name

我有简单的表格来上传文件。

<form method="POST" class="post-form" action="../Uploaded_file" enctype="multipart/form-data" name="myfile">{% csrf_token %}
                    {{ upload_form.as_p }}
<input type="submit" value="Upload" name="Upload" class="btn  btn-primary">
</form>

有人可以帮我解决使用POST解析excel文件到此模型的问题。

我尝试过使用许多不同的方法但却无法取得成功。

3 个答案:

答案 0 :(得分:0)

您需要xlrd库从Excel工作表中提取数据。 请查看以下链接https://pypi.python.org/pypi/xlrd

这是示例代码段。您可以根据您的代码进行修改。

在Forms.py中创建一个包含以下字段的模型表单。

class UpdateDetailsForm(forms.Form):
 excel_file = forms.FileField(label='Excel File',required=False,validators=[validate_file_extension])

然后在相应的views.py

def update_details(request):
  message=''
 if request.method == 'POST':
  form = UpdateDetailsForm(request.POST,request.FILES)
  if form.is_valid():
   #import your django model here like from django.appname.models import model_name
   excel_file = request.FILES['excel_file']
   i=0
   try:
    import os
    import tempfile
    import xlrd
    fd, tmp = tempfile.mkstemp()
    with os.fdopen(fd, 'w') as out:
      out.write(excel_file.read())
    book=xlrd.open_workbook(fd)
    sh = book.sheet_by_index(0)          
    for rx in range(1,sh.nrows):
        obj=Patient_Record(Patient_id=str(sh.row(rx)[0].value),Patient_sex=str(sh.row(rx)[1].value)) # similiary populate according to your  model
        obj.save()
        i=i+1;
   finally:
    os.unlink(tmp)
  else:
    message='Invalid Entries'
 else:
    form = UpdateDetailsForm()
 return render_to_response('admin/import_data.html', {'form':form,'message':message},context_instance=RequestContext(request))

答案 1 :(得分:0)

在Python 3.6和Django 2.0中,以下内容引发错误 异常类型:PermissionError 异常值:[WinError 32]

def upload_file(request):
    message=''
    if request.method == 'POST':
        form = FormUploadFileData(request.POST, request.FILES)
        if form.is_valid():
            from projects.models import Project
            excel_file = request.FILES['excel_file']
            try:
                import os
                import tempfile
                import xlrd
                fd, tmp = tempfile.mkstemp() # create two temporary file
                with os.open(fd, 'wb') as out: # create new file objects
                    out.write(excel_file.read())
                book = xlrd.open_workbook(fd)
                sheet = book.sheet_by_index(0)
                obj=Project(
                    project_title = sheet.cell_value(rowx=1, colx=1),
                    project_sector = sheet.cell_value(rowx=2, colx=1),
                    project_location = sheet.cell_value(rowx=3, colx=1),
                    project_tot_cost = sheet.cell_value(rowx=4, colx=1),
                    project_descr = sheet.cell_value(rowx=5, colx=1),
                    project_fund = sheet.cell_value(rowx=6, colx=1),
                    project_cofin = sheet.cell_value(rowx=7, colx=1),
                    project_applicant = sheet.cell_value(rowx=8, colx=1)
                )
                obj.save()
            finally:
                os.unlink(tmp)
        else:
            message='Invalid Entries'
    else:
        form = FormUploadFileData()
    return render(request,'upload.html', {'form':form,'message':message})

答案 2 :(得分:0)

提出的解决方案中存在一个问题:

book=xlrd.open_workbook(fd)应该是book=xlrd.open_workbook(tmp)open_workhook search是文件路径

[在Python 3.6,Django 2.0中工作]

excel_file = request.FILES['excel_file']
        import os
        import tempfile
        import xlrd
        fd, path = tempfile.mkstemp() #  mkstemp returns a tuple: an integer (index) called file descriptor used by OS to refer to a file and its path
        try:
            with os.fdopen(fd, 'wb') as tmp:
                tmp.write(excel_file.read())
            book = xlrd.open_workbook(path)
            sheet = book.sheet_by_index(0)
            obj=Project(
                project_title = sheet.cell_value(rowx=1, colx=1),
                project_sector = sheet.cell_value(rowx=2, colx=1),
                project_location = sheet.cell_value(rowx=3, colx=1),
                project_tot_cost = sheet.cell_value(rowx=4, colx=1),
                project_descr = sheet.cell_value(rowx=5, colx=1),
                project_fund = sheet.cell_value(rowx=6, colx=1),
                project_cofin = sheet.cell_value(rowx=7, colx=1),
                project_applicant = sheet.cell_value(rowx=8, colx=1)
            )
            obj.save()
        finally:
            os.remove(path)