V4 V5

条件付き書式は OOXML 準拠のフルセットです。XLSX と往復し、Excel で開いても同じ見た目になります (一部の拡張仕様を除く。制限 を参照)。

評価は可視セルのみに対して行われるため、104 万行のシートに範囲を設定しても 描画コストは可視範囲に比例します。

名前空間は unvell.ReoGrid.Core.ConditionalFormatting です。

データバー — 値の大きさを棒の長さで示す

3 色スケール — 最小・中央値・最大を色で補間する

アイコンセット — しきい値でアイコンを切り替える(3TrafficLights1)

値の比較(cellIs

using unvell.ReoGrid.Core;
using unvell.ReoGrid.Core.ConditionalFormatting;

ws.AddConditionalFormat(range, new CellIsRule
{
	Operator = CfOperator.GreaterThan,
	Value1 = CfValue.Num(100),
	Style = new CfStyle { BackgroundColor = 0xFFFFC7CE, Color = 0xFF9C0006 },
});

// between は Value2 も使う
ws.AddConditionalFormat(range, new CellIsRule
{
	Operator = CfOperator.Between,
	Value1 = CfValue.Num(0),
	Value2 = CfValue.Num(50),
	Style = new CfStyle { Bold = true },
});

CfOperatorEqual / NotEqual / GreaterThan / LessThan / GreaterThanOrEqual / LessThanOrEqual / Between / NotBetween の 8 種です。

オペランドは CfValue.Num(...)CfValue.Str(...) で作ります。

数式(expression

// 数式は範囲の左上セルを基準に評価される
ws.AddConditionalFormat(range, new ExpressionRule
{
	Formula = "MOD(ROW(),2)=0",
	Style = new CfStyle { BackgroundColor = 0xFFF7F7F7 },
});

数式は範囲の左上セルを基準に、各セルへ相対的にずらして評価されます。 $ による固定参照と ROW() / COLUMN() に対応しています。

文字列(containsText

ws.AddConditionalFormat(range, new ContainsTextRule
{
	Operator = CfTextOperator.Contains,
	Text = "エラー",
	Style = new CfStyle { Color = 0xFFCC0000, Bold = true },
});

CfTextOperatorContains / NotContains / BeginsWith / EndsWith です。 既定は大文字小文字を区別しません(CaseSensitive で変更できますが、OOXML には この区別を表現する方法がないため XLSX には保存されません)。

カラースケール

// 3 色スケール
ws.AddConditionalFormat(range, new ColorScaleRule
{
	Min = Cfvo.AutoMin,
	Mid = Cfvo.Percentile(50),
	Max = Cfvo.AutoMax,
	MinColor = 0xFFF8696B,
	MidColor = 0xFFFFEB84,
	MaxColor = 0xFF63BE7B,
});

MidMidColornull にすると 2 色スケールになります。

しきい値(Cfvo

生成意味
Cfvo.AutoMin / Cfvo.AutoMax範囲の最小値・最大値
Cfvo.Number(v)固定値
Cfvo.Percent(v)最小〜最大の線形パーセント
Cfvo.Percentile(v)値のパーセンタイル

データバー

ws.AddConditionalFormat(range, new DataBarRule
{
	Min = Cfvo.Number(0),
	Max = Cfvo.AutoMax,
	FillColor = 0xFF638EC6,
	NegativeFillColor = 0xFFFF555A,
	ShowValue = true,
});

範囲に正負が混在する場合、ゼロ軸が自動的に配置され、負の値は左向きに伸びます。 ShowValue = false はセルの文字を隠す「バーのみ表示」です。

アイコンセット

ws.AddConditionalFormat(range, new IconSetRule
{
	IconSet = "3TrafficLights1",
	Thresholds = [Cfvo.AutoMin, Cfvo.Percent(33), Cfvo.Percent(67)],
	ShowValue = true,
});

OOXML の標準セットに対応しています。

3Arrows 3ArrowsGray 3Flags 3TrafficLights1 3TrafficLights2 3Signs 3Symbols 3Symbols2
4Arrows 4ArrowsGray 4RedToBlack 4Rating 4TrafficLights
5Arrows 5ArrowsGray 5Rating 5Quarters
3Stars 3Triangles 5Boxes

Reverse = true でアイコンの並びを逆にします。Thresholds の要素数はアイコン数と 一致させてください(IconSets.DefaultThresholds(n) が既定値を返します)。

アイコンはセルの左側に描かれ、値はその右に表示されます。描画は WinForms / WPF / Avalonia / PDF の 4 系統すべてで共通です。

順位・平均・重複

ws.AddConditionalFormat(range, new Top10Rule
{
	Rank = 10,
	Percent = true,                 // 上位 10%
	Style = new CfStyle { Bold = true },
});

ws.AddConditionalFormat(range, new AboveAverageRule
{
	StdDev = 1,                     // 平均 + 1σ より上
	Style = new CfStyle { BackgroundColor = 0xFFE2EFDA },
});

ws.AddConditionalFormat(range, new DuplicateValuesRule
{
	Unique = false,                 // 重複値を強調
	Style = new CfStyle { Color = 0xFF9C0006 },
});
  • Top10RuleBottom = true で下位。しきい値上の同値は Excel と同じく含まれます
  • AboveAverageRuleBelowAverage で下側、StdDev で標準偏差の倍数を指定
  • DuplicateValuesRuleUnique = true で「1 回だけ現れる値」

優先順位と管理

string id = ws.AddConditionalFormat(range, new CellIsRule
{
	Operator = CfOperator.LessThan,
	Value1 = CfValue.Num(0),
	Priority = 1,
	StopIfTrue = true,
	Style = new CfStyle { Color = 0xFFCC0000 },
});

ws.RemoveConditionalFormat(id);

int count = ws.ConditionalFormats.Count;
bool any = ws.HasConditionalFormats;

Priority小さいほど優先されます(Excel と同じ)。StopIfTrue = true の ルールが一致すると、それより優先度の低いルールは評価されません。

複数のルールが一致した場合、優先度の高いものが指定したプロパティが残り、 指定していないプロパティは次のルールから埋められます。

CfStyle

条件が一致したときに重ねる差分書式です。XLSX の <dxf> に対応します。

プロパティ
BackgroundColor / Coloruint?(ARGB)
Bold / Italic / Underlinebool?

セル本体のスタイルは変更されません。条件付き書式は実効スタイルの上に重ねて描画されます。

評価結果を取得する

if (ws.TryEvaluateConditionalFormat(0, 0, out CfCellFormat fmt) && !fmt.IsEmpty)
{
	Console.WriteLine(fmt.Fill);        // 塗り(cellIs / colorScale の結果)
	Console.WriteLine(fmt.TextColor);
	Console.WriteLine(fmt.DataBar);     // データバーを描く指示(null なら無し)
	Console.WriteLine(fmt.Icon);        // アイコンセットの選択結果
}

独自の描画層を実装する場合に使います。通常のアプリケーションでは意識する必要はありません。

構造変更への追従

行や列を挿入・削除すると、ルールの適用範囲は自動的に追従します。

制限

XLSX へ書き出す際、以下は OOXML の標準仕様で表現できないため保存されません。

  • データバーの負の色・ゼロ軸・枠線(Excel の x14 拡張が必要)
  • ContainsTextRuleCaseSensitive

描画は仕様どおり行われ、reogrid-json には保存されます。

次に読む

ページの内容は役に立ちましたか?