openpyxl.formatting.rule.Ruleを徹底解説!セルの値で書式を自動変更する方法

openpyxl

はじめに:Excel書式設定の自動化はRuleが鍵

PythonでExcelファイルを操作していると、「特定の条件を満たすセルだけ、自動で書式を変えたい」と思うことはありませんか?例えば、売上データが目標を超えたらセルを緑色にしたり、在庫数が少なくなったら赤字にしたりといった作業です。

手作業で行うExcelの「条件付き書式」機能は、Pythonの**openpyxl**ライブラリを使えば完全に自動化できます。そして、その自動化の心臓部となるのが、今回徹底解説するopenpyxl.formatting.rule.Ruleクラス群です。

この記事を読めば分かること

  • openpyxlで条件付き書式を設定する基本的な流れ
  • Ruleオブジェクトの役割と基本的な使い方
  • CellIsRuleFormulaRuleなど、実践で役立つ5種類のRuleの実装方法
  • コピペで動かせる具体的なサンプルコード

少し専門的に聞こえるかもしれませんが、仕組みはとてもシンプルです。この記事を読み終える頃には、皆さんのExcelレポート作成業務が格段に効率化されているはずです。

「条件付き書式」で面倒な手作業をなくそう

条件付き書式とは、その名の通り**「設定したルール(条件)に応じて、セルの書式を自動で変更する」**機能です。

この機能をPythonコードで制御することで、データが更新されるたびに手動で色を塗り直すといった、単純ながらも時間のかかる作業から解放されます。プログラムで一貫したルールを適用できるため、ヒューマンエラーを防ぐ効果も期待できます。

openpyxlにおける条件付き書式の基本設定

まずは、条件付き書式を適用するための基本的なコードの構造を理解しましょう。登場人物は「適用範囲」「ルール」「スタイル」の3つです。

ワークシートにルールを追加するconditional_formatting.add()

条件付き書式は、ワークシートオブジェクトが持つconditional_formatting.add()メソッドを使って設定します。

# worksheetオブジェクトに対し、範囲とルールを指定して追加する
worksheet.conditional_formatting.add('A1:D10', rule_object)

第一引数に書式を適用したいセルの範囲(例:'A1:D10')を、第二引数にこれから作成するRuleオブジェクトを指定します。

書式(スタイル)を事前に定義する

ルールに一致したセルをどのような見た目にしたいか、スタイルを事前にオブジェクトとして作成しておく必要があります。よく使うのは文字のスタイルを決めるFontと、セルの背景色を決めるPatternFillです。

from openpyxl.styles import Font, PatternFill

# 赤色の太字フォント
error_font = Font(color="9C0006", bold=True)

# 明るい緑色の背景
success_fill = PatternFill(start_color="C6EFCE", end_color="C6EFCE", fill_type="solid")

これらのスタイルオブジェクトをRuleオブジェクトに渡すことで、条件に応じた書式変更が実現します。

【種類別】Ruleオブジェクトの具体的な使い方5選

それでは、本題であるRuleオブジェクトの種類と使い方を見ていきましょう。ここでは特に使用頻度の高い5つのRuleを厳選して紹介します。

① CellIsRule:セルの値がXと比べてどうか

最もシンプルでよく使われるのがCellIsRuleです。セルの値が指定した値より大きい、小さい、等しいといった条件で書式を変更します。

例:点数が30点未満のセルの文字を赤くする

from openpyxl import Workbook
from openpyxl.styles import Font
from openpyxl.formatting.rule import CellIsRule

wb = Workbook()
ws = wb.active
ws.title = "成績表"

# サンプルデータ
scores = [80, 25, 95, 18, 60]
for i, score in enumerate(scores, 1):
    ws.cell(row=i, column=1, value=score)

# スタイル: 赤字
red_font = Font(color="9C0006")

# Rule: セルの値が30未満
rule = CellIsRule(operator="lessThan", formula=["30"], font=red_font)

# ルールをA1:A5に適用
ws.conditional_formatting.add("A1:A5", rule)

wb.save("cell_is_rule_sample.xlsx")

② FormulaRule:数式の結果が真(True)かどうか

FormulaRuleを使えば、Excelの数式を利用した複雑な条件が設定できます。例えば「A列の値がB列の値より大きい場合」といった、複数セル間の比較が可能になります。

例:実績(B列)が目標(A列)を上回ったセルの背景を緑にする

