StyleRecord はセルの書式を表す不変のレコードです。V4 の WorksheetRangeStylePlainStyleFlag を置き換えます。

名前空間は 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 は「指定しない=上位から継承する」を意味します。

プロパティ内容
FontFamilystring?フォント名
FontSizefloat?フォントサイズ(ポイント)
Bold / Italic / Underline / Strikethroughbool?文字装飾
Coloruint?文字色(ARGB)
BackgroundColoruint?背景色(ARGB)
TextAlignHAlign?General / Left / Center / Right
VerticalAlignVAlign?Bottom / Middle / Top
TextWrapModeTextWrap?None / Wrap / BreakWord
Indentushort?インデント段数
RotationAnglefloat?文字の回転角(度、-90〜90)。TextRotation.Stacked(255)で縦書き

TextAlignGeneral は 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 を使います。

nullfalse の違い

// 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反時計回りの度数で、有効な範囲は -9090 です (Excel の配置ダイアログで見える値と同じ)。範囲外の値は TextRotation.Normalize で丸められます。

縦書きは角度ではない

TextRotation.Stacked255)だけは角度ではなく、Excel の縦書きを表すマーカーです。 文字を寝かせず正立させたまま、1 文字 1 行で上から下へ積みます。

この 255 は OOXML 自身の値(<alignment textRotation="255"/>)なので、そのまま持っておくと 縦書きのセルが xlsx を素通りで往復します。1 つのファイル形式しか設定しないプロパティを 別に生やす必要がありません。

積む単位は char ではなくルーンです。絵文字や稀用漢字のようなサロゲートペアが 半分に割れて 2 行にならないようにするためです。

描画のしかた

回転テキストは、自分のフレームで水平にレイアウトしてからブロックごと中心で回します。 そのため行分割・計測・ベースラインは、回転していないテキストと同じ共有パスを通ります (WinForms / WPF / Avalonia / PDF の 4 面が同じ結果になります)。

  • 回転後のバウンディングボックスをセルの配置(左右・上下)で置き、セルにクリップします。 回転したテキストが隣のセルへはみ出すことはありません。
  • 折り返しの幅は回転方向に沿った長さで測ります(0° はセル幅、90° はセル高さ、その間は補間)。
  • 縦書きのときは水平配置が中央固定になります。
  • 行高・列幅の AutoFit も回転後の寸法で測るので、描かれるとおりのサイズになります。

リッチテキストのセルは回転しません(水平に描画されます)。

I/O と UI

  • reogrid-jsonrotationAngle(V5 の拡張)。0 なら出力しません。
  • XLSXtextRotation として往復します。OOXML はこの 1 属性に 3 つの意味を詰めており (090 が反時計回り、91180 が「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 しても実体は共有されます。スタイルを再利用するために 変数へ退避する必要はありません。

詳細は 性能とメモリ を参照してください。

次に読む

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