機械の中の学習日誌

社畜によるIT技術メモです。今日も元気です。

DataFrameをエクセル形式でダウンロード

やりたいこと

DataFrameを使って前処理をした後のデータをエクセルとして出力したい

環境

エクセル関係のライブラリ

エクセル出力に必要なライブラリをインストール

pip install xlrd
pip install xlsxwriter

コード

バイナリI/Oにエクセルを書き出して、レスポンスとして返す。

ファイル名に日本語を使うときは、別途処理が必要。(次に記載のURL参照。)

import pandas as pd
from io import BytesIO

def output_excel(request):

    # 前処理などしたDataFrame
    df = execute_some_preprocessing(data)

    # エクセルをメモリーに保存
    bio = BytesIO()
    writer = pd.ExcelWriter(bio, engine='xlsxwriter')
    df.to_excel(writer, index=False)
    writer.save()
    
    bio.seek(0)
    wb = bio.read()

    # MIMEタイプを指定してエクセルをレスポンスとして返す
    file_name = 'xxxxxxxxxxxxxxxxxxxxx.xlsx'
    response = HttpResponse(wb, content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')
    response['Content-Disposition'] = 'attachment; filename=' + file_name

    return response

ファイル名を日本語にしたい

qiita.com

参考

python - Django Pandas to http response (download file) - Stack Overflow

pandas - Create an excel file from BytesIO using python - Stack Overflow

io --- ストリームを扱うコアツール — Python 3.8.2 ドキュメント