2015-10-19 14 views
8

私は、djangoのデータベースから書式設定されたデータを訪問者に提供する必要があります。djangoでopenpyxlワークブックオブジェクトをHttpResponseとして返します。出来ますか?

私は考えることができる唯一の方法は、以下の手順である:データベースから

  1. データを抽出。
  2. Workbookオブジェクトで囲みます。openpyxlです。
  3. 一時的にどこかに保存してください。
  4. 「rb」ともう一度お読みください。
  5. 返信表示はexcel's mime typeです。
  6. ディスク上のファイルを削除します。 (それは今役に立たないのか?)それを行う必要があります

が。しかし、私はこれを行うもう一つの良い方法があると思います。私は が多分中間ファイル媒体なしに直接HttpResponse としてopenpyxlオブジェクトを返す方法がありますを意味します。

私の質問はここにあります:openpyxlWorbook オブジェクトを返すことができますか?あなたが実際にディスク上の任意の場所にデータを保存する必要はありません

答えて

10

(私はopenpyxlに新たなんです)。 openpyxlにはこれを行う方法がありますが、それはあまり詳しくは書かれていません。長い間、私はsomething like thisをxlwtを使って作成しましたが、最近は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を使用してに探してお勧めだろうが、私は、これは、少なくともあなたを得ると確信してい行く。

これは、私が働いていた2つのプロジェクトのマージに基づいてちょうどオフカフの抜粋ですので、それは正確に正しくない可能性があります。それはかなり近いはずです。ファルコンでの出力は次のように見えた:

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

UPDATE:私はopenpyxlを使用して、私の古いdjango-excel-responseライブラリの完全な書き換えを行ったように これは、今非常に簡単です! https://github.com/tarkatronic/django-excel-response

pip install django-excel-responseと一緒にインストールして、DjangoのHttpResponseの代わりに使用することができます。最小限のマニュアルが含まれており、改善/提案は大歓迎です。 :)

関連する問題