2015-10-19 43 views
8

我需要爲訪問者提供來自django數據庫的excel格式的數據。在django中將openpyxl工作簿對象返回爲HttpResponse。可能嗎?

我能想到的唯一方法是通過以下步驟:從數據庫

  1. 提取數據。
  2. Workbook對象包裝openpyxl
  3. 暫時保存在某處。
  4. 再次閱讀爲'rb'。
  5. 返回視圖excel's mime type
  6. 刪除磁盤上的excel文件。 (現在沒用了吧?)

那應該這樣做。但是,我認爲還有另一種更好的方法來做到這一點。我的意思是 也許有一種方法可以返回openpyxl對象作爲HttpResponse直接 沒有中間文件中。

所以,在這裏我的問題是:是否有可能返回openpyxlWorbook 對象? (我是openpyxl

回答

10

實際上並不需要將數據保存在磁盤上的任何位置; openpyxl有辦法做到這一點,雖然它沒有很好的記錄。很久以前,我使用xlwt創建了something like this,但我最近也使用openpyxl在Falcon框架中構建了類似的東西。

把他們倆撮合在一起,你的代碼將沿着線的東西:

from django.http import HttpResponse 
from openpyxl import Workbook 
from openpyxl.writer.excel import save_virtual_workbook 


workbook = Workbook() 
worksheet = workbook.active 

# ... worksheet.append(...) all of your data ... 

response = HttpResponse(content=save_virtual_workbook(workbook), mimetype='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet') 
response['Content-Disposition'] = 'attachment; filename=myexport.xlsx' 
return response 

如果生成的文件較大,我會建議考慮使用StreamingHttpResponse,但我相信,這將至少讓你去。

這只是一個基於合併的兩個項目的工作,我可以說是一個非常好的片段,所以它可能不完全正確。它應該是非常接近,但。在獵鷹的輸出看起來像:

response.content_type = 'application/octet-stream;' 
response.set_header('Content-Disposition', 'attachment; filename=myexport.xlsx') 
response.body = save_virtual_workbook(workbook) 

UPDATE: 這是現在更容易,因爲我做了我的老django-excel-response庫的一個完全重寫,使用openpyxl!現在可以在這裏找到:https://github.com/tarkatronic/django-excel-response

您可以使用pip install django-excel-response進行安裝,並將其作爲Django的HttpResponse的替代品使用!包含最少的文檔,歡迎提供改進/建議。 :)

相關問題