StyleRecord はセルの書式を表す不変のレコードです。V4 の
WorksheetRangeStyle + PlainStyleFlag を置き換えます。
名前空間は unvell.ReoGrid.Core.Style です。

基本
using unvell.ReoGrid.Core;
using unvell.ReoGrid.Core.Style;
ws.SetCellStyle(0, 0, new StyleRecord
{
FontFamily = "Meiryo UI",
FontSize = 12f,
Bold = true,
Color = 0xFF333333, // ARGB の文字色
BackgroundColor = 0xFFEFEFEF, // ARGB の背景色
TextAlign = HAlign.Center,
VerticalAlign = VAlign.Middle,
});
プロパティ
すべて nullable です。null は「指定しない=上位から継承する」を意味します。
| プロパティ | 型 | 内容 |
|---|---|---|
FontFamily | string? | フォント名 |
FontSize | float? | フォントサイズ(ポイント) |
Bold / Italic / Underline / Strikethrough | bool? | 文字装飾 |
Color | uint? | 文字色(ARGB) |
BackgroundColor | uint? | 背景色(ARGB) |
TextAlign | HAlign? | General / Left / Center / Right |
VerticalAlign | VAlign? | Bottom / Middle / Top |
TextWrapMode | TextWrap? | None / Wrap / BreakWord |
Indent | ushort? | インデント段数 |
RotationAngle | float? | 文字の回転角(度、-90〜90)。TextRotation.Stacked(255)で縦書き |
TextAlign の General は Excel と同じく「数値は右、文字列は左」です。
色は uint の ARGB
System.Drawing.Color ではありません。コアと I/O を System.Drawing から独立させ、
PDF 出力や Linux 上のヘッドレス実行を可能にするためです。
0xFFEFEFEF
^^ アルファ(FF = 不透明)
^^^^^^ RGB
WinForms 層で Color に変換したい場合は Color.FromArgb(unchecked((int)argb)) を使います。
差分を適用する
// StyleRecord は不変。差分は with 式で作る
var current = ws.GetCellStyle(0, 0) ?? StyleRecord.Default;
ws.SetCellStyle(0, 0, current with { Bold = true });
GetCellStyle はそのセルに直接設定された指定だけを返します(継承分は含みません)。
未設定なら null です。継承を解決した結果が欲しい場合は GetEffectiveStyle を使います。
null と false の違い
// null = 「指定しない」= 上位から継承する。false とは意味が違う
var s = new StyleRecord { Bold = true, Italic = null };
var cleared = s with { Bold = null }; // 太字の指定そのものを取り消す
var explicitOff = s with { Bold = false }; // 上位が太字でも太字にしない
V4 の PlainStyleFlag は「どのフィールドが有効か」を別に管理していました。V5 は
nullable であること自体がその役割を担うため、フラグの同期ずれが起こりません。
テキストの折り返しと配置
ws.SetCellStyle(0, 0, new StyleRecord { TextWrapMode = TextWrap.Wrap });
ws.SetCellStyle(1, 0, new StyleRecord { TextWrapMode = TextWrap.BreakWord });
ws.SetCellStyle(2, 0, new StyleRecord { Indent = 2 });
ws.SetCellStyle(3, 0, new StyleRecord { RotationAngle = 45f });
Wrap は単語単位、BreakWord は文字単位で折り返します。折り返しを指定しないセルの
テキストは、隣が空ならはみ出して表示されます(Excel と同じ挙動)。改行文字(\n)は
折り返しの指定に関わらず必ず改行されます。
行分割はコアが行うため、WinForms / WPF / Avalonia / PDF のどの面でも同じ位置で折り返ります。
日本語のように空白を持たない文字列は文字間で折り返り、行頭に 。」)、行末に 「( が
来ないよう禁則処理が適用されます。
テキストの回転と縦書き
// 反時計回りの度数。45 は右上がり、-45 は右下がり
ws.SetCellStyle(0, 0, new StyleRecord { RotationAngle = 45f });
ws.SetCellStyle(0, 1, new StyleRecord { RotationAngle = -90f });
// 縦書き(1 文字 1 行、正立したまま上から下)。角度ではなく Excel のマーカー
ws.SetCellStyle(0, 2, new StyleRecord { RotationAngle = TextRotation.Stacked });
// 回転を解除する
ws.SetCellStyle(0, 3, new StyleRecord { RotationAngle = 0f });
// 判定用のヘルパ
var st = ws.GetEffectiveStyle(0, 2);
bool rotated = TextRotation.IsRotated(st.RotationAngle); // 縦書きも true
bool stacked = TextRotation.IsStacked(st.RotationAngle ?? 0f); // 縦書きだけ true
// -90..90 へ丸める。Stacked(255) はそのまま通る
float safe = TextRotation.Normalize(120f); // → 90
_ = (rotated, stacked, safe);
RotationAngle は反時計回りの度数で、有効な範囲は -90〜90 です
(Excel の配置ダイアログで見える値と同じ)。範囲外の値は TextRotation.Normalize で丸められます。
縦書きは角度ではない
TextRotation.Stacked(255)だけは角度ではなく、Excel の縦書きを表すマーカーです。
文字を寝かせず正立させたまま、1 文字 1 行で上から下へ積みます。
この 255 は OOXML 自身の値(<alignment textRotation="255"/>)なので、そのまま持っておくと
縦書きのセルが xlsx を素通りで往復します。1 つのファイル形式しか設定しないプロパティを
別に生やす必要がありません。
積む単位は char ではなくルーンです。絵文字や稀用漢字のようなサロゲートペアが 半分に割れて 2 行にならないようにするためです。
描画のしかた
回転テキストは、自分のフレームで水平にレイアウトしてからブロックごと中心で回します。 そのため行分割・計測・ベースラインは、回転していないテキストと同じ共有パスを通ります (WinForms / WPF / Avalonia / PDF の 4 面が同じ結果になります)。
- 回転後のバウンディングボックスをセルの配置(左右・上下)で置き、セルにクリップします。 回転したテキストが隣のセルへはみ出すことはありません。
- 折り返しの幅は回転方向に沿った長さで測ります(0° はセル幅、90° はセル高さ、その間は補間)。
- 縦書きのときは水平配置が中央固定になります。
- 行高・列幅の AutoFit も回転後の寸法で測るので、描かれるとおりのサイズになります。
リッチテキストのセルは回転しません(水平に描画されます)。
I/O と UI
- reogrid-json:
rotationAngle(V5 の拡張)。0なら出力しません。 - XLSX:
textRotationとして往復します。OOXML はこの 1 属性に 3 つの意味を詰めており (0〜90が反時計回り、91〜180が「90 + 時計回りの角度」、255が縦書き)、 読み書きの両方でこの詰め方を解いています。 - 3 つのコントロールに
SetSelectionRotation(float?)があります。nullで解除です。 - Studio は
Format ▸ Text Rotation(45° / -45° / 90° / -90° / Vertical Text(縦書き) / Custom Angle… / None)。
指定を消す
ws.SetCellStyle(0, 0, null); // セル個別の指定を消す(継承のみに戻る)
インターン
同じ内容の StyleRecord は自動的に 1 つに統合されます。record の値等価性を使った
インターンなので、毎回 new しても実体は共有されます。スタイルを再利用するために
変数へ退避する必要はありません。
詳細は 性能とメモリ を参照してください。