formatting.rule【書式ルール】モジュール

メモ ( 概要 基本 行全体・列全体 注意事項 Rule【書式ルール】の設定項目 ) 関数
クラス: ColorScale【カラー スケール】 DataBar【データ バー】 FormatObject【値オブジェクト (条件付き書式)】 IconSet【アイコン セット】 Rule【書式ルール】 RuleType【値情報】 ValueDescriptor【値ディスクリプタ】

メモ

概要

基本

行全体・列全体

  • 適用先セルと同一行 または 同一列 の別セルを参照し、行全体 または 列全体 に書式適用

注意事項

  • 文字列関連等の書式ルールの数式は、仕様上は不要
    • 但し、Excel で開く場合は必要 (Google スプレッドシートで開く場合は、未指定でも可)
    • 詳細:数式
  • 単色塗りつぶしを使用時の色指定
    • 書式の PatternFill【塗りつぶし (パターン)】 で 'solid'【塗りつぶし (単色)】指定の場合、
      fgcolor・start_color【パターンの色】ではなく bgcolor・end_color【背景色】が使用される
    • 条件付き書式で使用する場合、両方に同一色を指定するのが無難

Rule【書式ルール】の設定項目

セルの値に基づいてすべてのセルを書式設定〔
ルール type【ルールの種類】 colorScale
【カラー スケール】
dataBar
【データ バー】
iconSet
【アイコン セット】
2 色スケール 'colorScale'【カラー スケール】〔
簡易生成関数:ColorScaleRule
ColorScale
( FormatObject )
3 色スケール
データ バー 'dataBar'【データ バー】〔
簡易生成関数:DataBarRule
DataBar
( FormatObject )
アイコン セット 'iconSet'【アイコン セット】〔
簡易生成関数:IconSetRule
IconSet
( FormatObject )
指定の値を含むセルだけを書式設定
ルール type【ルールの種類】 operator【条件演算子】 formula
【数式リスト】
その他 dxf【差異スタイル】
セルの値が次の値の間 'cellIs'【セルの値】〔
簡易生成関数:CellIsRule
'between'
【次の値の間】
値1
値2
下記も可
・絶対セルアドレス
名前定義
styles.
DifferentialStyle
セルの値が次の値の間以外'notBetween'
【次の値の間以外】
セルの値が次の値に等しい'equal'
【次の値に等しい】

