V4 V5

Excel のテーブル(ListObject)は書式ではなくオブジェクトです。 V5 もそう扱います。TableDefinition が持つのは範囲・見出し行数・スタイル名だけで、 各セルの色は「そのセルが範囲のどこに居るか」から描画のたびに解かれます

色をセルに焼き込まないので、

  • 10 万行のテーブルでもオブジェクトは 1 個、
  • 途中に行を挿しても縞が崩れず
  • 手で塗ったセルは縞を破れ
  • xlsx には ad-hoc な塗りではなく本物の xl/tables/tableN.xml として出ます。

基本

using unvell.ReoGrid.Core;
using unvell.ReoGrid.Core.Tables;

// 先頭行を見出しにして A1:D100 をテーブルにする。既定は TableStyleMedium2
var table = ws.AddTable("A1:D100");

// 列名は見出し行から採られる
string first = table.Columns[0].Name;

// テーブルをやめる(Excel の「範囲に変換」)。書式はセルに入っていないので消えるだけ
ws.RemoveTable(table.Name);

_ = first;

AddTable は範囲を A1 形式のアドレスか名前付き範囲、あるいは RangePosition で受け取ります。 先頭行が見出しになり、列名はその行のテキストから採られます(空白や重複は Column3 / Qty2 のように一意化されます — Excel が列名の衝突を許さないため)。

スタイルとオプション

// スタイルとオプションを指定して作る
var table = ws.AddTable(RangePosition.Parse("A1:D100"), new AddTableOptions
{
	Name = "Sales",
	Style = "TableStyleMedium7",   // 組込 60 種。名前はファイルにそのまま残る
	ShowRowStripes = true,         // 交互行(既定 true)
	ShowFirstColumn = true,        // 先頭列を強調
	ShowFilterButton = true,       // 見出し行にフィルタ▽を出す(既定 false)
});

// 後から切り替える。Style は record struct なので with で書き換える
table.Style = table.Style with { ShowColumnStripes = true, ShowRowStripes = false };
オプション既定内容
NameTable1, Table2, …ブック内で一意な内部名。識別子なので英字か _ で始まり、英数字・._ のみ(空白不可、Q1 のようなセル参照も不可)— Excel は構造化参照でこの名前を綴るため
StyleTableStyleMedium2組込スタイル名。未知の名前でも書き換えません(後述)
HeaderRowCount101。Excel のテーブルに複数見出し行はありません
TotalsRowCount001。配色はしますが集計関数は未実装です(往復はします)
ShowRowStripestrue交互行(しま模様)
ShowColumnStripesfalse交互列
ShowFirstColumn / ShowLastColumnfalse先頭列・末尾列の強調
ShowFilterButtonfalse見出し行にフィルタ▽を出す(シートの auto-filter を張ります)

ShowFilterButton が既定で false なのは、シートが持てる auto-filter が 1 つだけだからです。 既定で true にすると、2 つ目のテーブルを作った瞬間に 1 つ目から▽が消えます。

交互行(しま模様)

テーブルの縞はシート単位の縞と同じ数え方をします。 すなわち可視行だけを数えるので、フィルタで行が消えても縞が 2 行続きません。 テーブルの中ではテーブルの縞が優先され、シートの縞はテーブルの縁で止まります。

Excel は縞をテーブルスタイルの中に持っているので、 xlsx を往復するのはこちらの縞です(シート単位の縞は Excel に置き場所が無く、reogrid-json のみ)。

塗りの優先順位

強い順に:

  1. 条件付き書式
  2. セル自身の書式(セル → 行 → 列のスタイル鎖)
  3. テーブルスタイル
  4. シートの縞(テーブルの外だけ)

テーブルは継承鎖の Root ◁ Table ◁ Column ◁ Row ◁ Cell に入ります。 セル自身より弱いので、1 行だけ黄色く塗ればそこだけ縞を破れます。 罫線も同じで、テーブルの枠線の上に手書きの罫線が辺ごとに乗ります。

問い合わせ

bool any = ws.HasTables;

// そのセルを覆っているテーブル(無ければ null)
TableDefinition? at = ws.GetTableAt(5, 2);

// 名前で引く(大小無視)
TableDefinition? byName = ws.GetTable("Sales");

// 見出し・集計行を除いたデータ部分
RangePosition data = at?.DataRange ?? default;

// そのセルにテーブルが与えている塗り(セル自身の書式より弱い層)
var contributed = ws.GetTableStyle(5, 2);

// 手書きの罫線をテーブルの罫線の上に重ねた結果
CellBorders borders = ws.GetEffectiveBorders(5, 2);

_ = (any, byName, data, contributed, borders);

組込スタイルと自前の配色

Excel はファイルにスタイル名しか書きませんTableStyleMedium7 がどう見えるかは アプリ側の知識です。V5 は 60 種を名前から生成します — 組込スタイルは 7 個ずつ並び、 各列の先頭が中立色、以降が 6 つのテーマアクセント、という Excel 自身の配置なので、 名前から family とアクセント色が分かります。配色は OOXML と同じ HSL の tint 曲線で導くので、 Office の「明るく 40%」などのスウォッチと一致します。

知らない名前は既定の配色で描きますが、名前は書き換えません。 Excel 独自のスタイルが付いたファイルを開いて保存し直しても、Excel 側では元の見た目に戻ります。

// 組込スタイルの一覧(Light 1–21 / Medium 1–28 / Dark 1–11)
foreach (string name in TableStyles.BuiltinNames())
{
	TableStyleDefinition def = TableStyles.Resolve(name);
	_ = (def.HeaderFill, def.RowStripeFill, def.WholeBorderColor);
}

// 自前の配色を登録する(同名の組込を上書きもできる)
TableStyles.Register(new TableStyleDefinition
{
	Name = "BrandTable",
	HeaderFill = 0xFF1F3864,
	HeaderColor = 0xFFFFFFFF,
	HeaderBold = true,
	RowStripeFill = 0xFFEAF0F8,
	WholeBorderColor = 0xFF1F3864,
});

行・列の挿入と削除

テーブルは自分が説明しているデータに追従します。 上に行を挿せば下がり、途中に挿せば伸び、列を消せば列リストからもその列が抜けます。 テーブルの行が全部消えれば、テーブルも一緒に消えます。

入出力

形式内容
reogrid-jsontables(reogrid-web の JsonTableDefinition と同形)
XLSXxl/tables/tableN.xml[Content_Types].xml の Override + シートの _rels<tableParts>。番号はブック全体の通し番号

まだ無いもの

  • 集計行の集計関数(SUBTOTAL)— 行の配色と往復だけ
  • 構造化参照(=Table1[列名]
  • 隣のセルを編集したときの自動拡張
ページの内容は役に立ちましたか?