条件付き書式 例

メモ


セルの値に基づいてすべてのセルを書式設定

'colorScale'【カラー スケール】 目次
ColorScaleRule【書式ルール生成 (カラー スケール)】

from openpyxl import Workbook
from openpyxl.formatting import Rule
from openpyxl.formatting.rule import ColorScale, FormatObject
from openpyxl.formatting.rule import ColorScaleRule

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


# ワークブック作成
WORKBOOK = 'sample.xlsx'
wb = Workbook()
ws = wb.active

# 通常生成 (2 色スケール)
COLOR2_1 = 'FFFF7128'
COLOR2_2 = 'FFE1EF9C'
ws['B2'] = '2 色スケール'
ws['B3'] = '通常生成'
colorscale = ColorScale(
    cfvo=[
        FormatObject('min'),
        FormatObject('max'),
    ],
    color=[COLOR2_1, COLOR2_2],
)
rule = Rule(
    type="colorScale",
    colorScale=colorscale,
)
ws.conditional_formatting.add('B4:B13', rule)
set_data(4, 2)

# 簡易生成 (2 色スケール)
ws['C3'] = '簡易生成'
rule = ColorScaleRule(
    start_type='min',
    start_color=COLOR2_1,
    end_type='max',
    end_color=COLOR2_2
)
ws.conditional_formatting.add('C4:C13', rule)
set_data(4, 3)

# 通常生成 (3 色スケール)
COLOR3_1 = 'FFF8696B'
COLOR3_2 = 'FFFFEB84'
COLOR3_3 = 'FF63BE7B'
ws['D2'] = '3 色スケール'
ws['D3'] = '通常生成'
colorscale = ColorScale(
    cfvo=(
        FormatObject('min'),
        FormatObject('percentile', 50),
        FormatObject('max'),
    ),
    color=(COLOR3_1, COLOR3_2, COLOR3_3),
)
rule = Rule(
    type="colorScale",
    colorScale=colorscale,
)
ws.conditional_formatting.add('D4:D13', rule)
set_data(4, 4)

# 簡易生成 (3 色スケール)
ws['E3'] = '簡易生成'
rule = ColorScaleRule(
    'min', None, COLOR3_1,
    'percentile', 50, COLOR3_2,
    'max', None, COLOR3_3,
)
ws.conditional_formatting.add('E4:E13', rule)
set_data(4, 5)

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

条件付き書式【カラー スケール】のサンプル画像


'dataBar'【データ バー】 目次
DataBarRule【書式ルール生成 (データ バー)】

from openpyxl import Workbook
from openpyxl.formatting import Rule
from openpyxl.formatting.rule import DataBar, FormatObject
from openpyxl.formatting.rule import DataBarRule

