Pythonライブラリ(openpyxl)によるExcelの条件付き書式(指定セルの強調表示、上下限ツール)【徹底解説】

スポンサーリンク
Python外部ライブラリ(openpyxl)_条件付き書式Part2 openpyxl

本記事ではMS-Office ExcelをPythonで操作するライブラリとして「openpyxl」の解説をしていきます。

Excelには多くの機能が搭載されておりますので、一記事で簡潔に解説することはできません。従いまして、大項目(機能)ごとに分けた連載記事として執筆しています。

Part6_目次
図1 連載記事の解説予定

前回(連載5回目)の記事では、前編としてセルに条件付き書式「データバー」「アイコンセット」「カラースケール」を設定する方法について解説してきました。条件付き書式を適用することでデータ全体の傾向を簡単に可視化することができます。

前回の記事はこちらになりますので、参考にして下さい。


本記事では引き続き、「セルの条件付き書式」の後編としてStandard/Custom形式に分類される「セルの強調表示ツール」「上位・下位ツール」とその他補足事項について取り上げていきます。

この記事を読むことでopenpyxlのExcel操作に関する、次のようなことが「できる・わかる」ようになりますので最後までお付き合いください。

➀. セルに条件付き書式を設定するための手順が体系的に理解できる。

➁. セルの強調表示・上位・下位の抽出といった条件書式の定義の作法がわかる。

➂. ②に関連するクラスの詳細仕様をExcel設定ウィンドウと比較しながら把握できる。

本サイトでの紹介例は一例です。また、関数などの省略可能なオプション引数などについては割愛していますので、詳細や不明点などは必要に応じて公式サイトなどを参照してください。

記事内で動作確認した開発環境とバージョン情報は次のとおりとなります。異なる環境・バージョンのライブラリを使う際はこの点、ご留意ください。

・Python 3.7.6(64bit)

・openpyxl 3.0.3

・JupyterNotebook 6.0.3

・Microsoft Office Personal 2016

それでは、次節よりセルに条件付き書式を設定する方法について解説していきます。

スポンサーリンク

1. セルに条件付き書式を設定する

本節では、前編の復習も兼ねて「条件付き書式の種類」と「書式設定のフロー(手順)」の概要を解説します。

1.1 条件付き書式の種類について

Excelで扱うことができる条件付き書式の一覧を図2に再掲します。分析機能別では「データの分布の可視化(Builtin-formats)」と「データの抽出・順位(Standard/Custom-formats)」の2つに大別されるのでした。

条件付き書式のタイプ別一覧
図2 条件付き書式の分析項目一覧(再掲)

さらに、Builtin-formatsは「データバー」「アイコンセット」「カラースケール」に分類されます。

またStandard/Custom-formatsは「セルの強調表示ツール」と「上位・下位ツール」群に分類されます。

前回は、Builtin-formatsの3種類について解説しましたので、今回は、Standard/Custom-formats書式設定の方法を紹介していきます。

1.2 書式設定の流れ

openpyxlによって条件付き書式を定義する手順は、少し複雑です。

セルの抽出条件(ルール)の定義をまとめたRuleオブジェクトを用意する必要がありますが、その生成手順は図3に示すように3通りのパターンに分類されます。適切なクラスの選択や引数指定を行う必要があります。

条件付き書式_Ruleオブジェクトの使い分けフローrev0.2
図3 条件付き書式を設定する手順

今回取り上げる、Standard/Custom-formatsに分類される条件付き書式は、パターン1またはパターン3のフローにてRuleオブジェクトを生成することになります。

関連記事>では、もう少し詳しく解説していますので参考にして下さい。

条件付き書式_Ruleオブジェクト使い分け早見表②_rev0.2
図4 Ruleオブジェクトの作成パターン一覧

それでは、次節からは具体的な各種オブジェクトの扱い方について詳しく解説していきます。

2. 条件付き書式の定義(Ruleオブジェクト)

Python_基本文法_内包表記

先述のとおり、Standard/Custom-formatsに分類される条件付き書式は、「パターン1」または「パターン3」のフローによりRuleオブジェクトを定義するのでした。

