Django のデータベースから Excel 形式のデータを訪問者に提供する必要があります。
私が考えられる唯一の方法は、次の手順を実行することです。
- データベースからデータを抽出します。
Workbook
からのオブジェクトでラップしますopenpyxl
。- 一時的にどこかに保存してください。
- もう一度「rb」と読んでください。
- 戻るビューExcel の MIME タイプ。
- ディスク上の Excel ファイルを削除します。(もう役に立たないですよね?)
それでうまくいくはずです。しかし、これを行うには別のより良い方法があると思います。つまり、中間ファイル媒体なしでopenpyxl
オブジェクトを直接返す方法があるかもしれません。HttpResponse
openpyxl
それで、私の質問は、のオブジェクトを返すことは可能でしょうかWorbook
? (私は の初心者ですopenpyxl
)
ベストアンサー1
実際にはデータをディスク上のどこかに保存する必要はありません。openpyxlにはこれを行う方法がありますが、あまりよく文書化されていません。かなり前に、私はこのようなものxlwtを使っていますが、最近は似たようなものも作りましたファルコンopenpyxl を使用したフレームワーク。
これら 2 つを組み合わせると、コードは次のようになります。
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 つのプロジェクトを統合した即席のスニペットなので、正確には正確ではない可能性があります。ただし、かなり近いはずです。Falcon の出力は次のようになります。
response.content_type = 'application/octet-stream;'
response.set_header('Content-Disposition', 'attachment; filename=myexport.xlsx')
response.body = save_virtual_workbook(workbook)
アップデート:古いライブラリを openpyxl を使用して完全に書き直したので、作業がずっと簡単になりましたdjango-excel-response
。次の場所にあります:https://github.com/tarkatronic/django-excel-response
でインストールしてpip install django-excel-response
、Django の の代替として使い始めることができますHttpResponse
。最小限のドキュメントが付属しており、改善や提案は大歓迎です。 :)