Status Code 303 - See Other

サーバサイド、iOS・アンドロイドアプリ、インフラレベルの話まで幅広くやってます。情報の誤りや指摘・意見などは自由にどうぞ。

C#でのExcel操作取得編

概要

C#Excelを操作した調査内容。今回は、NuGetから取得できるライブラリClosedXMLを使ったメモ。

インストー

Nugetから「OpenXML」をインストール。

Excel操作インスタンス取得

ファイルを開いていると IOException が出るので、閉じてから実行すること。

	var book = new XLWorkbook("C:\\Users\\hoshikouki\\sample.xlsx");

ファイルを開くため当然閉じる処理も必要だが、IDisposableを実装しているため using 構文が使える。

	using(var book = new XLWorkbook("C:\\Users\\hoshikouki\\sample.xlsx"))
	{
		// 処理
	}

シート取得

	// ○番目のシート取得
	var sheet = book.Worksheet(1);
	// シート名で取得
	var sheet = book.Worksheet("Sheet1");	

存在しないシート名や存在しないシート数指定するとExceptionが発生する。
シート名指定の英大・小文字は特に区別しないらしく、"Sheet1"を"SHEET1"でも"SHEet1"でも取得できる。

セル取得

	// (行,列)番号で取得
	var cell = sheet.Cell(i, j);
	// 範囲文字列で取得
	var cell = sheet.Cell("A5");

行列の番号は1以上で指定する。0指定するとExceptionが発生する。

セル集合取得

セル集合に対する一括操作とかで使う。

	// 使用セル全部
	var cells = sheet.Cells();
	// 範囲文字列で取得
	var cells = sheet.Cell("A1:C11");
	// 条件でセルを取得(背景色が黄色のセル)
	var cells = sheet.Cells(x => x.Style.Fill.BackgroundColor == XLColor.Yellow);

条件でセルを取得する場合、全セルを調査しているせいかOutOfMemoryExceptionが発生する。あまりやらない方が良いかも。

セル値取得

	// 値や簡単な計算の場合の値取得
	var value = cell.Value;
	// 計算値などを取得する場合
	var cell = cell.ValueCached;

Valueプロパティで取得した場合、一部関数(ROW(), COLUMN()など)がサポートされていないようで例外が発生することがある。
ValueCachedプロパティはROW()、COLUMN()が動いた。けれど計算した値でなければNullになる。
このことから、以下のようにすればどちらでもいけそう。

	var value = cell.ValueCached ?? cell.Value;

計算式取得

	var formula = cell.FormulaA1;

なんでA1なんて名前がついているのか分からんけど、式は取得はできた。