本節から具体的なオブジェクトの取得方法について解説していきます。はじめに、パターン1(Ruleクラスによる定義)について、その次にパターン3(CellIsRullクラスによる定義)という順番で解説します。

また、以降の説明では図5のように「指定の値より大きい」などに分類される条件書式を「セルの強調表示」、「上位10項目」などに分類される条件書式を「上位・下位ツール」と呼称することにします。

セルの強調表示_上位下位ツールの区分
図5「セルの強調表示」「上位・下位ツール」

2.1 Ruleクラスによる定義

Ruleクラスには、数多くの引数が存在しています。どのような条件書式を定義するのかによって使い分けが必要となります。

「指定セルの強調表示」に分類される書式のオブジェクトは、次のような引数指定で取得します。

Ruleクラス(上位・下位ツール)

from openpyxl.formatting.rule import Rule

Rule(type, rank, percent, aboveAverage, eualAverage, dxf)


各条件タイプによる引数の使い分けについては下表を参照

戻り値:Ruleオブジェクト

引数typeにて、まずはどのような種類の条件書式を定義するのか選択します。例えば、「上位10項目」を定義する場合は、文字列で’top10’のようにします。

その他の引数には、図6のマトリックスのように各条件に必要な情報を渡しますが、詳細な使い方は後述します。

Ruleクラスの引数_上位下位ツール_改訂版
図6「指定セルの強調表示」書式の引数指定使い分け

また、引数dxf には条件書式が成立したセルに適用するセルの装飾情報(Styleオブジェクト)をまとめて設定します。(Differential)Styleオブジェクトは次のようにDifferentialStyleクラスにて生成します。

個々の引数に指定するStyleオブジェクトの詳細については、関連記事<連載3回目><連載4回目>を参照してください。

DifferentialStyleクラス

from openpyxl.styles.differential import DifferentialStyle

DifferentialStyle(font, numFmt, fill, alignment, border, protection)


引数: font :Fontオブジェクト(フォント情報)を設定する

引数: numFmt :NumberFormattingオブジェクト(表示形式情報)を設定する

引数: fill :Fillオブジェクト(塗り潰し情報)を設定する

引数: alignment :Alignmentオブジェクト(配置情報)を設定する

引数: border :Borderオブジェクト(罫線情報)を設定する

引数: protection :Protectionオブジェクト(保護情報)を設定する

戻り値:DifferentialStyleオブジェクト

※すべてオプショナル引数となります


「上位・下位ツール」に分類される書式のRuleオブジェクトは、以下のような引数指定で取得します。引数typeや引数dxfの用法は、先の「指定セルの強調表示」と同様です。その他の引数指定については図7のマトリックスを参照してください。

Ruleクラス(セルの強調表示)

from openpyxl.formatting.rule import Rule

Rule(type, operator, text , formula, timePeriod, dxf)


各条件タイプによる引数の使い分けについては下表を参照

戻り値:Ruleオブジェクト

Ruleクラスの引数_セルの強調表示
図7「上位・下位ツール」書式の引数指定使い分け

以上が、個々の条件書式におけるRuleクラスの引数選択基準となります。以降からはさらに詳しく、Excelの設定ウィンドウと比較しながら解説を進めます。

2.1.1 セルの値による条件付き書式

「セルの値による条件」のRuleオブジェクトは、次の書式図のようにして定義します。引数typeには「cells」を指定します。また、条件式は、引数operatorにて等号の種類を、さらに引数formulaによって値・参照するセルアドレスなどを設定して組み立てます。

(図8は値が40と60の間に入るセルを抽出する条件式となります。)

Ruleクラス_type_cells
図8「セルの値」条件書式のRuleオブジェクトの定義

引数operatorに設定する不等号式のオプション定数一覧は表1のように文字列で指定します。

引数operatorのオプション機能
‘lessThan’次の値より小さい
‘lessThanOrEqual’ 次の値以下
‘greaterThan’次の値より大きい
‘greaterThanOrEqual’次の以上
‘between’次の値の間
‘notBetween’次の値の間以外
‘equal’    次の値に等しい
‘notEqual’次の値に等しくない
表1 引数operatorのオプション定数一覧

