C#でExcelを扱う場合、実務で最も使われるのが EPPlus と ClosedXML の2つです。 どちらもExcelをインストールせずに使えるため、業務アプリで非常に人気があります。
この記事でわかること
・EPPlusとClosedXMLの違い
・Excelの読み書き(基本)
・書式設定・テーブル化・数式・画像挿入
・大量データの高速化
・CSV変換・テンプレート利用
・業務アプリ向けベストプラクティス
・EPPlusとClosedXMLの違い
・Excelの読み書き(基本)
・書式設定・テーブル化・数式・画像挿入
・大量データの高速化
・CSV変換・テンプレート利用
・業務アプリ向けベストプラクティス
1. EPPlus と ClosedXML の違い
| 項目 | EPPlus | ClosedXML |
|---|---|---|
| 特徴 | 高速・高機能 | 直感的で書きやすい |
| 商用利用 | ライセンス注意(Polyform) | MIT(商用OK) |
| 書式設定 | 細かく制御可能 | 簡単に設定できる |
| 大量データ | 高速 | やや遅い |
商用アプリ → ClosedXMLが無難 高速処理 → EPPlusが有利
2. ClosedXMLでExcelを扱う(初心者〜実務向け)
■ 2-1. Excelの新規作成
using ClosedXML.Excel;
var wb = new XLWorkbook();
var ws = wb.Worksheets.Add("Sheet1");
ws.Cell("A1").Value = "名前";
ws.Cell("B1").Value = "年齢";
ws.Cell("A2").Value = "山田太郎";
ws.Cell("B2").Value = 30;
wb.SaveAs("sample.xlsx");
■ 2-2. Excelの読み込み
var wb = new XLWorkbook("sample.xlsx");
var ws = wb.Worksheet("Sheet1");
string name = ws.Cell("A2").GetString();
int age = ws.Cell("B2").GetValue<int>();
■ 2-3. 書式設定
ws.Cell("B2").Style.NumberFormat.Format = "#,##0";
ws.Range("A1:B1").Style.Font.Bold = true;
ws.Columns().AdjustToContents();
■ 2-4. テーブル化(フィルタ・スタイル)
var range = ws.Range("A1:B10");
range.CreateTable("UserTable");
■ 2-5. 数式の設定
ws.Cell("C2").FormulaA1 = "=B2 * 1.1";
■ 2-6. 画像の挿入
ws.AddPicture("logo.png")
.MoveTo(ws.Cell("D1"))
.Scale(0.5);
3. EPPlusでExcelを扱う(高速・高機能)
■ 3-1. 新規作成
using OfficeOpenXml;
ExcelPackage.LicenseContext = LicenseContext.NonCommercial;
using var package = new ExcelPackage();
var ws = package.Workbook.Worksheets.Add("Sheet1");
ws.Cells["A1"].Value = "商品名";
ws.Cells["B1"].Value = "価格";
ws.Cells["A2"].Value = "りんご";
ws.Cells["B2"].Value = 120;
package.SaveAs(new FileInfo("epplus.xlsx"));
■ 3-2. 書式設定
ws.Cells["B2"].Style.Numberformat.Format = "#,##0";
ws.Cells["A1:B1"].Style.Font.Bold = true;
■ 3-3. テーブル化
var tbl = ws.Tables.Add(ws.Cells["A1:B10"], "ProductTable");
tbl.TableStyle = TableStyles.Medium2;
■ 3-4. 数式
ws.Cells["C2"].Formula = "B2 * 1.1";
■ 3-5. 画像挿入
var pic = ws.Drawings.AddPicture("Logo", new FileInfo("logo.png"));
pic.SetPosition(0, 0);
pic.SetSize(200);
4. 大量データの高速化(1万〜10万件)
■ ClosedXMLの高速化ポイント
- Cell() を大量に呼ばない(Rangeでまとめる)
- AdjustToContents() を最小限に
- テーブル化しすぎない
■ EPPlusの高速化ポイント
- LoadFromDataTable() を使う
- LoadFromCollection() を使う
- 書式設定は最小限に
■ DataTable → Excel(EPPlus)
ws.Cells["A1"].LoadFromDataTable(dataTable, true);
5. CSV変換(高速・軽量)
Excelが不要な場合はCSVが最速です。
File.WriteAllLines("output.csv",
data.Select(x => $"{x.Id},{x.Name},{x.Age}"));
6. テンプレート利用(帳票向け)
請求書・納品書などの帳票は、 テンプレートExcelを読み込んで値だけ差し替えるのが最も実務的です。
■ ClosedXML例
var wb = new XLWorkbook("template.xlsx");
var ws = wb.Worksheet("Sheet1");
ws.Cell("B2").Value = customer.Name;
ws.Cell("B3").Value = order.Total;
wb.SaveAs("invoice.xlsx");
7. 業務アプリ向けベストプラクティス
- 商用アプリ → ClosedXML(MITライセンス)
- 大量データ → EPPlus(高速)
- 帳票 → テンプレート方式
- DataGrid → Excel出力は DataTable 経由が安定
- 非同期で生成してUIフリーズを防ぐ
- ファイル名・フォルダ構成をルール化する
まとめ:EPPlusとClosedXMLを使い分けると“実務が圧倒的に楽になる”
- ClosedXML → 書きやすい・商用OK・帳票向け
- EPPlus → 高速・高機能・大量データ向け
- テンプレート方式で帳票を安定運用
- 非同期処理でUIフリーズを防ぐ
「Excel出力ができるアプリは強い」 業務アプリの価値を一段上げるために、 EPPlusとClosedXMLを使いこなしてみてください。