PythonでExcelのセル入力&編集したExcelブックをDjangoでダウンロード(openpyxl)

はじめに

openpyxlを使ってPythonExcelファイルを編集します。

$ pip install openpyxl

Excelのセルを入力するスクリプト

以下のスクリプトでは次の単純なセル入力を実装してみます。

  • example.xlsx を開く
  • ワークシートを選択
  • 指定したセルに値を設定
  • ブックを上書き保存
import openpyxl

# 編集するExcelブックのパス
path_to_excel_book = 'example.xlsx'

# ブックを開く
wb = openpyxl.load_workbook(path_to_excel_book)

# ワークシートを選択
ws = wb.active

# A1形式でセル編集
ws['A1'] = 'foo'
ws['B3'] = 'bar'

# R1C1形式でセル編集
ws.cell(row=5, column=1).value = 'foo'
ws.cell(row=5, column=2).value = 'bar'
ws.cell(row=6, column=3).value = 'foo'
ws.cell(row=6, column=4).value = 'bar'
ws.cell(row=7, column=5).value = 'foo'
ws.cell(row=7, column=6).value = 'bar'

# ブックを上書き保存
wb.save(path_to_excel_book)

たったこれだけです。
実装したスクリプトを実行すると以下のようにExcelシートに値が入力されます。
以下の実行結果では新規作成したファイルを使っていますが、事前にExcelシートに設定しておいたフォーマットは維持されます。
実際のユースケースとしては、テンプレートとなる体裁を整えたファイルを事前に用意しておき、 DBやファイル等から取得した値をセルに設定することになるでしょう。

f:id:hiroki-sawano:20200806210319p:plain

特に説明していませんが、openpyxlを使えばブックやシートを作成したり、行を挿入したり、図を作成したりできるので、大抵の手入力作業は自動化できると思います。

Djangoのビューで編集したExcelファイルをダウンロード

openpyxl.writer.excel.save_virtual_workbookでメモリ上のワークブックを返却できますので、前述したようなスクリプトで加工したブックをダウンロードする機能を簡単に実装できます。

from django.http import HttpResponse
from openpyxl.writer.excel import save_virtual_workbook
...
def download(request):
    # Excelブックの編集処理
    wb = openpyxl.load_workbook(...)
    # ...
    response = HttpResponse(content=save_virtual_workbook(wb), content_type='application/vnd.ms-excel')
    response['Content-Disposition'] = 'attachment; filename="your_book.xlsx"'
    return response