> 作業効率UP!! オススメのモバイルモニターを紹介

【C#】EPPlusでExcelを操作する方法を紹介

当ページのリンクには広告が含まれています。
  • URLをコピーしました!

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 からプロジェクトへインストールできます。

次の手順でインストールしましょう。

STEP
NuGetパッケージの管理を開く

ソリューション エクスプローラーからプロジェクトを選択して右クリックして「NuGet パッケージの管理」を選択します。

STEP
EEPlusを検索する

NuGetパッケージマネージャー画面で「参照」を選択し、検索欄に「EEPlus」を入力します。

STEP
インストールする

検索結果の一覧の中にある「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プロパティの型ExcelWorksheetsIEnumerableを承継しているため、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月に最新バージョンがリリースされ、新しい機能が追加やパフォーマンスの向上により、更に使いやすくなりました。

エクセルを操作する機会がある方は、使ってみてはいかがでしょうか。

以上、最後まで読んで頂きありがとうございました。

よかったらシェアしてね!
  • URLをコピーしました!