# データ設定
data = [0, 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
ws.column_dimensions['B'].width = 20
ws.column_dimensions['C'].width = 20

# 通常
ws['B2'] = '通常生成'
data_bar = DataBar(
    cfvo=[
        FormatObject('min'),
        FormatObject('max'),
    ],
    color='FF0000FF',
)
rule = Rule(
    type='dataBar',
    dataBar=data_bar,
)
ws.conditional_formatting.add('B4:B14', rule)
set_data(4, 2)

# 通常
ws['C3'] = 'minLength / maxLength'
data_bar = DataBar(
    cfvo=[
        FormatObject('min'),
        FormatObject('max'),
    ],
    color='FF0000FF',
    minLength=30,
    maxLength=70,
)
rule = Rule(
    type='dataBar',
    dataBar=data_bar,
)
ws.conditional_formatting.add('C4:C14', rule)
set_data(4, 3)


# 簡易生成
ws['B17'] = '簡易生成'
rule = DataBarRule(
    start_type='min',
    end_type='max',
    color='FF0000FF',
)
ws.conditional_formatting.add('B19:B29', rule)
set_data(19, 2)

# 簡易生成
ws['C18'] = 'minLength / maxLength'
rule = DataBarRule(
    start_type='min',
    end_type='max',
    color='FF0000FF',
    minLength=30,
    maxLength=70,
)
ws.conditional_formatting.add('C19:C29', rule)
set_data(19, 3)

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

条件付き書式【データ バー】のサンプル画像


'iconSet'【アイコン セット】 目次
IconSetRule【書式ルール生成 (アイコン セット)】

from openpyxl import Workbook
from openpyxl.formatting import Rule
from openpyxl.formatting.rule import IconSet, FormatObject
from openpyxl.formatting.rule import IconSetRule

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

# ワークブック作成
WORKBOOK = 'sample.xlsx'
wb = Workbook()
ws = wb.active
ws.column_dimensions['B'].width = 15
ws.column_dimensions['C'].width = 15
ws.column_dimensions['D'].width = 15

# 通常生成 (3アイコン)
ws['B2'] ='通常生成'
ICON_SET_3_1 = '3TrafficLights1'
ws['B3'] = '3アイコン'
ws['B4'] = ICON_SET_3_1
sep_1 = FormatObject(type='percent', val=0)
sep_2 = FormatObject(type='percent', val=33)
sep_3 = FormatObject(type='percent', val=67)
iconset = IconSet(
    iconSet=ICON_SET_3_1,
    cfvo=[sep_1, sep_2, sep_3],
)
rule = Rule(
    type='iconSet',
    iconSet=iconset,
)
ws.conditional_formatting.add('B5:B14', rule)
set_data(5, 2)

# 通常生成 (4アイコン・値なし)
ICON_SET_4_1 = '4Rating'
ws['C3'] = '4アイコン・値なし'
ws['C4'] = ICON_SET_4_1
sep_1 = FormatObject(type='percent', val=0)
sep_2 = FormatObject(type='percent', val=25)
sep_3 = FormatObject(type='percent', val=50)
sep_4 = FormatObject(type='percent', val=75)
iconset = IconSet(
    iconSet=ICON_SET_4_1,
    showValue=False,
    cfvo=[sep_1, sep_2, sep_3, sep_4],
)
rule = Rule(
    type='iconSet',
    iconSet=iconset,
)
ws.conditional_formatting.add('C5:C14', rule)
set_data(5, 3)

# 通常生成 (5アイコン・逆順)
ICON_SET_5_1 = '5Arrows'
ws['D3'] = '5アイコン・逆順'
ws['D4'] = ICON_SET_5_1
sep_1 = FormatObject(type='percent', val=0)
sep_2 = FormatObject(type='percent', val=20)
sep_3 = FormatObject(type='percent', val=40)
sep_4 = FormatObject(type='percent', val=60)
sep_5 = FormatObject(type='percent', val=80)
iconset = IconSet(
    iconSet=ICON_SET_5_1,
    reverse=True,
    cfvo=[sep_1, sep_2, sep_3, sep_4, sep_5],
)
rule = Rule(
    type='iconSet',
    iconSet=iconset,
)
ws.conditional_formatting.add('D5:D14', rule)
set_data(5, 4)

# 簡易生成 (3アイコン)
ws['B16'] ='簡易生成'
ICON_SET_3_2 = '3Symbols'
ws['B17'] = '3アイコン'
ws['B18'] = ICON_SET_3_2
rule = IconSetRule(
    icon_style=ICON_SET_3_2,
    type='percent',
    values=[0, 33, 67],
)
ws.conditional_formatting.add('B19:B28', rule)
set_data(19, 2)

# 簡易生成 (4アイコン・値なし)
ICON_SET_4_2 = '4Arrows'
ws['C17'] = '4アイコン・値なし'
ws['C18'] = ICON_SET_4_2
rule = IconSetRule(
    icon_style=ICON_SET_4_2,
    type='percent',
    showValue=False,
    values=[0, 25, 50, 75],
)
ws.conditional_formatting.add('C19:C28', rule)
set_data(19, 3)

# 簡易生成 (5アイコン・逆順)
ICON_SET_5_2 = '5ArrowsGray'
ws['D17'] = '5アイコン・逆順'
ws['D18'] = ICON_SET_5_2
rule = IconSetRule(
    icon_style=ICON_SET_5_2,
    type='percent',
    reverse=True,
    values=[0, 20, 40, 60, 80],
)
ws.conditional_formatting.add('D19:D28', rule)
set_data(19, 4)

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

条件付き書式【アイコン セット】のサンプル画像


指定の値を含むセルだけを書式設定

'cellIs'【セルの値】 目次
CellIsRule【書式ルール生成 (セルの値)】

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

# データ設定
data = [1, 2, 3, 4, 5, 6, 7, 8]
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.column_dimensions['B'].width = 15
ws.column_dimensions['C'].width = 15
ws.column_dimensions['D'].width = 15
ws.column_dimensions['E'].width = 15

# 次の値の間
ws['B2'] = '次の値の間'
ws['B3'] = '通常生成'
ws['B4'] = 'between'
rule = Rule(
    type='cellIs',
    operator='between',
    formula=[3, 6],
    dxf=dxf,
)
ws.conditional_formatting.add('B5:B11', rule)
set_data(5, 2)

# 次の値の間以外
ws['C2'] = '次の値の間以外'
ws['C3'] = '簡易生成'
ws['C4'] = 'notBetween'
rule = CellIsRule(
    operator='notBetween',
    formula=[3, 6],
    font=font,
    fill=fill,
)
ws.conditional_formatting.add('C5:C12', rule)
set_data(5, 3)

# 次の値に等しい
ws['D2'] = '次の値に等しい'
ws['D3'] = '通常生成'
ws['D4'] = 'equal'
rule = Rule(
    type='cellIs',
    operator='equal',
    formula=[5],
    dxf=dxf,
)
ws.conditional_formatting.add('D5:D12', rule)
set_data(5, 4)

# 次の値に等しくない
ws['E2'] = '次の値に等しくない'
ws['E3'] = '簡易生成'
ws['E4'] = '!='
rule = CellIsRule(
    operator='!=',
    formula=[5],
    font=font,
    fill=fill,
)
ws.conditional_formatting.add('E5:E12', rule)
set_data(5, 5)

# 次の値より大きい
ws['B15'] = '次の値より大きい'
ws['B16'] = '通常生成'
ws['B17'] = 'greaterThan'
rule = Rule(
    type='cellIs',
    operator='greaterThan',
    formula=[5],
    dxf=dxf,
)
ws.conditional_formatting.add('B18:B25', rule)
set_data(18, 2)

# 次の値より小さい
ws['C15'] = '次の値より小さい'
ws['C16'] = '簡易生成'
ws['C17'] = '<'
rule = CellIsRule(
    operator='<',
    formula=[5],
    font=font,
    fill=fill,
)
ws.conditional_formatting.add('C18:C25', rule)
set_data(18, 3)

# 次の値以上
ws['D15'] = '次の値以上'
ws['D16'] = '通常生成'
ws['D17'] = 'greaterThanOrEqual'
rule = Rule(
    type='cellIs',
    operator='greaterThanOrEqual',
    formula=[5],
    dxf=dxf,
)
ws.conditional_formatting.add('D18:D25', rule)
set_data(18, 4)

# 次の値以下
ws['E15'] = '次の値以下'
ws['E16'] = '簡易生成'
ws['E17'] = '<='
rule = CellIsRule(
    operator='<=',
    formula=[5],
    font=font,
    fill=fill,
)
ws.conditional_formatting.add('E18:E25', rule)
set_data(18, 5)

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

条件付き書式【セルの値】のサンプル画像


'containsText'【次の値を含む】 目次
'notContainsText'【次の値を含まない】
'beginsWith'【次の値で始まる】
'endsWith'【次の値で終わる】
'containsBlanks'【空白】
'notContainsBlanks'【空白なし】
'containsErrors'【エラー】
'notContainsErrors'【エラーなし】

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

# データ設定
def set_data(row, col, data):
    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,
)
for col in range(2, 11):
    ws.column_dimensions[get_column_letter(col)].width = 20