それでは、使用例を示します。以降のコード例では条件書式に関連する部分のみを抜粋しています。ファイルの読込み・保存などの処理は必要に応じて追加して下さい。

【例1】

「セルの値が40と60の間にある場合には、赤で塗り潰す」という条件付き書式は<List1>のようなコードを書きます。引数operatorには、“間”を表す「‘between’」を指定します。

また、引数formulaには等号の値を指定しますが、今回のように複数ある場合はリスト([要素1、要素2…])を渡します。

from openpyxl.formatting.rule import Rule
from openpyxl.styles.differential import DifferentialStyle

# (途中省略)

# セルの書式をDifferentialStyleオブジェクトとして定義
fill_red = PatternFill(start_color='EE1111', end_color='EE1111', fill_type='solid')
font = Font(bold=True, color='FFFFFF')
dxf=DifferentialStyle(font=font ,fill=fill_red)

# Ruleオブジェクトの生成
# 等号は以下は引数operatorに'between'を指定し、等号式の値は引数formulaにリスト形式で渡します。
# 〇と〇の間のように値が複数必要な場合は、必要な個数分を先頭要素から順番に並べます。

rule = Rule(type='cellIs', operator='between' ,formula=[40, 60], dxf=dxf)

# (途中省略)

【例2】

「セルの値が「“I1”セル」の値以下だった場合には、赤で塗り潰す」という条件付き書式は<List2>のようなコードになります。引数operatorには、以下を表「‘lessThanOrEqual’」を指定します。

なお、引数formulaにアドレスを渡す場合には、相対・絶対参照どちらでも問題ありません。Excel同様に「$」を付与します。

from openpyxl.formatting.rule import Rule
from openpyxl.styles.differential import DifferentialStyle

# (途中省略)

# セルの書式をDifferentialStyleオブジェクトとして定義
fill_red = PatternFill(start_color='EE1111', end_color='EE1111', fill_type='solid')
font = Font(bold=True, color='FFFFFF')
dxf=DifferentialStyle(font=font ,fill=fill_red)

# Ruleオブジェクトの生成
# 等号は以下は引数operatorに'lessThanOrEqual'を指定し、比較対象のセルアドレス
#(絶対・相対参照どちらも可)は、引数formulaにリスト形式で指定します。

rule = Rule(type='cellIs', operator='lessThanOrEqual',formula=['$I$1'], dxf=dxf)

# (途中省略)

<List1><List2>の実行結果は以下のようになります。

セルの値の条件書式のサンプルコード実行例_rev0.1
<List1>/<List2>の実行結果

2.1.2 特定の文字列による条件付き書式

「特定の文字列の条件書式」のRuleオブジェクトは、次の書式図のようにして定義します。

引数typeには抽出する文字列パターンに応じて表2オプション一覧から選択します。

あわせて、引数formulaには、文字列判定式を表2から選択し設定します。判定式の中の”string”の部分には実際の抽出対象となる文字列と差し替えます。

(図9は文字列“hoge”を含むセルを走査する書式図の例を示しています。)

Ruleクラス_type_containsText
図9「特定の文字列」条件書式のRuleオブジェクトの定義

また、引数operatorや引数textも関連する引数のようなのですが、筆者が確認した限りこの引数設定の有無は動作に直接関係はしていないようです。

本記事では公式サイトにならい指定することにします。

引数:type(operator) 引数:formulaの演算式機能
‘containsText’NOT(ISERRROR(SEARCH(“string”, A1)))次の値を含む
‘notContainsText’(ISERRROR(SEARCH(“string”, A1)))次の値を含まない
‘beginsWith’LEFT(A1,1)=”string”‘次の値で始まる
‘endsWith’‘RIGHT(A1,1)=”string”‘次の値で終わる
‘containsBlanks’NOT(ISERRROR(SEARCH(“”, A1)))空白なセル
‘notcontainsBlanks’(ISERRROR(SEARCH(“”, A1)))空白でないセル
表2 引数type/operatorのオプション定数formulaの判定式一覧

