CellValue は 1 セルぶんの値を表す構造体です。数値・真偽値・日付を object に 包まずに持つため、大量のセルを走査してもメモリの割り当てが発生しません。

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

値の種別

1 個あたり 16 バイトです。空のセルは Empty という種別を持つだけで、 追加のコストはかかりません。

種別(CellValueKind保持するもの
Emptyなし(default
Numberdouble
Booleandouble に 0 / 1
DateTimeOLE オートメーション日付シリアル値
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 を確認してから対応するアクセサを使ってください。

アクセサ有効な種別
AsNumberNumber
AsBooleanBoolean
AsDateSerialDateTimeDateTime.FromOADate で変換)
AsStringIdText(プールの ID であり文字列そのものではない)
AsErrorCodeError

書き込み

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.Emptydefault と同じです。値を持たないセルを読んでも例外にはならず、 Empty が返ります。

どのアクセス方法を使うか

状況使うもの
表示・出力用の文字列がほしいws.GetDisplayText(r, c)
.NET の値として素直に扱いたいws.GetObjectValue(r, c)
大量のセルを走査し、割り当てを避けたいws.GetValue(r, c) / ws.ReadWindow(...)

GetObjectValueTextstring に、DateTimeDateTime に解決して返すため、 普段はこちらが扱いやすい選択肢です。CellValue を直接使う価値があるのは、 数万〜数百万セルを走査するような場面です。

等価性

CellValueIEquatable<CellValue> を実装しており、種別と保持値で比較されます。 Text は ID の比較になるため、同じシートのプールに属する値どうしでのみ意味を持ちます。

次に読む

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