下記も可
・絶対セルアドレス
名前定義
セルの値が次の値に等しくない'notEqual'
【次の値に等しくない】
セルの値が次の値より大きい'greaterThan'
【次の値より大きい】
セルの値が次の値より小さい'lessThan'
【次の値より小さい】
セルの値が次の値以上'greaterThanOrEqual'
【次の値以上】
セルの値が次の値以下'lessThanOrEqual'
【次の値以下】
特定の文字列を含む 'containsText'〔
【次の値を含む】
'containsText'
【次の値を含む】
数式 (含む) text
【比較文字列】
特定の文字列を含まない 'notContainsText'〔
【次の値を含まない】
'notContains'
【次の値を含まない】
数式 (含まない)
特定の文字列で始まる 'beginsWith'〔
【次の値で始まる】
'beginsWith'
【次の値で始まる】
数式 (始まる)
特定の文字列で終わる 'endsWith'〔
【次の値で終わる】
'endsWith'
【次の値で終わる】
数式 (終わる)
日付 'timePeriod'〔
【日付】
timePeriod
【日付期間】
空白 'containsBlanks'〔
【空白】
数式 (空白)
空白なし 'notContainsBlanks'〔
【空白なし】
数式 (空白なし)
エラー'containsErrors'〔
【エラー】
数式 (エラー)
エラーなし 'notContainsErrors'〔
【エラーなし】
数式 (エラーなし)
※ 数式
OOXML(Office Open XML) の仕様上は必要ないが、Excel で開くと動作しない為、下記を指定 (Google スプレッドシートは不要)
text text【比較文字列】と同じ文字列
textの文字数 上記の文字数
セルアドレス 適用先の左上セルアドレス
数式 (含む) ' NOT(ISERROR(SEARCH("text", セルアドレス))) '
数式 (含まない) ' ISERROR(SEARCH("text", セルアドレス)) '
数式 (始まる) ' LEFT(セルアドレス, textの文字数)="text" '
数式 (終わる) ' RIGHT(セルアドレス, textの文字数)="text" '
数式 (空白) ' NOT(ISERROR(SEARCH("", セルアドレス))) '
数式 (空白なし) ' ISERROR(SEARCH("", セルアドレス)) '
数式 (エラー) ' ISERROR(セルアドレス) '
数式 (エラーなし) ' NOT(ISERROR(セルアドレス)) '
上位または下位に入る値だけを書式設定
ルール type【ルールの種類】 rank
【順位】
bottom
【下位指定】
percent
【パーセント指定】
dxf【差異スタイル】
上位 (件数) 'top10'〔
【上位 / 下位】
件数省略 / False省略 / False styles.
DifferentialStyle
上位 (パーセンテージ)パーセンテージ省略 / FalseTrue
下位 (件数)件数True省略 / False
下位 (パーセンテージ)パーセンテージTrueTrue
平均より上または下の値だけを書式設定
ルール type【ルールの種類】 aboveAverage
【平均より上】
equalAverage
【平均値を含む】
stdDev
【平均値の上下に含める標準偏差の数】
dxf【差異スタイル】
平均より上 'aboveAverage'〔
【平均より上 / 下】
省略 / True省略 / False styles.
DifferentialStyle
平均より下False省略 / False
平均以上省略 / TrueTrue
平均以下FalseTrue
平均より 1 標準偏差上省略 / True1
平均より 1 標準偏差下False1
平均より 2 標準偏差上省略 / True2
平均より 2 標準偏差下False2
平均より 3 標準偏差上省略 / True3
平均より 3 標準偏差下False3
一意の値または重複する値だけを書式設定
ルール type【ルールの種類】 dxf【差異スタイル】
重複 'duplicateValues'【重複】〔styles.
DifferentialStyle
一意 'uniqueValues'【一意】〔
数式を使用して、書式設定するセルを決定
ルール type【ルールの種類】 formula【数式リスト】 dxf【差異スタイル】
数式 'expression'【数式】〔
簡易生成関数:FormulaRule
結果が true/false となる数式
適用先セルを参照する場合は、適用先の左上セルアドレスを指定
行全体・列全体 も参照
styles.
DifferentialStyle

関数

関数備考
CellIsRule(
    operator=None,
    formula=None,
    stopIfTrue=None,
    font=None,
    border=None,
    fill=None)
書式ルール生成 (セルの値)
参考:通常生成
戻り値 (Rule) 書式ルール (styles.DifferentialStyle【差異スタイル】設定)
operator (str)条件演算子
簡易指定同等の値formula【数式リスト】
'between'【次の値の間】
'notBetween'【次の値の間以外】
値1
値2
下記も可
・絶対セルアドレス
名前定義
'='
'=='
'equal'【次の値に等しい】
下記も可
・絶対セルアドレス
名前定義
'!=''notEqual'【次の値に等しくない】
'>''greaterThan'【次の値より大きい】
'<''lessThan'【次の値より小さい】
'>=''greaterThanOrEqual'【次の値以上】
'<=''lessThanOrEqual'【次の値以下】
formula (list | tuple)数式リスト (上記 operator【条件演算子】参照)
stopIfTrue (bool)[条件を満たす場合は停止] 設定有無
font (Font)フォント
border (Border)罫線
fill (GradientFill | PatternFill)塗りつぶし (注意事項 参照)

  [書式ルール]-[セルの値] ダイアログ
ColorScaleRule(
    start_type=None,
    start_value=None,
    start_color=None,
    mid_type=None,
    mid_value=None,
    mid_color=None,
    end_type=None,
    end_value=None,
    end_color=None)
書式ルール生成 (カラー スケール)
参考:通常生成
戻り値 (Rule)書式ルール (ColorScale【カラー スケール】設定)
start_type (str)値の種類 (最小値)
start_value値 (最小値)
start_color (Color)色 (最小値)
mid_type (str)値の種類 (中間値)
mid_value値 (中間値)
mid_color (Color)色 (中間値)
end_type (str)値の種類 (最大値)
end_value値 (最大値)
end_color (Color)色 (最大値)

  [書式ルール]-[3色スケール] ダイアログ
DataBarRule(
    start_type=None,
    start_value=None,
    end_type=None,
    end_value=None,
    color=None,
    showValue=None,
    minLength=None,
    maxLength=None)