from openpyxl import Workbook
from openpyxl.styles import PatternFill
from openpyxl.formatting.rule import FormulaRule

wb = Workbook()
ws = wb.active

# サンプルデータ (A列:目標, B列:実績)
data = [(100, 120), (150, 140), (200, 250)]
for i, d in enumerate(data, 1):
    ws.cell(row=i, column=1, value=d[0])
    ws.cell(row=i, column=2, value=d[1])

# スタイル: 明るい緑の背景
green_fill = PatternFill(bgColor="C6EFCE")

# Rule: B1 > A1 (適用範囲の左上のセルを基準に数式を記述)
rule = FormulaRule(formula=["$B1>$A1"], fill=green_fill)

# ルールをB1:B3に適用
ws.conditional_formatting.add("B1:B3", rule)

wb.save("formula_rule_sample.xlsx")

③ ColorScaleRule:値の大小を色の濃淡で表現

ColorScaleRuleは、データの分布を**色のグラデーション(カラースケール)**で可視化します。最小値、中間値、最大値にそれぞれ色を指定することで、数値の傾向を直感的に把握できます。

例:値が小さいと白、大きいと青になるカラースケール

from openpyxl import Workbook
from openpyxl.formatting.rule import ColorScaleRule

wb = Workbook()
ws = wb.active

# 1から10までのデータ
for i in range(1, 11):
    ws.cell(row=i, column=1, value=i)

# Rule: 2色のカラースケール (白 -> 青)
rule = ColorScaleRule(start_type='min', start_color='FFFFFF',
                      end_type='max', end_color='5B9BD5')

# ルールをA1:A10に適用
ws.conditional_formatting.add("A1:A10", rule)

wb.save("color_scale_sample.xlsx")

④ IconSetRule:値の範囲をアイコンで示す

IconSetRuleは、セルの値がどの範囲に属するかを信号機や矢印などのアイコンセットで表現します。プロジェクトの進捗ステータスや評価などを視覚的に示すのに非常に便利です。

例:進捗率に応じて信号機アイコンを表示

from openpyxl import Workbook
from openpyxl.formatting.rule import IconSetRule

wb = Workbook()
ws = wb.active

# サンプルデータ (進捗率)
progress_data = [10, 50, 95, 30]
for i, d in enumerate(progress_data, 1):
    ws.cell(row=i, column=1, value=d)

# Rule: 3TrafficLights1 (信号機) アイコンセット
# 67パーセンタイル以上で緑、33以上で黄、それ未満で赤
rule = IconSetRule(iconSet='3TrafficLights1', type='percent', values=[33, 67])

# ルールをA1:A4に適用
ws.conditional_formatting.add("A1:A4", rule)

wb.save("icon_set_sample.xlsx")

⑤ DataBarRule:値の大きさをデータバーで示す

DataBarRuleは、セルの中に**値の大きさに比例した横棒グラフ(データバー)**を描画します。各項目の数値を視覚的に比較したい場合に最適な方法です。

例:売上数値の大きさを青色のデータバーで可視化

from openpyxl import Workbook
from openpyxl.formatting.rule import DataBarRule

wb = Workbook()
ws = wb.active

# サンプルデータ (売上)
sales_data = [120, 350, 80, 500, 280]
for i, d in enumerate(sales_data, 1):
    ws.cell(row=i, column=1, value=d)

# Rule: データバー
rule = DataBarRule(start_type='min', end_type='max', color="638EC6")

# ルールをA1:A5に適用
ws.conditional_formatting.add("A1:A5", rule)

wb.save("data_bar_sample.xlsx")

これらのコードはPython 3.6以降、openpyxl 3.0.0以降の環境で広く動作します。

まとめ:RuleをマスターしてExcel操作を効率化しよう

今回は、openpyxlライブラリの心臓部ともいえるopenpyxl.formatting.rule.Ruleクラス群について、具体的な5つの種類を解説しました。

  • CellIsRule: 単純な値の比較
  • FormulaRule: 複雑な数式での条件指定
  • ColorScaleRule: 色の濃淡でデータの分布を表現
  • IconSetRule: アイコンでステータスを明示
  • DataBarRule: データバーで量の比較を容易に

これらのRuleを適切に使い分けることで、単なるデータ出力だけでなく、分析的で視覚に訴えるExcelレポートをPythonで自動生成できるようになります。

ぜひ、日々の業務に取り入れて、面倒な書式設定作業の自動化を実現してください。

コメント

タイトルとURLをコピーしました