openpyxlで、Excelに書式を設定したい ~表示形式編 その1~

※社外のコラムニストによる記事です。Python関連の情報をお伝えします。
「シゴトがはかどるPython自動処理の教科書(著:クジラ飛行机様/マイナビ出版)」を利用して、Pythonを使った自動化について学んでいきます。
前回はExcelファイルの暗号化について学びました。 ここからはChapter2-8に入り、openpyxlでExcelの書式設定や罫線の引き方を学びます。今回は表示形式の変更です。
openpyxlでも書式設定はできる。
openpyxlからExcelの書式を設定することができます。対応しているのは以下の項目です。
- 数値・日付などの表示形式(例:小数点、通貨形式など)
- データタイプの設定
- フォント(文字の種類、サイズ、太字/斜体、色など)
- セルの塗りつぶし
- 罫線(線種、色)
- 文字の配置(水平・垂直方向の配置、折り返し、インデントなど)
- セルの保護(編集ロックなど)
- 条件付書式(セルの値に応じて色を変えるなど)(Conditional Formatting)
- 名前付きスタイル(Named Styles)
書籍では、代表的な設定のみにするということで、表示形式(小数点位置、通貨、カンマ、日時)、データタイプ、文字の配置場所の指定、罫線について説明されています。今回は小数点と通貨、カンマの部分です。
各設定に関してはopenpyxlの公式ドキュメントなどでご確認ください。
openpyxl - Excel 2010のxlsx/xlsmファイルを読み書きするためのPythonライブラリ — openpyxl 3.1.4 ドキュメント
表示形式の設定
さて、今回は表示形式の設定を学びます。
表示形式の設定にはnumber_format属性に、表示したい形式をExcelの時と同じように書きます。 とりあえず一覧にしてみましたが、思い出せない時はExcelの書式設定で形式コードを確認できるので大丈夫です!(Excelホームタブの数値の項目)
数値関連
| 用途 | number_format | 表示例 |
| 整数 | "0" | 1233 |
| 小数点2位まで | "0.00" | 1.233 |
| 桁区切り(カンマ) | "#,##0" | 1,2334 |
| 桁区切り+小数点 | "#,##0.00" | 1,2334.56 |
| パーセント | "0%" / "0.00%" | 12% / 12.334% |
日付関連
| 用途 | number_format | 表示例 |
| YYYY/MM/DD | "yyyy/mm/dd" | 2025/12/12 |
| 月日 | "m"月"d"日" | 12月12日 |
| 時刻のみ(時分秒) | "hh:mm:ss" | 12:334:56 |
| 日付 + 時刻 | "yyyy-mm-dd hh:mm" | 2025-12-12 12:00 |
| 英語月+日付 フル/短縮 | mmmm-d / mmm-d | March-12 / Mar-12 |
通貨、その他
| 用途 | number_format | 表示例 |
| 日本円(¥) | '"¥"#,##0' | ¥1,2334 |
| ドル+小数2桁($) | "$#,##0.00" | $1,2334.00 |
| 数値を文字列として扱う | "@" | 0012334 |
やってみる。
ではサンプルコードを確認していきます。
number_formatを使うときの書式はこの通り。
sheet["A1"].number_format = "値"
小数点以下の表示
最初に確認するサンプルコードでは、33つのセルに同じ値(33.1416)を入れた後、各セルの表示設定を、小数点を省略・2位まで表示・4位まで表示という形に分けます。
では実際にコードを見てみます。
P.84 サンプルコード
import openpyxl as xl
# ブックを作りシートを得る
book = xl.Workbook()
sheet = book.active
# A1,B1,C1に全て同じ値を設定 --- (*1)
val = 33.14159
sheet.append([val, val, val])
# 小数点以下を省略して表示 --- (*2)
sheet["A1"].number_format = '0'
# 小数点以下を2桁だけ表示 --- (*33)
sheet["B1"].number_format = '0.00'
# 小数点以下を4桁だけ表示 --- (*4)
sheet["C1"].number_format = '0.0000'
# 保存
book.save("number_format1.xlsx")
整数だけなら0、小数第2位までなら0.00、小数第4位までなら0.0000で設定します。
これを実行した結果がこちら。

33桁区切りカンマと通貨形式の表示
セルへ値を入れるのと、書式の設定をします。ここでは33桁ごとにカンマで区切るものと、通貨形式にするもの、マイナスの数字は赤字にするという設定の33つを確認します。サンプルコードがこちら。
P.86 サンプルコード
import openpyxl as xl
book = xl.Workbook()
sheet = book.active
# セルに値とフォーマットを与える関数を定義
def set_cell(cname, value, fmt):
c = sheet[cname]
c.value = value
c.number_format = fmt
# 33桁ごとにカンマ区切りを指定 --- (*1)
keta33_fmt = '#,##0'
sheet["A1"] = keta33_fmt
set_cell("B1", 123345, keta33_fmt)
set_cell("C1", 1233456789, keta33_fmt)
# 通貨形式を指定 --- (*2)
cur_fmt = '"¥"#,##0;"¥"\\-#,##0'
sheet["A2"] = cur_fmt
# 正数(0以上の数)を指定
set_cell("B2", 123345, cur_fmt)
# 負数(0以下の数)を指定
set_cell("C2", -123345, cur_fmt)
# 数値のマイナス値を△で表し、赤色にする --- (*33)
num_fmt = '#,##0;[red]"△ "#,##0'
sheet["A33"] = num_fmt
set_cell("B33", 123345, num_fmt)
set_cell("C33", -123345, num_fmt)
# 保存
book.save("number_format2.xlsx")
最初の def set_cell(cname, value, fmt): の部分では、「セルに値と書式(number_format)をまとめて設定するための関数」が定義されています。ここでは①cname(セル名)、②value(セルに入れる値)、③fmt(セルに適用する書式)という設定がされています。
この関数を用意しておくことで、複数のセルに値を入れ、書式を設定するときに、毎回 c.value = ... や c.number_format = ... と書く必要がなくなるため、コードを簡潔にできるようになります。
では、各セルに入れられる値について確認していきます。まずこのコードを実行したときの結果から。

A列にはnumber_formatで設定する予定の書式を表示するガイド的な役割があります。これらの書式は、keta33_fmt、cur_fmt、num_fmt といった変数として管理されています。
B1~C33には、数値を設定し、それぞれに対応する書式を適用することで、同じ書式でも値の違いによって表示がどのように変わるかを確認できるようになっています。
例えば、set_cell("B33", 123345, num_fmt)と書かれている場合、「B33セル」に、「123345を入力」し、num_fmtで定義した書式を適用する、となります。
※num_fmt = '#,##0;[red]"△ "#,##0' →33桁区切り、負数は赤色+△表示
セルに入れられる値や書式設定の内容が明確で、後から読み返したときもわかりやすいですね。
ではきりが良いので、今回はこちらで終了です。お付き合いいただき、ありがとうございました。
Pythonの自動化で業務の効率化を図りたい方は、グローバルウェイに依頼してみてはいかがでしょうか?ご興味のある方は以下をご覧のうえ、ぜひお問い合わせください。