それでは、使用例を示します。(条件式に関連する部分のみを抜粋)

【例1】「文字列”abc”を含むセルがあった場合には、赤で塗り潰す」という条件付き書式を定義するには<List3>のようにします。

引数type(operator)には“文字列を含む”を意味する“containsText”を設定します。

さらに、引数formulaには、NOT(ISERRROR(SEARCH(“string”, A1)))を設定します。

”string”の部分は検索したい文字列を指定するので今回の場合は”abc”とします。引数textも同様ですす。

from openpyxl.formatting.rule import Rule
from openpyxl.styles.differential import DifferentialStyle

# (途中省略)

# セルの書式をDifferentialStyleオブジェクトとして定義
fill_red = PatternFill(start_color='EE1111', end_color='EE1111', fill_type='solid')
font = Font(bold=True, color='FFFFFF')
dxf=DifferentialStyle(font=font ,fill=fill_red)

# Ruleオブジェクトの生成
# 引数operatorとtextは必須ではなく、設定しなくても問題なし
# 重要なのが引数formulaで、検索対象の文字列とExcel関数を組合わせた形式を設定する
# formulaがセル範囲全体の条件判定に使われる。基準セルはA1セルとする必要がある
rule = Rule(type='containsText', operator='containsText', formula=['NOT(ISERROR(SEARCH("abc",A1)))'], text='abc', dxf=dxf)

# (途中省略)

【例2】「セルに文字”E”で始まる文字列がある場合には、赤で塗り潰す」という条件付き書式を定義するには<List4>のようにします。

引数type(operator)には“~で始まる”を意味する“beginssWith”を、引数formulaには、‘LEFT(A1,1)=”string”を設定します。”string”の部分は検索したい先頭文字(今回の場合は”E”)を指定します。

ちなみに、特定の文字で終わる場合の抽出には、引数formulaに、‘RIGHT(A1,1)=”string”‘を設定します。

from openpyxl.formatting.rule import Rule
from openpyxl.styles.differential import DifferentialStyle

# (途中省略)

# セルの書式をDifferentialStyleオブジェクトとして定義
fill_red = PatternFill(start_color='EE1111', end_color='EE1111', fill_type='solid')
font = Font(bold=True, color='FFFFFF')
dxf=DifferentialStyle(font=font ,fill=fill_red)

# Ruleオブジェクトの生成
# 引数typeとoperatorを'beginsWith'に設定、引数formulaは先頭文字列の判定をする形式を指定
rule = Rule(type='beginsWith', operator='beginsWith', formula=['LEFT(A1,1)="E"'], text="E", dxf=dxf)

# (途中省略)

<List3>の実行結果は以下のようになります。

文字列の値の条件書式のサンプルコード実行例_rev0.1
<List3>の実行結果

2.1.3 日付による条件付き書式

「日付の条件付き書式」のRuleオブジェクトは、次の書式図のようにして定義します。引数typeには「timePeriod」を指定します。引数timePeriodには表3のテーブルから任意の日付期間を選択します。

(図10は先月の日付データを含むセルを抽出する書式図です。)

Ruleクラス_type_timePeriod
図10「日付」条件のRuleオブジェクトの定義
引数:timePeriodのオプションの設定機能
‘yesterday’昨日
‘today’今日
‘tomorrow’ 明日
‘last7Days’過去7日間
‘thisWeek’今週
‘lastWeek’先週
‘nextWeek’来週
‘lastMonth’先月
‘thisMonth’今月
‘nextMonth’来月
表3 引数timePeriodのオプション定数

それでは、コード例を示します。(条件式に関連する部分のみを抜粋)

【例】「セルの日付が先月である場合には、赤で塗り潰す」という条件付き書式を定義するには<List5>のようにします。引数timePeriodには、先月を意味する「’lastMonth’」オプションを指定します。

from openpyxl.formatting.rule import Rule
from openpyxl.styles.differential import DifferentialStyle

# (途中省略)