data_text = [
    'ABC', 'DEF', 'GHI',
    'ABC and DEF', 'ABC or DEF',
    'ABC and GHI', 'ABC or GHI',
    'DEF and GHI', 'DEF or GHI',
]
data_blank = [
    'ABC', 'DEF', 'ABC DEF',
    '',
    'GHI', 'JKL', 'GHI JKL',
    '',
    'MNO', 'PQR', 'MNO PQR',
]
data_error = [
    123, 'abc',
    '=123/0', '=UNKNOWN',
]

# 特定の文字列を含む
text = 'and'
ws['B2'] = '特定の文字列を含む'
ws['B3'] = text
rule = Rule(
    type='containsText',
    operator='containsText',
    text=text,
    dxf=dxf,
    formula=[f'NOT(ISERROR(SEARCH("{text}", B5)))'],
)
print(rule.formula)
# 出力:['NOT(ISERROR(SEARCH("and", B5)))']
ws.conditional_formatting.add('B5:B13', rule)
set_data(5, 2, data_text)

# 特定の文字列を含まない
text = 'and'
ws['C2'] = '特定の文字列を含まない'
ws['C3'] = text
rule = Rule(
    type='notContainsText',
    operator='notContains',
    text=text,
    dxf=dxf,
    formula=[f'ISERROR(SEARCH("{text}", C5))'],
)
print(rule.formula)
# 出力:['ISERROR(SEARCH("and", C5))']
ws.conditional_formatting.add('C5:C13', rule)
set_data(5, 3, data_text)

