XLSX(OOXML)の読み書きは unvell.ReoGrid.IO.Excel が担当します。
外部パッケージに依存しません(Open XML SDK も EPPlus も使いません)。
One パッケージにはすべて同梱されています。
読み書き
using unvell.ReoGrid.Core;
using unvell.ReoGrid.IO.Excel;
Workbook loaded = XlsxReader.Read("book.xlsx");
XlsxWriter.Write(wb, "out.xlsx");
// ストリームからも読める
using var stream = File.OpenRead("book.xlsx");
Workbook fromStream = XlsxReader.Read(stream);
XlsxWriter.Write にもストリーム版があります。
ストリーミング読み込み
読み込みは XmlReader によるストリーミングで、スパースストアへ直接流し込みます。
メモリ使用量は実在するセル数に比例します(シートの宣言上の寸法ではありません)。
巨大ファイルの遅延ロード
// 巨大ファイルはシート単位の遅延ロードで開く
using var virtualBook = XlsxReader.OpenVirtual("large.xlsx", SheetLoadMode.OnDemand);
| モード | 挙動 |
|---|---|
OnDemand | シートを最初に表示したときにそのシートを構築する |
Background | アクティブシートを先に構築し、残りをバックグラウンドで先読みする |
VirtualWorkbook は IDisposable です。元のストリームを保持するため、
使い終わったら破棄してください。
数式の扱い
読み込み時に数式は再評価されません。 Excel が保存したキャッシュ値をそのまま採用します。
var wb = XlsxReader.Read("book.xlsx");
// Excel のキャッシュ値をそのまま読むため、ロード時に再評価はしない。
// 自前で計算し直したい場合だけ明示的に呼ぶ。
foreach (var sheet in wb.Worksheets)
sheet.Recalculate();
この設計には理由があります。V5 が実装していない関数を含むファイルでも、Excel が計算した値が
そのまま表示されるためです。再評価すると #NAME? に化けてしまいます。
対応している範囲
| 対象 | 読み | 書き |
|---|---|---|
| 値(数値・文字列・真偽値・日付・エラー) | ○ | ○ |
| 共有文字列・インライン文字列・リッチ文字列 | ○ | ○ |
| スタイル(フォント・色・配置・折り返し) | ○ | ○ |
| 数値書式 | ○ | ○ |
| 罫線 | ○ | ○ |
| 結合 | ○ | ○ |
| 行高・列幅・非表示 | ○ | ○ |
| 1900 / 1904 日付方式 | ○ | ○ |
条件付き書式(<conditionalFormatting> / <dxfs>) | ○ | ○ |
定義名(<definedNames>) | ○ | ○ |
| アウトライン(グループ化) | ○ | ○ |
| 画像(drawing) | ○ | ○ |
ページ設定(<pageSetup>) | ○ | ○ |
| 数式 | ○(キャッシュ値を保持) | ○ |
未対応
| 対象 | 備考 |
|---|---|
オートフィルタ(<autoFilter>) | 行の表示状態は保存されるが、フィルタ設定は失われる |
| 共有数式の展開 | |
| セルコメント | V5 にコメント機能自体がない |
| チャート・図形 | 同上(画像は対応) |
| セル型 | XLSX に対応する概念がないため通常のセルになる |
組込名(_xlnm.Print_Area など) | 印刷範囲は PrintSettings で扱う |
| データバーの負の色・ゼロ軸・枠線 | OOXML の x14 拡張が必要 |
| 枠固定・ズームなどの表示状態 | ビューはモデルと分離されており保存対象外 |
cellStyleXfs(xfId)のスタイル継承 | 読み込み時に展開されない |