# セルの書式をDifferentialStyleオブジェクトとして定義
fill_red = PatternFill(start_color='EE1111', end_color='EE1111', fill_type='solid')
font = Font(bold=True, color='FFFFFF')
dxf=DifferentialStyle(font=font ,fill=fill_red)

# Ruleオブジェクトの生成
# 引数timePeriodにて対象期間の指定をする
rule = Rule(type='timePeriod', timePeriod='lastMonth', dxf=dxf)

# (途中省略)

<List5>の実行結果は以下のようになります。

python_日付の値の条件書式のサンプルコード実行例_rev0.1
List5の実行結果

2.1.4 重複する値(しない値)による条件付き書式

「重複する(しない)値の条件付き書式」のRuleオブジェクトは、次の書式図のようにして定義します。引数typeには「duplicateValues(重複する値) / uniqueValues(重複しない値)」を設定します。

(図11は重複する値をもつセルを抽出する書式図です。)

2つ以上の重複の判定は「数値型」「文字列型」「日付型」のすべてのデータ型が対象になります。特に、引数などで対象の型を指定する必要はありません。

Ruleクラス_type_duplicateValues
図11「重複する(しない)」条件書式のRuleオブジェクトの定義
引数:type機能
’duplicateValues’重複する値
‘uniqueValues’一意の値
表4 引数typeのオプション

それでは、コード例を示します。(条件式に関連する部分のみを抜粋)

【例】「あるセル範囲に重複する値があった場合は、対象セルを赤で塗り潰す」という条件付き書式を定義するには<List6>のようにします。

その逆で、重複がないセルを対象にする場合は、Ruleクラスの引数typeに”uniqueValues”を設定します。

from openpyxl.formatting.rule import Rule
from openpyxl.styles.differential import DifferentialStyle

# (途中省略)

# セルの書式をDifferentialStyleオブジェクトとして定義
fill_red = PatternFill(start_color='EE1111', end_color='EE1111', fill_type='solid')
font = Font(bold=True, color='FFFFFF')
dxf=DifferentialStyle(font=font ,fill=fill_red)

# Ruleオブジェクトの生成
# 引数typeが'duplicateValues'で値の重複を抽出
rule = Rule(type='duplicateValues', dxf=dxf)
# 引数typeが'uniqueValues'で値の一意を抽出
#rule = Rule(type='uniqueValues', dxf=dxf)

# (途中省略)

<List6>の実行結果は以下のようになります。

文字列の値の条件書式のサンプルコード実行例_rev0.1
List6の実行結果

2.1.5 上位・下位による条件付き書式

「上位・下位の条件付き書式」のRuleオブジェクトは、次の書式図のようにして定義します。

引数typeには「top10」を設定します。デフォルトでは10位、10%と基準が「10」になっていますが、引数rankに任意の基準となる順位(%)を指定することができます。

(図12は下位35%の値を持つセルを抽出する書式図です。)

Ruleクラス_type_Top10
図12 「上位・下位」条件書式のRuleオブジェクトの定義

また、「上位から下位へ」・「順位から%へ」の切替は、引数percent引数bottomを表5のような組み合わせで設定します。

引数:percent 引数:bottom機能
False(デフォルト)True(デフォルト)上位〇
False(デフォルト)False下位〇
TrueTrue(デフォルト)上位〇%
TrueFalse下位〇%
表5 引数percent/bottomのオプション

それでは、コード例を示します。(条件式に関連する部分のみを抜粋)

【例】「セルの値が対象範囲の下位30%に含まれる場合は、赤で塗り潰す」という条件書式を定義するには<List7>のようにします。

下位なので引数bottomを「False」とし、単位が%なので引数percentを「True」に設定しています。

from openpyxl.formatting.rule import Rule
from openpyxl.styles.differential import DifferentialStyle

# (途中省略)

# セルの書式をDifferentialStyleオブジェクトとして定義
fill_red = PatternFill(start_color='EE1111', end_color='EE1111', fill_type='solid')
font = Font(bold=True, color='FFFFFF')
dxf=DifferentialStyle(font=font ,fill=fill_red)