# 特定の文字列で始まる
text = 'ABC'
ws['D2'] = '特定の文字列で始まる'
ws['D3'] = text
rule = Rule(
    type='beginsWith',
    operator='beginsWith',
    text=text,
    dxf=dxf,
    formula=[f'LEFT(D5, {len(text)})="{text}"'],
)
print(rule.formula)
# 出力:['LEFT(D5, 3)="ABC"']
ws.conditional_formatting.add('D5:D13', rule)
set_data(5, 4, data_text)

# 特定の文字列で終わる
text = 'DEF'
ws['E2'] = '特定の文字列で終わる'
ws['E3'] = text
rule = Rule(
    type='endsWith',
    operator='endsWith',
    text=text,
    dxf=dxf,
    formula=[f'RIGHT(E5, {len(text)})="{text}"'],
)
print(rule.formula)
# 出力:['RIGHT(E5, 3)="DEF"']
ws.conditional_formatting.add('E5:E13', rule)
set_data(5, 5, data_text)

# 空白 (空)
ws['B16'] = '空白 (空)'
rule = Rule(
    type='containsBlanks',
    dxf=dxf,
    formula=['ISERROR(SEARCH("", B18))'],
)
ws.conditional_formatting.add('B18:B28', rule)
set_data(18, 2, data_blank)

# 空白なし (空以外)
ws['C16'] = '空白なし (空以外)'
rule = Rule(
    type='notContainsBlanks',
    dxf=dxf,
    formula=['NOT(ISERROR(SEARCH("", C18)))'],
)
ws.conditional_formatting.add('C18:C28', rule)
set_data(18, 3, data_blank)

# エラー
ws['D16'] = 'エラー'
rule = Rule(
    type='containsErrors',
    dxf=dxf,
    formula=['ISERROR(D18)'],
)
ws.conditional_formatting.add('D18:D21', rule)
set_data(18, 4, data_error)

# エラーなし
ws['E16'] = 'エラーなし'
rule = Rule(
    type='notContainsErrors',
    dxf=dxf,
    formula=['NOT(ISERROR(E18))'],
)
ws.conditional_formatting.add('E18:E21', rule)
set_data(18, 5, data_error)

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

条件付き書式【次の値を含む 等】のサンプル画像


