Python
Excel
レポート
Openpyxl

PythonのoepnpyxlでテンプレートファイルからExcel帳票を作成する

1. はじめに

以前にxlsxwriterを利用したExcelの作成について記事にしましたが、xlsxwriterではExcelの読み込みができないことが分かりました。そこで今回はoepnpyxlを利用して、事前に用意したExcelテンプレートファイルからExcel帳票を作成する方法について説明したいと思います。

(以前の記事)

2. ソースコード

excelReportWithOpenpyxl.py
# -*- coding: utf-8 -*-
import openpyxl
import datetime

# report excel using template file
def write():
    # ★ポイント1
    # テンプレートファイルを読み込む
    workbook = openpyxl.load_workbook('reservationTemplate.xlsx')
    # ゼロからExcelファイルを作る場合
    #  workbook = openpyxl.Workbook()

    # ★ポイント2
    worksheet = workbook.get_sheet_by_name(u'予約')

    # ★ポイント3
    # 行、列は1開始のインデックス
    worksheet.cell(row=5, column=6).value = unicode('12345678', 'utf-8')

    # ★ポイント4
    # 書式フォーマットは再設定が必要
    currentFormat = worksheet['AA5'].number_format
    worksheet['AA5'].value = datetime.date.today()
    worksheet['AA5'].number_format = currentFormat

    # ★ポイント5
    workbook.save('reservation.xlsx')

if __name__=='__main__':
    write()

★ポイント1

最初にopenpyxl.load_workbook()でExcelのワークブックのインスタンスを生成します。
引数には読み込むExcelテンプレートファイルのファイル名を指定します。

ちなみに、ゼロからExcelファイルを作成する場合はopenpyxl.Workbook()でワークブックのインスタンスを生成します。

★ポイント2

次にworkbook.get_sheet_by_name()でワークシートを選択します。
引数にはワークシート名を指定します。unicodeで指定すれば日本語のシート名でも動作します。

★ポイント3

セルの選択方法はR1C1形式(行と列を個別に指定)とA1形式の2つがあります。
R1C1形式の場合、worksheet.cell(row=行番号, column=列番号)でセルを選択します。
行番号と列番号は0ではなく1から開始するので注意してください。
value属性でセルの値にアクセスできるので、これで値の読み取りや変更を行います。

★ポイント4

A1形式の場合、worksheet['A1']でセルを選択します。値の参照、変更はR1C1形式と同様にvalue属性を利用します。

(書式フォーマットに関する注意)

テンプレートファイルで書式フォーマットを設定している場合、number_formatで値を設定する前にフォーマットを取得して、値を設定した後、事前に取得したフォーマットをnumber_formatで再設定してください。
自分の環境では再設定しないとテンプレートで設定したフォーマットが反映されませんでした。

★ポイント5

最後にworkbook.save()でファイルに書き込みます。
引数には保存する際のファイル名を指定します。

3. さいごに

今回はoepnpyxlを利用して、事前に用意したExcelテンプレートファイルからExcel帳票を作成する方法について説明しました。
もともとxlsxwriterだとExcelファイルの読み込みができないことが今回の記事の始まりでした。xlsxwriterの機能をしっかりと調査していれば、読み込みも書き込みも可能なoepnpyxlを最初から利用していたと思います。
今後ライブラリを選定する際は、利用可能な機能を事前にしっかりと調査していきたいと思います。