書式ルール生成 (データ バー)
参考:通常生成
戻り値 (Rule)書式ルール (DataBar【データ バー】設定)
start_type値の種類 (最小値)
start_value最小値
end_type値の種類 (最大値)
end_value最大値
color (Color)バーの色
showValue (bool)値の表示有無 ( [棒のみ表示]指定の逆 )
minLength (int)バーの長さの最小値 (%) [拡張]
maxLength (int)バーの長さの最大値 (%) [拡張]

下記は未対応
・塗りつぶし:塗りつぶし (単色)
・枠線:枠線 (実線)・色
・横の方向
・[負の値と軸]

  [書式ルール]-[データ バー] ダイアログ
FormulaRule(
    formula=None,
    stopIfTrue=None,
    font=None,
    border=None,
    fill=None)
書式ルール生成 (数式)
参考:通常生成
戻り値 (Rule)書式ルール
formula (list | tuple)数式リスト
stopIfTrue (bool)[条件を満たす場合は停止] 設定有無
font (Font)フォント
border (Border)罫線
fill (GradientFill | PatternFill)塗りつぶし (注意事項 参照)

  [書式ルール]-[数式] ダイアログ
IconSetRule(
    icon_style=None,
    type=None,
    values=None,
    showValue=None,
    percent=None,
    reverse=None)
書式ルール生成 (アイコン セット)
参考:通常生成
戻り値 (Rule)書式ルール (IconSet【アイコン セット】設定)
icon_style (str)アイコン スタイル
type (str)しきい値の種類 (共通)
values (list | tuple)しきい値のリスト
showValue (bool)値表示の有無 ( [アイコンのみ表示]指定の逆 )
percent
reverse (bool)アイコンの逆順序指定 ( [アイコン順序を逆にする] )

下記は未対応
・>【しきい値を含まない指定】(通常生成 は可)
・しきい値の種類の個別指定 (通常生成 は可)
・アイコンスタイルのユーザ設定
  [書式ルール]-[アイコン セット] ダイアログ

ColorScale【カラー スケール】クラス

クラス定義

クラス備考
親:RuleType【値情報】
class ColorScale(
    cfvo=None,
    color=None)
カラー スケール
(参照:該当のRule【書式ルール】の設定項目)
cfvo (list | tuple)値オブジェクト リスト
color (list | tuple)色リスト

プロパティ

プロパティ備考
cfvo list[ FormatObject ]
tuple( FormatObject )
値オブジェクト リスト (親クラスで定義)
下記を指定
・最小値
・中間値 (2色スケールは未指定)
・最大値
colorlist[ Color ]
tuple( Color )
色リスト (N色スケール:N個)
tagnamestrタグ名 ('colorScale')

DataBar【データ バー】クラス

クラス定義

クラス備考
親:RuleType【値情報】
class DataBar(
    minLength=None,
    maxLength=None,
    showValue=None,
    cfvo=None,
    color=None)
データ バー
(参照:該当のRule【書式ルール】の設定項目)
(参考関数:DataBarRule【書式ルール生成 (データ バー)】)
minLength (int)バーの長さの最小値 (%) [拡張]
maxLength (int)バーの長さの最大値 (%) [拡張]
showValue (bool)値の表示有無 ( [棒のみ表示]指定の逆 )
cfvo (list | tuple)値オブジェクト リスト
color (Color)バーの色

下記は未対応
・塗りつぶし:塗りつぶし (単色)
・枠線:枠線 (実線)・色
・横の方向
・[負の値と軸]

プロパティ

プロパティ備考
cfvo list[ FormatObject ]
tuple( FormatObject )
値オブジェクト リスト (親クラスで定義)
下記を指定
・最小値
・最大値
colorColorバーの色
maxLengthintバーの長さの最大値 (%) [拡張:Excel では設定不可]
minLengthintバーの長さの最小値 (%) [拡張:Excel では設定不可]
showValuebool値の表示有無 ( [棒のみ表示]指定の逆 )
tagnamestrタグ名 ('dataBar')

FormatObject【値オブジェクト (条件付き書式)】クラス

クラス定義

クラス備考
親:openpyxl.descriptors.serialisable.Serialisable
class FormatObject(
    type,
    val=None,
    gte=None,
    extLst=None)
値オブジェクト (条件付き書式)
type (str)値の種類
val (str | float)
gte (bool)以上指定 (アイコン セットで有効)
extLst (ExtensionList)拡張リスト