'timePeriod'【日付】 目次

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

# データ設定
data = [
    '=TODAY()-8', '=TODAY()-7', '=TODAY()-6', '=TODAY()-5',
    '=TODAY()-4', '=TODAY()-3', '=TODAY()-2', '=TODAY()-1',
    '=TODAY()',
    '=TODAY()+1', '=TODAY()+2', '=TODAY()+3', '=TODAY()+4',
]
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_red = PatternFill(fills.FILL_SOLID, 'FFFF0000', 'FFFF0000')
fill_green = PatternFill(fills.FILL_SOLID, 'FF00FF00', 'FF00FF00')
fill_blue = PatternFill(fills.FILL_SOLID, 'FF0000FF', 'FF0000FF')
dxf_red = DifferentialStyle(
    font=font,
    fill=fill_red,
)
dxf_green = DifferentialStyle(
    font=font,
    fill=fill_green,
)
dxf_blue = DifferentialStyle(
    font=font,
    fill=fill_blue,
)

# 日付
ws.column_dimensions['B'].width = 15
ws['B2'] = '日付'
ws['B3'] = '【数式の表示】'
CELL_RANGE = 'B5:B17'

# 今日
rule_today = Rule(
    type='timePeriod',
    timePeriod='today',
    dxf=dxf_red,
)
ws.conditional_formatting.add(CELL_RANGE, rule_today)

# 昨日
rule_yesterday = Rule(
    type='timePeriod',
    timePeriod='yesterday',
    dxf=dxf_green,
)
ws.conditional_formatting.add(CELL_RANGE, rule_yesterday)

# 明日
rule_tomorrow = Rule(
    type='timePeriod',
    timePeriod='tomorrow',
    dxf=dxf_green,
)
ws.conditional_formatting.add(CELL_RANGE, rule_tomorrow)

# 過去 7日間
rule_last7Days = Rule(
    type='timePeriod',
    timePeriod='last7Days',
    dxf=dxf_blue,
)
ws.conditional_formatting.add(CELL_RANGE, rule_last7Days)

# データ設定
for row in ws[CELL_RANGE]:
    for cell in row:
        cell.number_format = 'yyyy/mm/dd'
set_data(5, 2)

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

条件付き書式【日付】のサンプル画像


上位または下位に入る値だけを書式設定

'top10'【上位 / 下位】 目次

from openpyxl import Workbook
from openpyxl.formatting import Rule
from openpyxl.styles.differential import DifferentialStyle
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

# 初期設定
fill = PatternFill(fills.FILL_SOLID, 'FF0000FF', 'FF0000FF')
font = Font(bold=True, color='FFFFFFFF')
dxf = DifferentialStyle(
    font=font,
    fill=fill,
)
ws['B2'] = '上位 / 下位 ルール'
ws.column_dimensions['B'].width = 15
ws.column_dimensions['C'].width = 15
ws.column_dimensions['D'].width = 15
ws.column_dimensions['E'].width = 15

# 上位/下位ルール (上位件数)
rank = 1
ws['B3'] = f'上位 ({rank} 件)'
rule = Rule(
    type='top10',
    rank=rank,
    dxf=dxf,
)
ws.conditional_formatting.add('B4:B13', rule)
set_data(4, 2)

# 上位/下位ルール (上位 パーセンテージ)
percentage = 20
ws['C3'] = f'上位 ({percentage} %)'
rule = Rule(
    type='top10',
    rank=percentage,
    percent=True,
    dxf=dxf,
)
ws.conditional_formatting.add('C4:C13', rule)
set_data(4, 3)

# 上位/下位ルール (下位 件数)
rank = 3
ws['D3'] = f'下位 ({rank} 件)'
rule = Rule(
    type='top10',
    rank=rank,
    bottom=True,
    dxf=dxf,
)
ws.conditional_formatting.add('D4:D13', rule)
set_data(4, 4)

