親バカエンジニアのナレッジ帳

webのエンジニアをやっており、日頃の開発で詰まったことや書き残しておきたいことを載せています。

DjangoでDBの値をエクセル(xlsx形式)で書き出し


Pythonでxls形式の書き出しライブラリとしてはxlwtパッケージが便利ですが、
xlsx形式に対応させようとした場合はxlsxwriterというパッケージがとても便利です!
使い方を簡単に記しておきます。

まずはパッケージのインストールです。

pip install xlsxwriter

ソースは以下のように書けばOKです。

from xlsxwriter.workbook import Workbook
try:
    import cStringIO as StringIO
except ImportError:
    import StringIO
    ・
    ・
    ・
    ・
    ・
    output = StringIO.StringIO()

    book = Workbook(output)
    sheet = book.add_worksheet(unicode('シート名', 'utf_8'))

    # A列は15、B〜E列は20で幅を設定しています。自由に設定してください。
    sheet.set_column('A:A', 15)
    sheet.set_column('B:E', 20)

    # ヘッダー。第一引数が行、第二引数が列を表しています。
    sheet.write(0, 0, unicode('A列のヘッダー', 'utf_8'))
    sheet.write(0, 1, unicode('B列のヘッダー', 'utf_8'))
    sheet.write(0, 2, unicode('C列のヘッダー', 'utf_8'))
    sheet.write(0, 3, unicode('D列のヘッダー', 'utf_8'))
    sheet.write(0, 4, unicode('E列のヘッダー', 'utf_8'))

    # ここは取得するデータに合わせて取得してください。
    db_data = モデル.objects.all().order_by('id')

    row_num = 1
    for data in db_data:
        sheet.write(row_num, 0, data.culumn1)
        sheet.write(row_num, 1, data.culumn2)
        sheet.write(row_num, 2, data.culumn3)
        sheet.write(row_num, 3, data.culumn4)
        sheet.write(row_num, 4, data.culumn5)

        row_num += 1
    book.close()

    # construct response
    output.seek(0)
    response = HttpResponse(output.read(), content_type="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
    response['Content-Disposition'] = "attachment; filename=ファイル名.xlsx"

    return response


基礎から学ぶ Django

基礎から学ぶ Django

  • 作者: 関根裕紀,新井正貴
  • 出版社/メーカー: シーアンドアール研究所
  • 発売日: 2019/05/07
  • メディア: 単行本(ソフトカバー)
  • この商品を含むブログを見る
Python Django 超入門

Python Django 超入門