プロパティ

プロパティ備考
extLstExtensionList拡張リスト
gtebool 以上指定 (アイコン セットで有効)
True:>=【以上】
False:>【より大きい】
(Greater Than Or Equal)
tagnamestrタグ名 ('cfvo')
typestr 値の種類
値の種類備考
'num'数値
'percent'パーセント
'max'最大値 (val【値】は不要)
'min'最小値 (val【値】は不要)
'formula'数式
'percentile'百分位
val str
float
(ValueDescriptor)

str:
    type【値の種類】が 'formula'【 数式】 または セルアドレス
float 変換:
    その他

IconSet【アイコン セット】クラス

クラス定義

クラス備考
親:RuleType【値情報】
class IconSet(
    iconSet=None,
    showValue=None,
    percent=None,
    reverse=None,
    cfvo=None)
アイコン セット
(参照:該当のRule【書式ルール】の設定項目)
iconSet (str)アイコン スタイル
showValue (bool)値表示の有無 ( [アイコンのみ表示]指定の逆 )
percent (bool)
reverse (bool)アイコンの逆順序指定 ( [アイコン順序を逆にする] )
cfvo値オブジェクト リスト

下記は未対応
・アイコンスタイルのユーザ設定

プロパティ

プロパティ備考
cfvo list[ FormatObject ]
tuple( FormatObject )
値オブジェクト リスト (親クラスで定義)
下記を指定 (アイコン個数分)
・しきい値
iconSetstr アイコン スタイル
備考
'3Arrows'アイコン セット [3Arrows] 3 つの矢印 (色分け)
'3ArrowsGray'アイコン セット [3ArrowsGray] 3 つの矢印 (灰色)
'3Flags'アイコン セット [3Flags] 3 つのフラグ
'3TrafficLights1'アイコン セット [3TrafficLights1] 3 つの信号 (枠なし)
'3TrafficLights2'アイコン セット [3TrafficLights2] 3 つの信号 (枠あり)
'3Signs'アイコン セット [3Signs] 3 つの図形
'3Symbols'アイコン セット [3Symbols] 3 つの記号 (丸囲み)
'3Symbols2'アイコン セット [3Symbols2] 3 つの記号 (丸囲みなし)
'4Arrows'アイコン セット [4Arrows] 4 つの矢印 (色分け)
'4ArrowsGray'アイコン セット [4ArrowsGray] 4 つの矢印 (灰色)
'4RedToBlack'アイコン セット [4RedToBlack] 赤と黒の丸
'4Rating'アイコン セット [4Rating] 4 つの評価
'4TrafficLights'アイコン セット [4TrafficLights] 4 つの信号
'5Arrows'アイコン セット [5Arrows] 5 つの矢印 (色分け)
'5ArrowsGray'アイコン セット [5ArrowsGray] 5 つの矢印 (灰色)
'5Rating'アイコン セット [5Rating] 5 つの評価
'5Quarters'アイコン セット [5Quarters] 白黒の丸
未対応 アイコン セット [その他1] 3 種類の星
アイコン セット [その他2] 3 種類の三角形
アイコン セット [その他3] 5 種類のボックス
percentbool
reverseboolアイコンの逆順序指定 ( [アイコン順序を逆にする] )
showValuebool値表示の有無 ( [アイコンのみ表示]指定の逆 )
tagnamestrタグ名 ('iconSet')

Rule【書式ルール】クラス

クラス定義

クラス備考
親:openpyxl.descriptors.serialisable.Serialisable
インポート:from openpyxl.formatting import Rule (省略形)
class Rule(
    type,
    dxfId=None,
    priority=0,
    stopIfTrue=None,
    aboveAverage=None,
    percent=None,
    bottom=None,
    operator=None,
    text=None,
    timePeriod=None,
    rank=None,
    stdDev=None,
    equalAverage=None,
    formula=(),
    colorScale=None,
    dataBar=None,
    iconSet=None,
    extLst=None,
    dxf=None)