# 上位/下位ルール (下位 パーセンテージ)
percentage = 40
ws['E3'] = f'下位 ({percentage} %)'
rule = Rule(
    type='top10',
    rank=percentage,
    percent=True,
    bottom=True,
    dxf=dxf,
)
ws.conditional_formatting.add('E4:E13', rule)
set_data(4, 5)

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

条件付き書式【上位 / 下位】のサンプル画像


平均より上または下の値だけを書式設定

'aboveAverage'【平均より上 / 下】 目次

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

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


# データ設定2
data_2 = [
    [1, 2, 3, 4, 5, 6, 7, 8, 9, 20],
    [0, 2, 3, 4, 5, 6, 7, 8, 0, 20],
    [0, 0, 3, 4, 5, 6, 7, 0, 0, -10],
    [0, 0, 0, 4, 5, 6, 0, 0, 0, -10],
    [0, 0, 0, 0, 5, 0, 0, 0, 0],
]
def set_data_2(row, min, max):
    for data in data_2:
        col = 7
        for value in data:
            if min <= value <= max:
                ws.cell(row, col, value)
            col += 1
        row += 1


# ワークブック作成
WORKBOOK = 'sample.xlsx'
wb = Workbook()
ws = wb.active

# 初期設定
fill = PatternFill(fills.FILL_SOLID, 'FF0000FF', 'FF0000FF')
font = Font(bold=True, color='FFFFFFFF')
dxf = DifferentialStyle(
    font=font,
    fill=fill,
)
average = sum(data_1) / len(data_1)
ws['B2'] = f'平均より上 / 下 ルール (平均:{average})'
ws.column_dimensions['A'].width = 2
ws.column_dimensions['B'].width = 10
ws.column_dimensions['C'].width = 10
ws.column_dimensions['D'].width = 10
ws.column_dimensions['E'].width = 10

# 平均より上
ws['B4'] = '平均より上'
rule = Rule(
    type='aboveAverage',
    dxf=dxf,
)
ws.conditional_formatting.add('B4:B12', rule)
set_data_1(5, 2)

# 平均より下
ws['C4'] = '平均より下'
rule = Rule(
    type='aboveAverage',
    aboveAverage=False,
    dxf=dxf,
)
ws.conditional_formatting.add('C4:C12', rule)
set_data_1(5, 3)

# 平均以上
ws['D4'] = '平均以上'
rule = Rule(
    type='aboveAverage',
    equalAverage=True,
    dxf=dxf,
)
ws.conditional_formatting.add('D4:D12', rule)
set_data_1(5, 4)

# 平均以下
ws['E4'] = '平均以下'
rule = Rule(
    type='aboveAverage',
    aboveAverage=False,
    equalAverage=True,
    dxf=dxf,
)
ws.conditional_formatting.add('E4:E12', rule)
set_data_1(5, 5)

# 標準偏差
ws['G2'] = '標準偏差'
for col in range(7, 16):
    ws.column_dimensions[get_column_letter(col)].width = 3
ws.column_dimensions['P'].width = 5

# 平均値より 1 標準偏差上
ws['G4'] = '平均値より 1 標準偏差上'
rule = Rule(
    type='aboveAverage',
    stdDev=1,
    dxf=dxf,
)
ws.conditional_formatting.add('G5:P9', rule)
row = 5
set_data_2(row, 1, 9)

# 平均値より 1 標準偏差下
ws['G11'] = '平均値より 1 標準偏差下'
rule = Rule(
    type='aboveAverage',
    aboveAverage=False,
    stdDev=1,
    dxf=dxf,
)
ws.conditional_formatting.add('G12:P16', rule)
row += 7
set_data_2(row, 1, 9)

# 平均値より 2 標準偏差上
ws['G18'] = '平均値より 2 標準偏差上'
rule = Rule(
    type='aboveAverage',
    stdDev=2,
    dxf=dxf,
)
ws.conditional_formatting.add('G19:P23', rule)
row += 7
set_data_2(row, 1, 9)

