openpyxlで、Excelに書式を設定したい ~日時の表示編~

※社外のコラムニストによる記事です。Python関連の情報をお伝えします。
「シゴトがはかどるPython自動処理の教科書(著:クジラ飛行机様/マイナビ出版)」を利用して、Pythonを使った自動化について学んでいきます。
前回からChapter2-8に入り、openpyxlでExcelの表示形式の変更の内、数値の表示について学びました。
今回は日時フォーマットの指定方法について学びます。
日時を設定するためのフォーマット
数値の表示と同様、日付のフォーマットも設定できます。
まずは、どのような表示があるのか確認してみます。基本的にはExcelでの書式設定と同じなので、忘れた場合はそちらを参照すれば問題ないでしょう。テキストでは、年月日や英語表記の基本部分が個別に記載されていますが、ここでは組み合わせた状態で書いていきます。
<日付のフォーマット>
| 表示形式 | フォーマット | 表示例 |
| 年/月/日 | yyyy/mm/dd | 2026/01/19 |
| 年月日(日本語) | yyyy年m月d日 | 2026年1月19日 |
| 月/日 | m/d | 1/19 |
| 月名-日(英語) | mmm-d | Jan-19 |
| 月名 日, 年(英語) | mmmm d, yyyy | January 19, 2026 |
| 曜日(短)(英語) | ddd | Mon |
| 曜日(長)(英語) | dddd | Monday |
| 日付+曜日(英語) | yyyy/mm/dd (ddd) | 2026/01/19 (Mon) |
| 和暦年月日 | [$-411]ggge年m月d日 [$-ja-JP]ggge年m月d日 [$-ja-JP-x-gannen] ggge年m月d日(aaa) | 令和8年1月19日 ※[$-ja-JP-x-gannen]のみ、元年表示可能 |
| 和暦年月日曜日 | [$-411]ggge年m月d日(aaa) [$-ja-JP] ggge年m月d日(aaa) [$-ja-JP-x-gannen] ggge年m月d日(aaa) | 令和8年1月19日(水) ※[$-ja-JP-x-gannen]のみ、元年表示可能 |
和暦表示を行う場合、Excelでは日本語ロケール指定と和暦用の書式指定を組み合わせて解釈します。
[$-411] や [$-ja-JP] は日本語ロケールを指定するためのもので、日本語環境では g(元号)や e(和暦年)を含む書式を指定すると、暗黙的に和暦として表示される挙動になります。
なお411は日本語のロケール番号で、Excelの内部で使用されてきた日本語を指定するIDです。日本語環境として解釈するために指定するものだそうです。
ちなみに、和暦では最初の1年目を「令和元年」と表記します。[$-411] や [$-ja-JP] でも現行環境では元年表示になる場合がありますが、これは暗黙的な挙動であり、仕様として保証されているわけではないようです。令和元年という表記に対応していることを含めて確実に和暦を表示したい場合、特に業務用途では[$-ja-JP-x-gannen]を使用する方がよさそうです。
<時間のフォーマット>
時間のフォーマットも確認しておきます。
| 表示 | フォーマット | 表示例 |
| 年/月/日 時:分 | yyyy/mm/dd hh:mm | 2026/1/19 14:30 |
| 年-月-日 時:分:秒 | yyyy-mm-dd hh:mm:ss | 2026/1/19 14:30 |
| 月名 日 時刻 | mmm d hh:mm | 2026/1/19 14:30 |
| 日本語フル | yyyy年m月d日 h時mm分 | 2026年1月19日 14時30分 |
日時を実際に設定してみよう
実際にサンプルコードを使って確認してみます。
P.87 サンプルコード
import openpyxl as xl
# ブックを作りシートを得る
book = xl.Workbook()
sheet = book.active
# A1,B1,C1,D1に同じ日時の値を指定 --- (*1)
import datetime
dt = datetime.datetime(
year=2023, month=4, day=5,
hour=11, minute=22, second=33)
sheet.append([dt, dt, dt, dt])
# 日付を「yyyy/mm/dd」で指定する --- (*2)
sheet["A1"].number_format = 'yyyy/mm/dd'
# 日付を「yyyy年mm月dd日」で指定する --- (*3)
sheet["B1"].number_format = 'yyyy年mm月dd日'
# 時間を「hh:mm:ss」で指定する --- (*4)
sheet["C1"].number_format = 'hh:mm:ss'
# 日付と時間を「mm/dd hh:mm:ss」で指定する --- (*5)
sheet["D1"].number_format = 'mm/dd hh:mm:ss'
# 保存
book.save("number_format_datetime.xlsx")
全てのセルに設定されている日時は同じものになっています。
sheet.append([dt, dt, dt, dt])で
これを実行するとこのExcelファイルが作成されます。

和暦についても確認してみます。
コードにこれを追加して確認します。(dtは追加した分だけ追記が必要です。)
元年表示の確認のため、設定する日時の値は2023年4月5日から2019年5月5日に変更します。(令和元年は2019年5月1日からのため)
sheet["E1"].number_format = '[$-411]ggge年m月d日(aaa)'
sheet["F1"].number_format = '[$-ja-JP]ggge年m月d日(aaa)'
sheet["G1"].number_format = '[$-ja-JP-x-gannen]ggge年m月d日(aaa)'
これを実行すると、以下の結果が表示されます。

問題なく、元年表示されました。
- 補足:Pythonの標準ライブラリdatetimeにおけるdateとdatetimeの違い
Pythonの標準ライブラリ datetime は、日時に関する処理を行うためのライブラリです。
このライブラリにはいくつかのクラスが含まれており、日付(datetime.date)、日時(datetime.datetime)、時刻(datetime.time)、時間差(datetime.timedelta)などがあります。
今回のサンプルコードでは、年・月・日だけでなく、時間の情報(hour / minute / second)も扱っているため、datetime.datetime が使用されています。もし時刻を扱う必要がなく、日付のみを処理したい場合は、datetime.date を使用します。
では、きりが良いので、今回はこちらで終了です。お付き合いいただき、ありがとうございました。
Pythonの自動化で業務の効率化を図りたい方は、グローバルウェイに相談してみてはいかがでしょうか?詳しくは、以下のページをご覧ください。


