Excelファイルを開いたり保存したりしたいけど …
.NET のアプリケーションを開発していると、何かにつけてExcelファイルを取り扱いたい場面に出会います。Excelを扱うのにCOM(Microsoft.Office.Interop.Excel)を使う方法がありますが、取り扱い方法を間違えるとプロセスが残るという問題があります。それを避けるにはかなり込み入ったコードの書き方をしなければなりません。
さらにCOMを使うには動作環境にExcelのインストールが必要になります。つまり何かと面倒で手間がかかるのです。
Microsoft.Office.Interop.Excelを使う方法を推奨しない理由
上記のページは参考になります。
ClosedXML – オープンソースのライブラリを使う
Excelには2つの種類の拡張子 “xls” “xlsx” があります。この “xls” は、Microsoftの独自規格ですが、”xlsx” はオープンな規格(Office Open XML)です(“docx”, “pptx”も同様)。つまりファイルの仕様が公開されているものです。Open XML を扱うためのマイクロソフト謹製のライブラリ(DocumentFormat.OpenXml)も存在しています。
この “DocumentFormat.OpenXml” をラップして使いやすくしたオープンソースのライブラリがあり、今回はこれの簡単な使い方を見ていきます。”ClosedXML” です。
https://github.com/closedxml/closedxml
ClosedXML は、拡張子 “xlsx” のファイルを操作できます。”xls” 形式のファイルは扱えないので注意しましょう。
サンプル
Excelブックの生成と値の代入、関数での計算を行います。さらにそれを適当なパスに保存しています。
Excelファイルを読み込み、シートの末尾行まで走査し、それを出力しています。
var path = "sample.xlsx";
// ブックを生成
using (var workbook = new XLWorkbook())
{
// シートを生成
var worksheet = workbook.Worksheets.Add("サンプルシート");
// セルに値を代入(いろんな指定ができます)
worksheet.Cell("A1").Value = 1;
worksheet.Cell(2, 1).Value = 2;
worksheet.Range(3, 1, 3, 2).Value = 3;
// SUM関数を代入(ValueではなくFormula、=は入れない)
worksheet.Cell(4, 1).FormulaA1 = "SUM(A1:A3)";
// 計算結果を取得することもできる
var sum = worksheet.Evaluate("SUM(A1:A3)");
// 保存
workbook.SaveAs(path);
}
// ブックを読み込む
using (var workbook = new XLWorkbook(path))
{
// 1シート目を取得
var worksheet = workbook.Worksheets.Worksheet(1);
// A列を末尾まで走査
var lastRow = worksheet.LastRowUsed().RowNumber();
for (int i = 1; i <= lastRow; i++)
{
var value = worksheet.Cell($"A{i}").Value?.ToString();
Console.WriteLine($"A{i}, {value}");
}
}
VB.NET も、同じような感じで扱えます。
上記コードは一例ですが、ライブラリの中身はMicrosoftのライブラリなので、機能は十分です。使うファイルが “xlsx” のみで問題なければ十分利用の価値はありそうです。
以上です。
記事を参考にさせていただきました。ありがとうございました。
質問なのですが、記事のような方法でセルの値を変更しファイルを保存したのですが、ファイル内のカスタムドキュメントプロパティとセルとのリンクがすべて切れてしまっていました。今回値を操作したセル以外とリンクしているプロパティもすべてです。設定したカスタムドキュメントプロパティとセルとのリンクを維持したまま値を上書きして保存というのは可能なのでしょうか?