書式ルール (参照:Rule【書式ルール】の設定項目)
type (str)ルールの種類
dxfId (int)差異スタイルId
priority (int)ルールの優先順位
stopIfTrue (bool)[条件を満たす場合は停止] 設定有無
aboveAverage (bool)平均より上か下かの指定
percent (bool)パーセント指定有無
bottom (bool)下位指定有無
operator (str)条件演算子
text (str)比較文字列
timePeriod (str)日付期間
rank (int)順位 件数 / パーセンテージ
stdDev (int)平均値の上下に含める標準偏差の数
equalAverage (bool)平均値を含む
formula (list | tuple)数式リスト
colorScale (ColorScale)カラー スケール
dataBar (DataBar)データ バー
iconSet (IconSet)アイコン セット
extLst (ExtensionList)拡張リスト
dxf (styles.DifferentialStyle)差異スタイル

プロパティ

プロパティ備考
aboveAveragebool平均より上か下かの指定
bottombool下位指定有無
colorScaleColorScaleカラー スケール
dataBarDataBarデータ バー
dxfstyles.DifferentialStyle差異スタイル
dxfIdint差異スタイルId
equalAveragebool平均値を含む
extLstExtensionList拡張リスト
formulalist[ str ]
tuple( str )
str に変換可能な型も可
list[ int ] 等
数式リスト (指定値は Rule【書式ルール】の設定項目数式 を参照)
iconSetIconSetアイコン セット
operatorstr 条件演算子
セルの値 関連備考
'between'次の値の間
'notBetween'次の値の間以外
'equal'次の値に等しい
'notEqual'次の値に等しくない
'greaterThan'次の値より大きい
'lessThan'次の値より小さい
'greaterThanOrEqual'次の値以上
'lessThanOrEqual'次の値以下
文字列 関連備考
'containsText'次の値を含む
'notContains'次の値を含まない
'beginsWith'次の値で始まる
'endsWith'次の値で終わる
percentboolパーセント指定有無 (選択範囲に占める割合)
priorityint (1~)ルールの優先順位 (1:最優先)
rankint順位 (件数 / パーセンテージ)
stdDevint平均値の上下に含める標準偏差の数
stopIfTruebool[条件を満たす場合は停止] 設定有無
tagnamestrタグ名 ('cfRule')
textstr比較文字列
timePeriodstr 日付期間
備考
'yesterday'昨日
'today'今日
'tomorrow'明日
'last7Days'過去 7日間
'lastWeek'先週
'thisWeek'今週
'nextWeek'来週
'lastMonth'先月
'thisMonth'今月
'nextMonth'来月
typestr ルールの種類
(設定が必要な項目は、Rule【書式ルール】の設定項目 を参照)
ルールの種類備考
セルの値に基づいてすべてのセルを書式設定
'colorScale'カラースケール
'dataBar'データ バー
'iconSet'アイコン セット
指定の値を含むセルだけを書式設定
'cellIs'セルの値
'containsText'次の値を含む
'notContainsText'次の値を含まない
'beginsWith'次の値で始まる
'endsWith'次の値で終わる
'timePeriod'日付
'containsBlanks'空白
'notContainsBlanks'空白なし
'containsErrors'エラー
'notContainsErrors'エラーなし
上位または下位に入る値だけを書式設定
'top10'上位 / 下位
平均より上または下の値だけを書式設定
'aboveAverage'平均より上 / 下
一意の値または重複する値だけを書式設定
'duplicateValues'重複
'uniqueValues'一意
数式を使用して、書式設定するセルを決定
'expression'数式

RuleType【値情報】クラス

メモ

クラス定義

クラス備考
親:openpyxl.descriptors.serialisable.Serialisable
class RuleType( )
値情報

プロパティ

プロパティ備考
cfvo list[ FormatObject ]
tuple( FormatObject )
値オブジェクト リスト

ValueDescriptor【値ディスクリプタ】クラス

メモ

クラス定義

クラス備考
親:openpyxl.descriptors.base.Float
class ValueDescriptor( )
値ディスクリプタ

操作

操作備考
設定 str:
    type【値の種類】が 'formula'【 数式】 または セルアドレス
float 変換:
    その他

書式ルールの詳細例

基本

from openpyxl import Workbook
from openpyxl.formatting import Rule
from openpyxl.styles.differential import DifferentialStyle
from openpyxl.formatting.rule import CellIsRule
from openpyxl.styles import PatternFill, fills
from openpyxl.styles import Font

# データ設定
data = [1, 10, 3, 8, 5, 6, 7, 4, 9, 2]
def set_data(row, col):
    for value in data:
        ws.cell(row, col, value)
        row += 1