# Ruleオブジェクトの生成
# 引数rankで順位設定、引数bottomで上位・下位の選択、引数percentで順位・%の選択
rule = Rule(type='top10', rank=30, bottom=True, percent=True, dxf=dxf)

# (途中省略)

<List7>の実行結果は以下のようになります。

重複の条件書式のサンプルコード実行例_rev0.1
List7の実行結果

2.1.5 平均より上・下による条件付き書式

「平均より上・下の条件付き書式」のRuleオブジェクトは、次の書式図のようにして定義します。

引数typeには “aboveAverage” を設定します。平均より「上・下」「以上・以下」の条件は、

引数aboveAverage引数equalAverageを表6のように組み合わせて対応します。

(図13は平均よりも小さい値をもつセルを判定する書式図です。)

Ruleクラス_type_AboveAverage
図13 「平均より上・下」条件書式のRuleオブジェクトの定義
引数: aboveAverage 引数: equalAverage 機能
True(デフォルト)True平均以上
True(デフォルト)False(デフォルト)平均より大きい
FalseTrue平均以下
FalseFalse(デフォルト)平均より小さい
表6 引数: aboveAverage/equalAverageのオプション

それでは、コード例を示します。

【例】「セルの値が平均よりも大きい場合には、そのセルを赤で塗り潰す」という条件付き書式を定義するには<List8>のようにします。

「より大きい」なのでaboveAverage/equalAverageはデフォルト値(None) としています。

from openpyxl.formatting.rule import Rule
from openpyxl.styles.differential import DifferentialStyle

# (途中省略)

# セルの書式をDifferentialStyleオブジェクトとして定義
fill_red = PatternFill(start_color='EE1111', end_color='EE1111', fill_type='solid')
font = Font(bold=True, color='FFFFFF')
dxf=DifferentialStyle(font=font ,fill=fill_red)

# Ruleオブジェクトの生成
# 引数:aboveAverageで平均以上・以下の設定、equalAverageで等号符号の有無の指定
rule = Rule(type='aboveAverage', aboveAverage=None, equalAverage=None , dxf=dxf)

# (途中省略)

<List8>の実行結果は以下のようになります。

平均以上以下の条件書式のサンプルコード実行例_rev0.1
<List8>の実行結果

2.2 CellIsRuleクラスによる定義

<2.1.1>で解説した「セルの値による条件付き書式」は、Ruleクラスによって定義(パターン1)する以外にもCellIsRuleクラスを使った方法(パターン3)もあります。

どちらを使った場合でもできることは同じですが、Ruleクラスで指定していた、DifferentialStyleオブジェクト(セルの書式(装飾)情報をまとめたもの)を用意する必要はなくなります。

つまり、直接font(フォント)/border(罫線)/fill(塗り潰し)の各引数にセルの書式オブジェクトを設定するだけで済みます。

DifferentialStyleクラスの宣言と手続きを省略でいるメリットがあります。

どちらを使うかはプログラマの好みによります。

CellIsRuleクラスの書式は以下のとおりです。

CellIsRullクラス

from openpyxl.formatting.rule import CellIsRule

CellIsRule(operator, formula, stopIfTrue, font, border, fill)


引数: operator : セルの値の判定式を以下オプション定数より指定する

(‘lessThan’, ‘lessThanOrEqual’, ‘greaterThan’, ‘greaterThanOrEqual’, ‘notBetween’, ‘notEqual’, ‘between’, ‘equal’)

引数: formula : 判定条件の値やセルの参照アドレスの指定

値やセルのアドレスの文字列を要素とするリストを設定する(指定可能な要素の数は判定式による)

引数: stopIfTrue : 条件が成立した時に処理を継続するかの指定

(False: None(停止しない) / True(停止する))

引数: font : 判定式が成立した時に、セルに適用するフォントの書式

(Fontオブジェクトを設定する)

引数: border : 判定式が成立した時に、セルに適用する罫線の書式

(Borderオブジェクトを設定する)

引数: fill : 判定式が成立した時に、セルに適用する塗り潰しの書式

(Fillオブジェクトを設定する)

戻り値:Ruleオブジェクト

