CellValue は 1 セルぶんの値を表す構造体です。数値・真偽値・日付を object に
包まずに持つため、大量のセルを走査してもメモリの割り当てが発生しません。
名前空間は unvell.ReoGrid.Core.Data です。
値の種別
1 個あたり 16 バイトです。空のセルは Empty という種別を持つだけで、
追加のコストはかかりません。
種別(CellValueKind) | 保持するもの |
|---|---|
Empty | なし(default) |
Number | double |
Boolean | double に 0 / 1 |
DateTime | OLE オートメーション日付シリアル値 |
Text | 共有文字列プールの ID |
Error | エラーコード |
読み出し
using unvell.ReoGrid.Core;
using unvell.ReoGrid.Core.Data;
CellValue v = ws.GetValue(0, 0);
switch (v.Kind)
{
case CellValueKind.Empty:
break;
case CellValueKind.Number:
Console.WriteLine(v.AsNumber);
break;
case CellValueKind.Boolean:
Console.WriteLine(v.AsBoolean);
break;
case CellValueKind.DateTime:
Console.WriteLine(DateTime.FromOADate(v.AsDateSerial));
break;
case CellValueKind.Text:
case CellValueKind.Error:
// 文字列とエラーは ID で持つため、Worksheet 経由で解決する
Console.WriteLine(ws.GetObjectValue(0, 0));
break;
}
アクセサは種別を検査しません。 Kind を確認してから対応するアクセサを使ってください。
| アクセサ | 有効な種別 |
|---|---|
AsNumber | Number |
AsBoolean | Boolean |
AsDateSerial | DateTime(DateTime.FromOADate で変換) |
AsStringId | Text(プールの ID であり文字列そのものではない) |
AsErrorCode | Error |
書き込み
ws.SetValue(0, 0, CellValue.Number(1200));
ws.SetValue(0, 1, CellValue.Boolean(true));
ws.SetValue(0, 2, CellValue.Date(DateTime.Today.ToOADate()));
// 文字列は必ず Worksheet 経由(共有プールへの登録が必要なため)
ws.SetText(0, 3, "ノート");
CellValue.Text(int) と CellValue.ErrorCode(int) は ID を受け取ります。ID は
シートが持つプールに登録されて初めて意味を持つため、アプリケーションコードから直接
呼ぶ場面はありません。文字列は ws.SetText(...) を使ってください。
空セル
CellValue none = CellValue.Empty; // = default
bool isEmpty = ws.GetValue(5, 5).IsEmpty;
CellValue.Empty は default と同じです。値を持たないセルを読んでも例外にはならず、
Empty が返ります。
どのアクセス方法を使うか
| 状況 | 使うもの |
|---|---|
| 表示・出力用の文字列がほしい | ws.GetDisplayText(r, c) |
| .NET の値として素直に扱いたい | ws.GetObjectValue(r, c) |
| 大量のセルを走査し、割り当てを避けたい | ws.GetValue(r, c) / ws.ReadWindow(...) |
GetObjectValue は Text を string に、DateTime を DateTime に解決して返すため、
普段はこちらが扱いやすい選択肢です。CellValue を直接使う価値があるのは、
数万〜数百万セルを走査するような場面です。
等価性
CellValue は IEquatable<CellValue> を実装しており、種別と保持値で比較されます。
Text は ID の比較になるため、同じシートのプールに属する値どうしでのみ意味を持ちます。