# ワークブック作成
WORKBOOK = 'sample.xlsx'
wb = Workbook()
ws = wb.active
font = Font(bold=True, color='FFFFFFFF')
fill = PatternFill(fills.FILL_SOLID, 'FF0000FF', 'FF0000FF')
dxf = DifferentialStyle(
    font=font,
    fill=fill,
)

# 通常生成 (次の値以上:即値)
ws['B2'] = '次の値以上 (即値)'
ws['B3'] = '通常生成'
rule = Rule(
    type='cellIs',
    operator='greaterThanOrEqual',
    formula=[5],
    dxf=dxf,
)
ws.conditional_formatting.add('B5:B14', rule)
set_data(5, 2)

# 簡易生成 (次の値以上:即値)
ws['C3'] = '簡易生成'
rule = CellIsRule(
    operator='>=',
    formula=[5],
    font=font,
    fill=fill,
)
ws.conditional_formatting.add('C5:C14', rule)
set_data(5, 3)

# セル参照
CELL_VALUE_1 = '$D$4'
CELL_VALUE_2 = '$E$4'
NAME_VALUE_2 = 'value_2'
ws[CELL_VALUE_1] = 3
ws[CELL_VALUE_2] = 6
wb.create_named_range(NAME_VALUE_2, ws, CELL_VALUE_2)

# 通常生成 (次の値の間:絶対セルアドレス・名前定義)
ws['D2'] = '次の値の間 (セル参照)'
ws['D3'] = '通常生成'
rule = Rule(
    type='cellIs',
    operator='between',
    formula=[CELL_VALUE_1, NAME_VALUE_2],
    dxf=dxf,
)
ws.conditional_formatting.add('D5:D14', rule)
set_data(5, 4)
print(rule)
# 出力:
# <openpyxl.formatting.rule.Rule object>
# Parameters:
# (一部省略)
# type='cellIs',
# priority=3,
# operator='between',
# formula=['$D$4', 'value_2']

# 簡易生成 (次の値以上:即値)
ws['E3'] = '簡易生成'
rule = CellIsRule(
    operator='between',
    formula=[CELL_VALUE_1, NAME_VALUE_2],
    font=font,
    fill=fill,
)
ws.conditional_formatting.add('E5:E14', rule)
set_data(5, 5)
print(rule)
# 出力:
# <openpyxl.formatting.rule.Rule object>
# Parameters:
# (一部省略)
# type='cellIs',
# priority=4,
# operator='between',
# formula=['$D$4', 'value_2']

# ワークブック保存
wb.save(WORKBOOK)

rule【書式ルール】のサンプル画像


行全体・列全体

from openpyxl import Workbook
from openpyxl.formatting import Rule
from openpyxl.styles.differential import DifferentialStyle
from openpyxl.formatting.rule import FormulaRule
from openpyxl.styles import PatternFill, fills
from openpyxl.styles import Font
from openpyxl.utils import get_column_letter

# データ設定
data = [1, 10, 2, 9, 3, 8, 4, 7, 5, 6]
def set_data(row, col, vertical=True):
    for value in data:
        ws.cell(row, col, value)
        if vertical:
            row += 1
        else:
            col += 1


# ワークブック作成
WORKBOOK = 'sample.xlsx'
wb = Workbook()
ws = wb.active
font = Font(bold=True, color='FFFFFFFF')
fill = PatternFill(fills.FILL_SOLID, 'FF0000FF', 'FF0000FF')
dxf = DifferentialStyle(
    font=font,
    fill=fill,
)
for col in range(2, 12):
    ws.column_dimensions[get_column_letter(col)].width = 5

# 通常生成 (数式)
ws['B2'] = '通常生成 (数式:3の倍数)'
ws['B3'] = '行全体'
rule = Rule(
    type='expression',
    formula=['MOD($D4,3)=0'],
    dxf=dxf,
)
ws.conditional_formatting.add('B4:F13', rule)
set_data(4, 4)

# 簡易生成 (数式)
ws['B16'] = '簡易生成 (数式:3の倍数)'
ws['B17'] = '列全体'
rule = FormulaRule(
    formula=['MOD(B$20,3)=0'],
    font=font,
    fill=fill,
)
ws.conditional_formatting.add('B18:K22', rule)
set_data(20, 2, False)

# ワークブック保存
wb.save(WORKBOOK)

条件付き書式の行全体・列全体のサンプル画像