Excelの書式設定ウィンドウと各引数の対応関係は図14のとおりです。引数operatorには条件式を示すオプション定数を設定します。こちらは<2.1.1>表1のものと同じです。

 CellIsRuleクラスの引数とExcelの設定ウィンドウとの比較

セルの書式_CellIsRuleクラス
図14  CellIsRuleクラスの引数とExcelの設定ウィンドウとの比較

ここで、CellIsRuleクラスを使った条件書式の活用例を<List9>に示します。

コードの概要は[A]で抽出セルに施すセルの書式オブジェクト(文字の色、背景色)を定義しています。そして、[B]の部分でCellIsRuleクラスによってRuleオブジェクト(➀「I1セル」の値以下と、➁40から60の値)を2つ定義します。

最後に[C]で各セル範囲にRuleオブジェクトを適用させています。

from openpyxl import load_workbook
from openpyxl.styles import PatternFill, Font

# CellIsRuleの書式設定に必要なクラスをインポート(クラス一つ)
from openpyxl.formatting.rule import CellIsRule

wb = load_workbook('Conditional_Formatting_num.xlsx')
ws = wb.active


# [A]-----------------------------------------------------------------------------------
# Fillオブジェクトの生成 (セルの書式…セルの塗り潰しパターンの定義)

# 赤色で塗りつぶし
fill_red = PatternFill(start_color='EE1111', end_color='EE1111', fill_type='solid')
# 青色で塗りつぶし
fill_blue =  PatternFill(start_color='1111EE', end_color='1111EE', fill_type='solid')

# Fontオブジェクトの生成 (セルの書式…セルのフォント条件の定義(太字・白色))
font = Font(bold=True, color='FFFFFF')

# [B]-----------------------------------------------------------------------------------
# CellIsRuleオブジェクトの生成

# I1セルの値(40)以下のセルを赤色で塗り潰し、文字色を白くする
rule1 = CellIsRule(operator='lessThanOrEqual', formula=['$I$1'], stopIfTrue=None, fill=fill_red, font=font)

# 40以上60以下の値をもつセルを青色で塗り潰し、文字色を白くする
rule2 = CellIsRule(operator='between', formula=['40', '60'], stopIfTrue=None, fill=fill_blue, font=font)


# [C]-----------------------------------------------------------------------------------
# セル範囲へ条件書式ルールの適用

# A1:A10の範囲にrule1を適用
ws.conditional_formatting.add('A1:A10', rule1)
# C1:F10の範囲にrule2を適用
ws.conditional_formatting.add('C1:F10', rule2)


wb.save('CF_CellIsRule_apply.xlsx')

<List9>の実行結果は次のようになりました。[B]の条件式にマッチするセルが強調表示されました。

CellIsRuleクラスのサンプルプログラムの実行結果
図15 <List9>の実行結果

3. まとめ

いかがでしたでしょうか?

Excelを操作する外部ライブラリ「openpyxl」を使用して、セルの条件付き書式を設定する方法について解説してきました。

Excelにはデータ分析や統計に関連する機能たくさん備わっていますが、openpyxlのモジュールやクラスを使うことでそれらを操作できることがおわかりになられたと思います。

今回紹介した「セルの条件付き書式」以外にも、使用頻度の高い「ソート(並び替え)」や、ある条件を満たすセルのみを行・列単位で「フィルター」するといったことも容易に対応できます。

今回の記事のポイントをまとめます。

➀. 条件付き書式を設定するには、「何を・どうする」といった条件となる部分をRuleオブジェクトとして定義する必要がある。

➁. Ruleクラスにはたくさんの引数があります。引数typeで条件タイプを決定し、その他の引数には条件タイプにあった適切な値(式)を設定します。


さて次回は、ワークシートにグラフを挿入する方法を取り上げていきます。

グラフはデータを「見える化」するためのExcelのもつ最も得意とする機能となります。もちろん、openpyxlにはグラフに関するさまざまなモジュールやクラスが提供されていますので、基礎から丁寧に解説をしていきます。

次回もお楽しみに!リンク先はこちらになります。↓

最後までお読みいただきありがとうございました。

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