# 平均値より 2 標準偏差下
ws['G25'] = '平均値より 2 標準偏差下'
rule = Rule(
    type='aboveAverage',
    aboveAverage=False,
    stdDev=2,
    dxf=dxf,
)
ws.conditional_formatting.add('G26:P30', rule)
row += 7
set_data_2(row, 1, 9)

# 平均値より 3 標準偏差上
ws['G32'] = '平均値より 3 標準偏差上'
rule = Rule(
    type='aboveAverage',
    stdDev=3,
    dxf=dxf,
)
ws.conditional_formatting.add('G33:P37', rule)
row += 7
set_data_2(row, 1, 99)

# 平均値より 3 標準偏差下
ws['G39'] = '平均値より 3 標準偏差下'
rule = Rule(
    type='aboveAverage',
    aboveAverage=False,
    stdDev=3,
    dxf=dxf,
)
ws.conditional_formatting.add('G40:P44', rule)
row += 7
set_data_2(row, -99, 9)

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

条件付き書式【平均より上 / 下】のサンプル画像


一意の値または重複する値だけを書式設定

'duplicateValues'【重複】 目次
'uniqueValues'【一意】

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

# データ設定
data = [1, 2, 3, 4, 5, 6, 2, 4, 6, '重複の値', '一意の値', '重複の値']
def set_data(row, col):
    for value in data:
        ws.cell(row, col, value)
        row += 1


# ワークブック作成
WORKBOOK = 'sample.xlsx'
wb = Workbook()
ws = wb.active

# 初期設定
fill = PatternFill(fills.FILL_SOLID, 'FF0000FF', 'FF0000FF')
font = Font(bold=True, color='FFFFFFFF')
dxf = DifferentialStyle(
    font=font,
    fill=fill,
)
ws['B2'] = '一意 / 重複'
ws.column_dimensions['B'].width = 10
ws.column_dimensions['C'].width = 10

# 重複
ws['B3'] = '重複'
rule = Rule(
    type='duplicateValues',
    dxf=dxf,
)
ws.conditional_formatting.add('B5:B16', rule)
set_data(5, 2)

# 一意
ws['C3'] = '一意'
rule = Rule(
    type='uniqueValues',
    dxf=dxf,
)
ws.conditional_formatting.add('C5:C16', rule)
set_data(5, 3)

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

条件付き書式【一意 / 重複】のサンプル画像


数式を使用して、書式設定するセルを決定

'expression'【数式】 目次
FormulaRule【書式ルール生成 (数式)】

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

# データ設定
data = [1, 12, 3, 10, 5, 8, 7, 6, 9, 4, 11, 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

# 初期設定
fill = PatternFill(fills.FILL_SOLID, 'FF0000FF', 'FF0000FF')
font = Font(bold=True, color='FFFFFFFF')
dxf = DifferentialStyle(
    font=font,
    fill=fill,
)
ws['B2'] = '数式'

# 通常生成
ws['B3'] = '通常生成'
ws['B4'] = '奇数行'
rule = Rule(
    type='expression',
    formula=['MOD(ROW(),2)=1'],
    dxf=dxf,
)
ws.conditional_formatting.add('B5:B16', rule)
set_data(5, 2)
ws['C4'] = '3の倍数'
rule = Rule(
    type='expression',
    formula=['MOD(C5,3)=0'],
    dxf=dxf,
)
ws.conditional_formatting.add('C5:C16', rule)
set_data(5, 3)

# 簡易生成
ws['D3'] = '簡易生成'
ws['D4'] = '偶数行'
rule = FormulaRule(
    formula=['MOD(ROW(),2)=0'],
    font=font,
    fill=fill,
)
ws.conditional_formatting.add('D5:D16', rule)
set_data(5, 4)
ws['E4'] = '4の倍数'
rule = FormulaRule(
    formula=['MOD(E5,4)=0'],
    font=font,
    fill=fill,
)
ws.conditional_formatting.add('E5:E16', rule)
set_data(5, 5)

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

条件付き書式【数式】のサンプル画像