ExcelをC#で操作したい。。。
Excel を C# で操作できるライブラリは複数存在しますが、ここでは「EPPlus」を紹介します。エクセルを操作するための機能が豊富でオススメのライブラリです。
注意点として、非商用利用が目的であれば無料で使用できますが、商用利用が目的であればライセンスの購入が必須となります。
2023年10月26日に最新バージョンである EPPlus 7 がリリースされ、積極的に開発が進められています。EEPlus はこれまでに 8000 万回以上ダウンロードされていることからも人気が伺えます。
EEPlus の使い方をサンプルコードを交えて紹介していますので、ぜひ最後まで読んで参考にしてみてください。
オススメの参考書
C#の使い方が丁寧に解説しており、「基礎からしっかりと学びたい」という初心者の方にオススメの一冊です。サンプルコードも記載してあり、各章の最後に復習問題があるので理解度を確認しながら読み進めることができます。新しい C# のバージョンにも対応している書籍です。
EEPlusとは
EEPlus とは、Open Office Xml形式(*.xlsx)の仕様を元に Excel のデータ操作を行うための .NET 向けのオープンソースライブラリです。Excel 2003 までのバイナリ形式(*.xls)の古い Excel は操作することはできません。
2023年10月26日に最新バージョン EPPlus 7 がリリースされ、ワークシート間の数式のサポート、パフォーマンスの向上などが実施されています。
\ EEPlus の公式サイトへ /
最新バージョンリリース!新しい機能追加、パフォーマンスも向上!!
エクセルの読み書きやエクセルで実装されている多くの操作に対応しています。
注意点として冒頭でお伝えしている通り、非商用利用が目的であれば無料で使用できます(Polyform Noncommercial 1.0.0を順守)が、商用利用が目的であればライセンスの購入が必須となります。
ライセンスの種類には、永久ライセンスとサブスクリプションライセンスの2種類があります。ライセンスの価格は、開発者の数や利用期間によって異なります。ライセンスについては公式サイトに記載があるので気になる方は確認してみてください。
EEPlusの特徴
- Excel 2007以降のバージョンをサポートしている。
- 高いパフォーマンスを備えており、大容量ファイルの処理も速い。
- LINQ を使用してデータ操作が可能である。
- パスワードや署名などセキュリティ機能がサポートされている。
- 非商用利用なら無料、商用利用ならライセンスの購入が必要である。
EEPlusのインストール方法
EEPlus は Nuget からプロジェクトへインストールできます。
次の手順でインストールしましょう。
ソリューション エクスプローラーからプロジェクトを選択して右クリックして「NuGet パッケージの管理」を選択します。
NuGetパッケージマネージャー画面で「参照」を選択し、検索欄に「EEPlus」を入力します。
検索結果の一覧の中にある「EEPlus」を選択して「インストール」をクリックします。
EEPlusの使い方
ここから EEPlus の使い方をサンプルコードを交えて具体的に紹介しています。
環境
- 統合開発環境:Visual Studio 2022
- フレームワーク:.NET 7.0
- EEPlus のバージョン:7.0.1
ライセンスを定義する
「EEPlus」は非商用利用(研究、実験、個人学習、趣味プロジェクトなど)なら無料、商用利用なら有料になります。
プロジェクトのソースコード内でライセンスの有無を定義します。
非商用利用
ExcelPackage.LicenseContext = LicenseContext.NonCommercial;
商用利用
ExcelPackage.LicenseContext = LicenseContext.Commercial;
名前空間を定義する
「EEPlus」でエクセルを操作するために、EEPlus の名前空間に含まれている様々なクラスを使います。
下記のように名前空間を宣言しておきましょう。
OfficeOpenXml.Style
はスタイル指定(色など)を使用する場合に必要です。
using OfficeOpenXml;
using OfficeOpenXml.Style;
新しいワークブックを作成する
ExcelPackage
のインスタンスを生成することで、空のワークブックが作成されます。
ExcelPackage
のオブジェクトは使い終わったらDispose
します。
下記コードのパターン 2 で紹介している using ステートメントを使うことで、オブジェクトのDispose
がそのスコープを抜けると自動で呼び出されるようになります。 これにより、変数の宣言に対して破棄は自動化されるため、Dispose
の書き忘れによるエラーが無くなります。
// パターン 1
var package = new ExcelPackage();
try
{
// 何かしらの処理をここに書く
}
finally
{
// finally句でDisposeを呼び出す
package.Dispose();
}
// パターン 2
using (var package = new ExcelPackage())
{
// 何かしらの処理をここに書く
}
既存のワークブックファイルを開く
既存のエクセルファイルを開く場合は、ExcelPackage
の引数にファイルパスを指定します。
using (var package = new ExcelPackage(@"C:\Users\Desktop\test.xlsx"))
{
// 何かしらの処理をここに書く
}
ワークブックを上書き保存する
ExcelPackage.Saveメソッド
既存のエクセルファイルを開いて操作している場合は、Save
メソッドで上書き保存ができます。
using (var package = new ExcelPackage(@"C:\Users\Desktop\test.xlsx"))
{
// 上書き保存する
package.Save();
}
ワークブックに名前を付けて保存する
ExcelPackage.SaveAsメソッド
ワークブックに名前を付けて保存したい場合は、SaveAs
メソッドの引数にファイルパスを指定します。
using (var package = new ExcelPackage())
{
// Sheet1を追加する
package.Workbook.Worksheets.Add("Sheet1");
// test.xlsxとして保存する
package.SaveAs(@"C:\Users\Desktop\test.xlsx");
}
ワークシートを追加する
ExcelWorksheets.Addメソッド
ExcelPackage
を単に生成しただけでは、ワークシートが1つもない状態です。そのため、ワークシートを追加する必要があります。
ワークシート名を指定して、ワークシートを追加します。
using (var package = new ExcelPackage())
{
var sheet = package.Workbook.Worksheets.Add("Sheet1");
}
既存のワークシートを取得する
ExcelWorkbook.Worksheetsプロパティ
既存のワークシートを取得するには、Worksheets
プロパティにワークシート名を指定します。存在しないワークシート名を指定された場合、null
が返されます。
using (var package = new ExcelPackage())
{
// Sheet1、Sheet2、Sheet3を追加する
package.Workbook.Worksheets.Add("Sheet1");
package.Workbook.Worksheets.Add("Sheet2");
package.Workbook.Worksheets.Add("Sheet3");
var sheet = package.Workbook.Worksheets["Sheet2"];
}
Worksheets
プロパティの型ExcelWorksheets
はIEnumerable
を承継しているため、System.Linq 名前空間のメソッドが使用可能です。
using (var package = new ExcelPackage())
{
// Sheet1、Sheet2、Sheet3を追加する
package.Workbook.Worksheets.Add("Sheet1");
package.Workbook.Worksheets.Add("Sheet2");
package.Workbook.Worksheets.Add("Sheet3");
var targetSheetName = "Sheet2";
var sheet = package.Workbook.Worksheets.First(x => x.Name == targetSheetName);
}
ワークシートを削除する
ExcelWorksheets.Deleteメソッド
ワークシートを削除するには、ExcelWorksheets.Delete
メソッドの引数にワークシート名またはワークシートのオブジェクトを指定します。
using (var package = new ExcelPackage())
{
// Sheet1、Sheet2、Sheet3を追加する
package.Workbook.Worksheets.Add("Sheet1");
package.Workbook.Worksheets.Add("Sheet2");
package.Workbook.Worksheets.Add("Sheet3");
package.Workbook.Worksheets.Delete("Sheet2");
}
ワークシートをコピーする
ExcelWorksheets.Copyメソッド
特定のワークシートをコピーする場合には、ExcelWorksheets.Copy
メソッドを使用します。コピー元のワークシートを選択し、コピーしたワークシートの名前を引数として渡します。
using (var package = new ExcelPackage())
{
// Sheet1を追加する
package.Workbook.Worksheets.Add("Sheet1");
// Sheet1をコピーして、CopySheetを追加する
var copySheet = package.Workbook.Worksheets.Copy("Sheet1", "CopySheet");
}
ワークシートのセルに値を記述する
ExcelRangeBase.Valueプロパティ
ExcelWorksheet.SetValueメソッド
セルに値をセットするには、ExcelRangeBase.Value
プロパティを使用する方法とExcelWorksheet.SetValue
メソッドを使用する方法があります。
using (var package = new ExcelPackage())
{
var sheet = package.Workbook.Worksheets.Add("Sheet1");
// アドレスを指定してセルに書き込み
sheet.Cells["A1"].Value = "TEST1";
// 行列番号を指定してセルに書き込み
sheet.Cells[1, 2].Value = "TEST2";
// SetValueメソッドでアドレスを指定してセルに書き込み
sheet.SetValue("C1", "TEST3");
// SetValueメソッドで行列番号を指定してセルに書き込み
sheet.SetValue(1, 4, "TEST4");
}
実行結果は次のようになります。
また、LoadFromText
メソッドや LoadFromArrays
メソッド、Cells のValue
プロパティを使用することで、文字列や数値などをまとめてセットすることが可能です。
using (var package = new ExcelPackage())
{
var sheet = package.Workbook.Worksheets.Add("Sheet1");
// LoadFromTextメソッドを使って複数のセルに書き込み
var inputData = "1,2,3,4,5,6";
sheet.Cells["A1"].LoadFromText(inputData);
// LoadFromArraysメソッドを使って複数のセルに書き込み
var inputList = new List<object[]>()
{
new object[] { "7", "8", "9", "10", "11", "12" },
};
sheet.Cells["A3"].LoadFromArrays(inputList);
// Valueプロパティを使って複数のセルに書き込み
sheet.Cells["A5:F5"].Value = new object[,]
{
{ "13", "14", "15", "16", "17", "18" }
};
}
実行結果は次のようになります。
ワークシートのセルの値を取得する
ExcelRangeBase.Valueプロパティ
ExcelRangeBase.GetCellValueメソッド
セルの値を取得するには、ExcelRangeBase.Value
プロパティもしくExcelRangeBase.GetCellValue
メソッドを使用します。
using (var package = new ExcelPackage())
{
var sheet = package.Workbook.Worksheets.Add("Sheet1");
// A1とA2に値を設定する
sheet.Cells["A1"].Value = "TEST1";
sheet.Cells["A2"].Value = "TEST2";
// A1の値を取得する
var value1 = sheet.Cells["A1"].Value.ToString();
Debug.WriteLine(value1);
// A2の値を取得する
var value2 = sheet.Cells["A2"].GetCellValue<string>(0, 0);
Debug.WriteLine(value2);
}
実行結果は次のようになります。
TEST1
TEST2
ワークシートのセルに式を設定する
ExcelRangeBase.Formulaメソッド
セルに数式を設定するには、Value
プロパティではなくFormula
プロパティに指定します。Formula
プロパティに指定した後、Calculate
メソッドを実行して数式を反映する必要があります。
using (var package = new ExcelPackage())
{
var sheet = package.Workbook.Worksheets.Add("Sheet1");
// A1とA2に値を設定する
sheet.Cells["A1"].Value = 1;
sheet.Cells["A2"].Value = 2;
// A3に数式を設定する
sheet.Cells["A3"].Formula = "SUM(A1:A2)";
// 数式を実行する
package.Workbook.Calculate();
// A3の計算結果を取得する
var result = sheet.Cells["A3"].Value;
Debug.WriteLine(result);
}
実行結果は次のようになります。
3
セルのフォントを設定する
ExcelStyle.Fontプロパティ
フォントを設定する場合は、セルを指定してExcelStyle.Font
プロパティでフォントの種類やサイズ、文字色などを指定します。
using (var package = new ExcelPackage())
{
var sheet = package.Workbook.Worksheets.Add("Sheet1");
// A1に値を設定する
sheet.Cells["A1"].Value = "Hello World";
// フォントサイズ
sheet.Cells["A1"].Style.Font.Size = 20;
// フォント色(引数は透明度, 赤, 緑, 青)
sheet.Cells["A1"].Style.Font.Color.SetColor(0, 255, 126, 126);
// フォント名
sheet.Cells["A1"].Style.Font.Name = "メイリオ";
// 太字(ボールド体)
sheet.Cells["A1"].Style.Font.Bold = true;
// 斜体(イタリック対)
sheet.Cells["A1"].Style.Font.Italic = true;
}
実行結果は次のようになります。
セルの背景色を設定する
ExcelStyle.Fillプロパティ
セルの背景色を設定する場合は、セルを指定してExcelStyle.Fill
プロパティで背景色を指定します。
ExcelStyle.Fill
プロパティを設定する前に、PatternType
プロパティでパターンタイプを指定しておきます。これをしていないと、System.ArgumentException: ‘Can’t set color when patterntype is not set.’という例外が発生します。
using (var package = new ExcelPackage())
{
var sheet = package.Workbook.Worksheets.Add("Sheet1");
//セル背景色を設定する
sheet.Cells["A1"].Style.Fill.PatternType = ExcelFillStyle.Solid;
sheet.Cells["A1"].Style.Fill.BackgroundColor.SetColor(120, 20, 20, 255);
sheet.Cells["A3"].Style.Fill.PatternType = ExcelFillStyle.Solid;
sheet.Cells["A3"].Style.Fill.BackgroundColor.SetColor(System.Drawing.Color.Aqua);
}
実行結果は次のようになります。
範囲を指定して背景色をまとめてセットすることが可能です。
using (var package = new ExcelPackage())
{
var sheet = package.Workbook.Worksheets.Add("Sheet1");
//セル背景色を設定する
sheet.Cells["A1:D3"].Style.Fill.PatternType = ExcelFillStyle.Solid;
sheet.Cells["A1:D3"].Style.Fill.BackgroundColor.SetColor(System.Drawing.Color.Aqua);
// 上書き保存する
package.SaveAs("Sample.xlsx");
}
実行結果は次のようになります。
まとめ
今回は C# で EEPlus を利用したエクセルの操作方法について解説しました。
2023年10月に最新バージョンがリリースされ、新しい機能が追加やパフォーマンスの向上により、更に使いやすくなりました。
エクセルを操作する機会がある方は、使ってみてはいかがでしょうか。
以上、最後まで読んで頂きありがとうございました。