2015-12-10 74 views
8

enter image description heredjango1.8-如何上傳Excel和插入到數據庫

了Excel,如同與3列的左畫面時,手動附加信息。

在插入數據庫時​​,我需要手動添加2列如右圖所示,最後在數據庫中共插入5列。這2個額外的列信息是從其他數據庫獲取的。

而另一功能是,如果有已經存在的文件,新上傳的文件將覆蓋現有的一個。

我已經嘗試了兩種3方的工具,但沒有作品[以下views.py片段],所以也許它只是使用嵌入在Django中的那個更好。

版本:Python 2.7。 Excel 2013. Django1.8。

任何幫助,高度讚賞。希望可以爲如何將這些2列追加細節片段:

uploader = request.session['uploader'] 
Date=request.session['date'] 

forms.py

from django.core.files.storage import FileSystemStorage 
from financialdata.storage import OverwriteStorage 

class XXXXDataForm(forms.Form): 
    XXXXfile=forms.FileField(label='Select a file') 

views.py

from django.core.files.storage import FileSystemStorage 

def import_data(request): 
    if request.method == "POST": 
     form = XXXXForm(request.POST,request.FILES) 
     if form.is_valid(): 
      newdoc= XXXX(docfile=request.FILES['docfile']) 
      newdoc.save() 
      return HttpResponseRedirect(reverse('homepage')) 
     else: 
      return HttpResponseBadRequest() 
    else: 
     form = XXXXForm() 
    return render_to_response(
     'dataentry.html', 
     { 
      'form': form, 
      'title': 'Import excel data into database example', 
      'header': 'Please upload XXXX.xlsx:', 
      'message': 'File Saved!' 
     }, 
     context_instance=RequestContext(request)) 

<!--How can I embed the following part to previous part?--> 

class OverwriteStorage(FileSystemStorage): 
    def _save(self, name, content): 
     if self.exists(name): 
      self.delete(name) 
     return super(OverwriteStorage, self)._save(name, content) 

    def get_available_name(self, name): 
     return name 
+0

你不打電話給你刪除功能 – maazza

+0

@maazza,你能不能請在下方粘貼您的更正後的代碼?謝謝。 –

+0

正如@maazza所說,你創建了你的函數,但你並沒有調用它。在代碼中的某處,您應該調用它以便運行.. – qasimalbaqali

回答

6

可能是這樣的:

我不跑我的代碼,這是一個例子

if request.method == "POST": 
     form = XXXXForm(request.POST,request.FILES) 
     if form.is_valid(): 
      docfile=request.FILES['docfile']

  if isinstance(docfile, (InMemoryUploadedFile, TemporaryUploadedFile)): 
      book = xlrd.open_workbook(file_contents=docfile.read(), formatting_info=True, on_demand=True) 
     else: 
      book = xlrd.open_workbook(filename=docfile, formatting_info=True, on_demand=True) 

     sheet = book.sheet_by_index(0) 
     new_csv_file = csv.writer(open('new_filename', 'w')) 
     # read file 
     for line in range(1, sheet.nrows): 
      new_row = [request.session.get('uploader'), request.session.get('date')] 
      new_row.extend(sheet.row_values(line))     
      new_csv_file.writerow(new_row) 

...

+0

嗨@mrvol,實際上最後我採用了另一種使用SQL原始查詢的方法,它只是一個黑客,但至少可以解決問題。 –

+0

@Héléna如果你想插入數據庫數據,那很簡單。首先,您需要爲這些數據創建模型。這與「上傳器,日期,問題,選擇,投票」字段類似。在清理表單之後,按照下面的示例迭代文件,並使用值創建列表。然後像這樣保存你的列表到數據庫https://docs.djangoproject.com/en/1.9/ref/models/querysets/#django.db.models.query.QuerySet.bulk_create – mrvol

相關問題