V4 V5

RichText は 1 セルの中で文字ごとに書式を変えるための型です。書式の切れ目ごとの区間を **ラン(run)**と呼び、その並びとして表現します。

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

1 セルの中で書式が切り替わるリッチテキスト

組み立てる

using unvell.ReoGrid.Core;
using unvell.ReoGrid.Core.Text;

var rt = new RichText(
[
	new RichTextRun { Text = "合計 " },
	new RichTextRun { Text = "12,800", Bold = true, Color = 0xFFCC0000 },
	new RichTextRun { Text = " 円" },
]);

ws.SetRichText(0, 0, rt);

RichTextRun

StyleRecord と同じく、すべて nullable です。null のプロパティはセルの実効スタイルから 継承されます。

プロパティ
Textstring
Bold / Italic / Underlinebool?
FontFamilystring?
FontSizefloat?
Coloruint?(ARGB)

背景色・配置・折り返しはランごとには指定できません。これらはセル単位の StyleRecord で指定します。

行の組み方

1 行に複数のランが並ぶとき、行内のベースラインは 1 本です。太字・サイズ違い・ 日本語のランが混ざっても文字の下端が揃います。行の高さはその行で一番背の高いランで 決まるので、大きい文字を含む行だけが背高くなります。

セルに TextWrapMode を指定すると、リッチテキストも折り返します。折り返し位置は ランの境界ではなく文字列全体から決まるので、書式が途中で変わる単語 (太字の 12, + 通常の 800)が書式の切れ目で分断されることはありません。ランを またぐ位置で折り返した場合、そのランは分割され、両方が元の書式を保ちます。

読み出す

if (ws.HasRichText(0, 0))
{
	RichText? rt = ws.GetRichText(0, 0);
	Console.WriteLine(rt!.PlainText);      // 書式を落とした文字列

	foreach (RichTextRun run in rt.Runs)
		Console.WriteLine($"{run.Text} bold={run.Bold}");
}

HasRichText はオブジェクトを生成せずに存在を判定します。走査のホットパスではこちらを使ってください。

プレーン文字列との相互変換

var rt = RichText.FromPlain("プレーンな文字列");
var copy = rt.Clone();                  // Runs ごと複製する

ws.SetRichText(0, 0, null);             // リッチテキストを外す

Runs は可変のリストです。取得した RichText を書き換えると元のセルに影響するため、 編集する場合は Clone() してください。

セル値との関係

リッチテキストはセル値とは別のテーブルに載ります。

  • リッチテキストを設定すると、そのセルの表示はリッチテキストが担います
  • ws.SetFormula(...) を呼ぶと、そのセルのリッチテキストは自動的に外れます
  • GetObjectValue / GetDisplayTextPlainText 相当の文字列を返します

使われている場所

同じレイアウト処理をグリッドの描画とセルエディタが共有しています。編集中に文字単位で 太字や色を変えられるのはこのためです。コントロール側の API は次のとおりです。

  • control.ToggleEditingBold() / ToggleEditingItalic() / ToggleEditingUnderline()
  • control.SetEditingTextColor(color)

詳細は セルの編集 を参照してください。

保存

reogrid-json と XLSX の双方に往復します。XLSX では共有文字列テーブルの リッチ文字列(<r> 要素の並び)として読み書きされます。

次に読む

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