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 };
| オプション | 既定 | 内容 |
|---|---|---|
Name | Table1, Table2, … | ブック内で一意な内部名。識別子なので英字か _ で始まり、英数字・.・_ のみ(空白不可、Q1 のようなセル参照も不可)— Excel は構造化参照でこの名前を綴るため |
Style | TableStyleMedium2 | 組込スタイル名。未知の名前でも書き換えません(後述) |
HeaderRowCount | 1 | 0 か 1。Excel のテーブルに複数見出し行はありません |
TotalsRowCount | 0 | 0 か 1。配色はしますが集計関数は未実装です(往復はします) |
ShowRowStripes | true | 交互行(しま模様) |
ShowColumnStripes | false | 交互列 |
ShowFirstColumn / ShowLastColumn | false | 先頭列・末尾列の強調 |
ShowFilterButton | false | 見出し行にフィルタ▽を出す(シートの auto-filter を張ります) |
ShowFilterButton が既定で false なのは、シートが持てる auto-filter が 1 つだけだからです。
既定で true にすると、2 つ目のテーブルを作った瞬間に 1 つ目から▽が消えます。
交互行(しま模様)
テーブルの縞はシート単位の縞と同じ数え方をします。 すなわち可視行だけを数えるので、フィルタで行が消えても縞が 2 行続きません。 テーブルの中ではテーブルの縞が優先され、シートの縞はテーブルの縁で止まります。
Excel は縞をテーブルスタイルの中に持っているので、 xlsx を往復するのはこちらの縞です(シート単位の縞は Excel に置き場所が無く、reogrid-json のみ)。
塗りの優先順位
強い順に:
- 条件付き書式
- セル自身の書式(セル → 行 → 列のスタイル鎖)
- テーブルスタイル
- シートの縞(テーブルの外だけ)
テーブルは継承鎖の 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-json | tables(reogrid-web の JsonTableDefinition と同形) |
| XLSX | xl/tables/tableN.xml + [Content_Types].xml の Override + シートの _rels + <tableParts>。番号はブック全体の通し番号 |
まだ無いもの
- 集計行の集計関数(
SUBTOTAL)— 行の配色と往復だけ - 構造化参照(
=Table1[列名]) - 隣のセルを編集したときの自動拡張