Django で openpyxl ワークブック オブジェクトを HttpResponse として返します。可能ですか? 質問する

Django で openpyxl ワークブック オブジェクトを HttpResponse として返します。可能ですか? 質問する

Django のデータベースから Excel 形式のデータを訪問者に提供する必要があります。

私が考えられる唯一の方法は、次の手順を実行することです。

  1. データベースからデータを抽出します。
  2. Workbookからのオブジェクトでラップしますopenpyxl
  3. 一時的にどこかに保存してください。
  4. もう一度「rb」と読んでください。
  5. 戻るビューExcel の MIME タイプ
  6. ディスク上の 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。最小限のドキュメントが付属しており、改善や提案は大歓迎です。 :)

おすすめ記事