openpyxl と datetime で申請書テンプレートをワンクリック初期化する方法

社内稟議や経費精算など、繰り返し利用する Excel 申請書は「部署・申請者名・申請日」を入力し直し、明細欄を空に戻す作業が毎回発生します。Pythonopenpyxl を使えば、この初期化作業を数秒で自動化できます。本稿では、テンプレートを一発で初期状態へ戻すスクリプトをご紹介いたします。


目次

サンプルファイル

ファイル名用途
application_form.xlsx入力前のテンプレート
application_form_reset.xlsxスクリプト実行後に上書き保存される初期化済みファイル

スクリプト全体

from datetime import date
from openpyxl import load_workbook

# --- 1. ワークブック読み込み ---
wb_path = 'application_form.xlsx'
wb = load_workbook(wb_path)
ws = wb.active

# --- 2. 固定ヘッダー(部署・氏名・申請日)を設定 ---
ws['B3'].value = 'Sales Div. Section 2'   # 部署セル
ws['B4'].value = 'Rintaro Mori'           # 氏名セル
ws['B5'].value = date.today()             # 申請日セル

# --- 3. 明細行をクリア ---
#    対象範囲:12 行目〜シート最終行、列 C〜H
for row in ws.iter_rows(min_row=12,
                        max_row=ws.max_row,
                        min_col=3,
                        max_col=8):
    # 商品名・数量・金額を初期化
    row[0].value = None   # 商品名 (列 C)
    row[2].value = None   # 数量   (列 E)
    row[3].value = None   # 金額   (列 F)

# --- 4. ブック保存 ---
wb.save('application_form_reset.xlsx')

コード解説

ステップ説明
1. ワークブック読み込みload_workbook() でテンプレートを開きます。
2. 固定ヘッダーの更新部署セル(B3)、氏名セル(B4)、日付セル(B5)のみ書き換えます。
3. 明細行のクリアiter_rows() を使い、12 行目以降の必要列だけ None を代入して空セル化します。
4. ブック保存誤上書きを防ぐため、別名で保存しています。

応用ポイント

要件実装ヒント
明細列が増減する場合max_col を変数化し、設定ファイルから読み込む構成にすると柔軟です。
旧データをバックアップしたいwb.save('backup_' + wb_path) で実行前にコピーを作成しておくと安全です。
日付を和暦で表示したいws['B5'].number_format = 'ggge年m月d日' を追加してください。

まとめ

  • 部署・氏名・日付のセット明細行のクリア を一括実行することで、申請書テンプレートを数秒で初期状態へ戻せます。
  • iter_rows() の範囲指定と None 代入だけでセル内容を削除できるため、複雑なループは不要です。
  • 手作業に比べヒューマンエラーを大幅に削減でき、定型業務の効率化に直結します。
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次