Microsoft Excel(マイクロソフト エクセル)をC#で作成したプログラムから操作することができる便利なライブラリ「ClosedXML」の使用法について紹介します。
このライブラリは、マイクロソフトが提供している表計算ソフト(エクセル)がインストールされていないパソコンでも操作が可能です。
注意点としては旧ファイルのExcel97-2003(*.xls)は読み込むことができないことです。
このライブラリは新ファイルのOpen XML規格用に作られているので、Excel2007(*.xlsx)以降なら操作可能です。
ClosedXMLについて
ClosedXMLは、Excel 2007~2019 (拡張子が「*.xlsx」と「*.xlsm」) ファイルの読み取り、操作、および書き込みを行うための .NETライブラリです。
エクセルのセルに数値や文字列、数式などの読み書きやセルのスタイル、データテーブルの挿入、オートフィルタなどが設定ができます。
何でもできるように思えますが、グラフの作成やOpen XML形式以外のエクセルファイルはサポートしていません。
C#のプロジェクトにClosedXMLをインストールするには、NuGetから検索してインストールをします。
ClosedXMLのインストール
まずインストールするプロジェクトファイルをVisual Studioで開きます。
ヘッダーメニューもしくはソリューションエクスプローラーから、NuGetパッケージマネージャーを開きます。
NuGetパッケージマネージャーの検索欄に「ClosedXML」と入力して検索します。
関連されるパッケージが表示されるので、「ClosedXML 作者:Francois Botha…」と記載されているパッケージを選択してインストールをします。
インストールが終われば完了です。
次はインストールしたClosedXMLの基本的な操作方法を見てみましょう。
Excelファイルの操作
ファイル操作に関するコードを紹介します。
Excelファイルの作成
XLWorkbookクラスを使って新しいブックを作成します。
XLWorkbook オブジェクト名 = new XLWorkbook();
XLWorkbook オブジェクト名 = new XLWorkbook(ファイル名);
//新しいブックを作成する
XLWorkbook workbook = new XLWorkbook();
//ファイルを指定して開く
XLWorkbook workbook = new XLWorkbook(@"C:¥Sample.xlsx");
引数にファイル名(ファイルパス)を渡すと既存のエクセルファイルを開くことができます。
Excelファイルの保存
エクセルファイルとして保存する場合は、XLWordbookクラスのSaveAsメソッドもしくはSaveメソッドを使用します。
オブジェクト名.SaveAs(ファイル名);
オブジェクト名.Save();
//ファイル名を指定して保存
workbook.SaveAs(@"C:¥Sample.xlsx");
//既存ファイルの上書き保存
workbook.Save();
既存のファイルを開いて、そのファイルを上書き保存するならSaveAsメソッドを使います。
既存のファイルを開いていないにもかかわらず、Saveメソッドを利用してしまうと「This is a new file. Please use one of the ‘SaveAs’ methods.」というメッセージが表示され例外が発生しますので、注意してください。
エクセルシートの操作
シート操作に関するコードを紹介します。
シートの追加
WorksheetプロパティのAddメソッドを使って、新しいシートを追加します。
オブジェクト名.Worksheets.Add();
オブジェクト名.Worksheets.Add(シート名);
オブジェクト名.Worksheets.Add(シート名,シートの位置);
//デフォルトのシート名で追加
workbook.Worksheets.Add();
//シート名を指定して追加
workbook.Worksheets.Add("シート追加");
//追加するシートの名前と位置を指定
workbook.Worksheets.Add("シート追加",2);
追加するシートの位置を指定することができます。第2引数に渡した数値に一致する場所にシートが追加されます。
第2引数を2としてシートを追加すると、上図のように2番目の位置にシートが追加されます。
シートの取得
操作したいシートを取得するには、Worksheetの引数にシート名もしくはシートの番号を渡します。
オブジェクト名.Worksheet(取得するシート名);
オブジェクト名.Worksheet(取得するシートの番号);
//Sheet1を取得する
workbook.Worksheet("Sheet1");
//シート番号1を取得する
workbook.Worksheet(1);
ブック内に存在しないシート名やシート番号を指定すると「There isn’t a worksheet associated with that position.
」という例外が発生します。
シートの移動
ブックにあるシートの位置をPositionプロパティを使って移動します。
オブジェクト名.Worksheet(移動するシート名).Position = 位置の番号;
//Sheet1を2番目に移動する
workbook.Worksheet("Sheet1").Position = 2;
上に記述しているコードは、Sheet1を指定してシートの位置を2番目に移動します。
ブック内に存在するワークシート数以上の値をPositionに指定すると「Index must be equal or less than the number of worksheets + 1. Arg_ParamName_Name」という例外が発生します。ワークシート数+1までの範囲で指定をしなければなりません。
シートの削除
シートを削除するには、シートを指定してDeleteメソッドを使用します。
オブジェクト名.Worksheet(削除するシート名).Delete();
オブジェクト名.Worksheet(削除するシートの番号).Delete();
//Sheet1を削除する
workbook.Worksheet("Sheet1").Delete();
//1番目のシートを削除する
workbook.Worksheet(1).Delete();
ブック内に存在しないシート名やシート番号を指定すると「There isn’t a worksheet associated with that position.
」という例外が発生します。
シートのコピー
ブック内のシートの複製、別のブックのシートを作業中のブックに複製するには、CopyToメソッドを使用します。
IXLWorksheet 変数名 = オブジェクト名.Worksheet(コピーするシートの番号);
変数名.CopyTo(シート名);
XLWorkbook コピー元のオブジェクト名 = new XLWorkbook(コピー元のファイル名);
コピー元のオブジェクト名.Worksheet(コピーするシート番号).CopyTo(オブジェクト名,シート名);
//Sheet1をコピーして、Copyシートを作成する
IXLWorksheet targetsheet = workbook.Worksheet(1);
targetsheet.CopyTo("Copy");
//1番目のシートを削除する
XLWorkbook source = new XLWorkbook("Sample.xlsx");
source.Worksheet(1).CopyTo(workbook,"Copy");
最後のシートにコピーしたシートが追加されます。
シートの複製は利用することが多いので、簡単に操作できるのはいいですね。
セルの操作
セルの操作に関するコードを紹介します。
セルを取得
シートを選択して、Cellメソッドでセルの値を取得したいアドレスを指定します。
IXLWorksheet 変数名 = オブジェクト名.Worksheet(シートの番号);
IXLCell 変数名 = 変数名.Cell(セルのアドレス);
//シート番号1のセル「A1」を取得する
IXLWorksheet worksheet = workbook.Worksheet(1);
IXLCell cell = worksheet.Cell("A1");
セルのアドレスはA1参照形式とR1C1参照形式のどちらの表記も利用可能です。R1C1参照形式は行番号と列番号が数値で指定できるので、プログラムを書く上で非常に便利です。
セルの値を取得
シートを選択して、Cellメソッドでセルの値を取得したいアドレスを指定します。Valueプロパティでそのセルの値が取得できます。
IXLWorksheet 変数名 = オブジェクト名.Worksheet(シートの番号);
string 変数名 = 変数名.Cell(セルのアドレス).Value.ToString();
//シート番号1のセル「A1」の値を取得する
IXLWorksheet worksheet = workbook.Worksheet(1);
string str = worksheet.Cell("A1").Value.ToString();
セルのアドレスはA1参照形式とR1C1参照形式のどちらの表記も利用可能です。R1C1参照形式は行番号と列番号が数値で指定できるので、プログラムを書く上で非常に便利です。
また、Valueで取得した値をToString()で文字列型にしていますが、必要に応じてセルの表示形式に応じて型を変更することが必要です。
セルに値を書き込む
セルに値を代入するにはシートを選択して、Cellメソッドでセルの値を取得したいアドレスを指定します。Valueプロパティに書き込みたい値を代入します。
IXLWorksheet 変数名 = オブジェクト名.Worksheet(シートの番号);
変数名.Cell(セルのアドレス).Value = 書き込む値;
//シート番号1のセル「A1」に値を書き込む
IXLWorksheet worksheet = workbook.Worksheet(1);
worksheet.Cell("A1").Value = "Hello World";
上述したコードを実行した結果が次の図です。
セル「A1」にHello Worldが書き込まれました。
セルの表示形式を設定
シートを選択して、Cellメソッドでセルのアドレスを指定してDataTypeプロパティにデータの種類を選択します。必要に応じてFormatプロパティに詳細な表示形式を設定します。
IXLWorksheet 変数名 = オブジェクト名.Worksheet(シートの番号);
変数名.Cell(セルのアドレス).DataType = XLDataType.データの種類;
//シート番号1のセル「A1」~「A5」に値を書き込む
IXLWorksheet worksheet = workbook.Worksheet(1);
worksheet.Cell("A1").Value = "Hello World";
worksheet.Cell("A1").DataType = XLDataType.Text;
worksheet.Cell("A2").Value = new DateTime(2021, 12, 10);
worksheet.Cell("A2").DataType = XLDataType.DateTime;
worksheet.Cell("A3").Value = new TimeSpan(33, 45, 22);
worksheet.Cell("A3").DataType = XLDataType.TimeSpan;
worksheet.Cell("A4").Value = 123.456;
worksheet.Cell("A4").Style.DateFormat.Format = "0.00";
worksheet.Cell("A4").DataType = XLDataType.Number;
worksheet.Cell("A5").Value = true;
worksheet.Cell("A5").DataType = XLDataType.Boolean;
上述したコードを実行した結果が次の図です。
セル「A4」はFormatプロパティで小数点第2位まで表示するように設定をしています。
セルのフォント設定
シートを選択して、Cellメソッドでセルのアドレスを指定してFontプロパティにフォントの種類やサイズを選択します。
IXLWorksheet 変数名 = オブジェクト名.Worksheet(シートの番号);
変数名.Cell(セルのアドレス).Style.Font.SetBold(true);
変数名.Cell(セルのアドレス).Style.Font.SetFontColor(XLColor.Red);
変数名.Cell(セルのアドレス).Style.Font.SetFontName(フォント名);
変数名.Cell(セルのアドレス).Style.Font.SetFontSize(サイズ);
変数名.Cell(セルのアドレス).Style.Font.SetUnderline();
//セルのフォント設定をする
worksheet.Cell("A1").Style.Font.SetBold(true); //太字
worksheet.Cell("A1").Style.Font.SetFontColor(XLColor.Red); //文字色
worksheet.Cell("A1").Style.Font.SetFontName("メイリオ"); //フォント名
worksheet.Cell("A1").Style.Font.SetFontSize(20); //フォントサイズ
worksheet.Cell("A1").Style.Font.SetUnderline(); //下線
上述したコードを実行した結果が次の図です。
設定したフォントがセルに適用されました。
セルに罫線を引く
シートを選択して、Cellメソッドでセルのアドレスを指定してBorderプロパティで罫線を引きます。
IXLWorksheet 変数名 = オブジェクト名.Worksheet(シートの番号);
変数名.Cell.Style.Border.SetxxxxBorder(XLBorderStyleValues.Thin);
※xxxxは罫線を引く場所を指定します。
//セルの4箇所に罫線を引く
worksheet.Cell("B2").Style.Border.SetOutsideBorder(XLBorderStyleValues.Thin); //細線
worksheet.Cell("B4").Style.Border.SetOutsideBorder(XLBorderStyleValues.Thick); //太線
worksheet.Cell("D2").Style.Border.SetOutsideBorder(XLBorderStyleValues.Dotted); //点線
worksheet.Cell("D4").Style.Border.SetOutsideBorder(XLBorderStyleValues.Medium); //中太線
//部分罫線を引く
worksheet.Cell("F2").Style.Border.SetTopBorder(XLBorderStyleValues.Thin); //上だけ
worksheet.Cell("F4").Style.Border.SetBottomBorder(XLBorderStyleValues.Thin); //下だけ
worksheet.Cell("H2").Style.Border.SetLeftBorder(XLBorderStyleValues.Thin); //左だけ
worksheet.Cell("H4").Style.Border.SetRightBorder(XLBorderStyleValues.Thin); //右だけ
上述したコードを実行した結果が次の図です。
このようにXLBorderStyleValuesの列挙型から罫線の種類を選択することで変更が可能です。
まとめ
今回はC#でClosedXMLを利用したエクセルの操作方法について解説しました。
Excelのインストール不要で、ClosedXMLのサンプルも豊富にあるため扱いやすいライブラリです。
読み書きやセルの書式設定など基本的な操作は網羅されているので、Excelを扱う際は利用してみてはいかがでしょうか。
他にもエクセルが操作できるライブラリを紹介していますので、こちらも参考にしてみてください。

以上、最後まで読んでいただきありがとうございました。
コメント