はじめに
アプリケーションを開発していると、Excelの編集機能が必要になる事があります。
今回は、無料で利用可能なライブラリに限定して以下の6つを比較します。
- OpenXml
- ClosedXML
- EPPlus(Ver5以降は商用利用時にライセンス契約が必要)
- NPOI
- MiniExcel
- NetOffice
各ライブラリの特徴
※ サンプルコードではエラーハンドリングやDisposeを省略しています。
OpenXML
NuGet追加
dotnet add package DocumentFormat.OpenXml
サンプルコード
// usingディレクティブ
using DocumentFormat.OpenXml;
using DocumentFormat.OpenXml.Spreadsheet;
using DocumentFormat.OpenXml.Packaging;
// 新規作成
var newbook = SpreadsheetDocument.Create(@"C:\work\ExcelTest\new.xlsx", SpreadsheetDocumentType.Workbook);
// ファイルを開く
//var workbook = SpreadsheetDocument.Open(@"C:\work\ExcelTest\template.xlsx", true);
// シート追加
var wbPart = newbook.AddWorkbookPart();
wbPart.Workbook = new Workbook();
var wsPart = wbPart.AddNewPart<WorksheetPart>();
wsPart.Worksheet = new Worksheet(new SheetData());
var sheets = newbook.WorkbookPart.Workbook.AppendChild(new Sheets());
var sheet = new Sheet()
{
Id = wbPart.GetIdOfPart(wsPart),
SheetId = (uint)(sheets.Count() + 1),
Name = "SheetA"
};
sheets.Append(sheet);
// シート指定
sheet = sheets.Elements<Sheet>().First(s => s.Name == "SheetA");
// セル指定
var sheetData = wsPart.Worksheet.GetFirstChild<SheetData>();
var row = new Row() { RowIndex = 1 };
sheetData.Append(row);
var cell = new Cell() { CellReference = "A1" };
row.Append(cell);
// 値代入
cell.CellValue = new CellValue("Hello");
cell.DataType = CellValues.String;
// 数式
var formulaCell = new Cell()
{
CellReference = "B1",
CellFormula = new CellFormula("SUM(1,2)")
};
row.Append(formulaCell);
// グラフ
// 使用可能(実装は非常に複雑)
// 図形
// 使用可能(実装は非常に複雑)
// マクロ実行
// 使用不可
// 保存
wbPart.Workbook.Save();
newbook.Dispose();
メリット
- Microsoft公式
- 依存が少ない
- Excelファイルの内部構造を直接扱える
デメリット
- コード量が多い
- 書式設定が複雑
- 初心者には難しい
向いているケース
- 独自仕様の帳票
- 細かな制御
- ライブラリ依存を減らしたい
ClosedXML
NuGet追加
dotnet add package ClosedXML
サンプルコード
// usingディレクティブ
using ClosedXML.Excel;
// 新規作成
var newbook = new XLWorkbook();
// ファイルを開く
//var workbook = new XLWorkbook(@"C:\work\ExcelTest\template.xlsx");
// シート追加
var ws = newbook.Worksheets.Add("SheetA");
// シート指定
ws = newbook.Worksheet("SheetA");
// セル指定
var cell = ws.Cell("A1");
// 値代入
cell.Value = "Hello";
// 数式
ws.Cell("B1").FormulaA1 = "SUM(1,2)";
// グラフ
// 使用可能(限定的)
// 図形
// 使用可能(限定的)
// マクロ実行
// 使用不可
// 保存
newbook.SaveAs(@"C:\work\ExcelTest\new.xlsx");
メリット
- Excel感覚で操作できる
- 書式設定が簡単
- 帳票開発が非常に楽
デメリット
- 大量データではメモリ消費が増える
- 内部的にはOpenXML依存
向いているケース
- 業務帳票
- 見積書
- 請求書
- 一覧表
EPPlus
NuGet追加
dotnet add package EPPlus
サンプルコード
// usingディレクティブ
using OfficeOpenXml;
using OfficeOpenXml.Drawing.Chart;
// 新規作成
var newbook = new ExcelPackage();
// ファイルを開く
//var workbook = new ExcelPackage(new FileInfo(@"C:\work\ExcelTest\template.xlsx"));
// シート追加
var ws = newbook.Workbook.Worksheets.Add("SheetA");
// シート指定
ws = newbook.Workbook.Worksheets["SheetA"];
// セル指定
var cell = ws.Cells["A1"];
// 値代入
cell.Value = "Hello";
// 数式
ws.Cells["B1"].Formula = "SUM(1,2)";
// グラフ
var chart = ws.Drawings.AddChart("chart1", eChartType.ColumnClustered);
// 図形
var shape = ws.Drawings.AddShape("shape1", eShapeStyle.Rect);
// マクロ実行
// 使用不可
// 保存
newbook.SaveAs(new FileInfo(@"C:\work\ExcelTest\new.xlsx"));
メリット
- グラフ
- ピボット
- 条件付き書式
- 数式計算エンジン
デメリット
- Ver5以降は商用利用時にライセンス契約が必要
- APIがやや多機能
向いているケース
- 分析レポート
- ダッシュボード
- 高度なExcel機能
NPOI
NuGet追加
dotnet add package NPOI
サンプルコード
// usingディレクティブ
using NPOI.XSSF.UserModel;
using NPOI.HSSF.UserModel; // xlsの場合
using NPOI.SS.UserModel;
// 新規作成
IWorkbook newbook = new XSSFWorkbook();
// xlsの場合
//IWorkbook newbook = new HSSFWorkbook();
// ファイルを開く
//var fs = new FileStream(@"C:\work\ExcelTest\template.xlsx", FileMode.Open, FileAccess.ReadWrite);
//IWorkbook workbook = new XSSFWorkbook(fs);
// シート追加
var ws = newbook.CreateSheet("SheetA");
// シート指定
ws = newbook.GetSheet("SheetA");
// セル指定
var row = ws.CreateRow(0);
var cell = row.CreateCell(0);
// 値代入
cell.SetCellValue("Hello");
// 数式
row.CreateCell(1).SetCellFormula("SUM(1,2)");
// グラフ
// 使用可能(限定的)
// 図形
// 使用可能(限定的)
// マクロ実行
// 使用不可
// 保存
using (var fileStream = new FileStream(@"C:\work\ExcelTest\new.xlsx", FileMode.Create, FileAccess.Write))
{
newbook.Write(fileStream);
}
メリット
- .xls / .xlsx 両対応
- 古いシステムとの互換性が高い
デメリット
- APIが少し古い
- ClosedXMLほど直感的ではない
向いているケース
- .xlsを扱う
- 官公庁向け
- 既存資産の活用
MiniExcel
NuGet追加
dotnet add package MiniExcel
サンプルコード
// usingディレクティブ
using MiniExcelLibs;
// 新規作成&保存
var data = new[] { new { A = "Hello", B = "World" } };
MiniExcel.SaveAs(@"C:\work\ExcelTest\new.xlsx", data);
// ファイルを開く
var workbook = MiniExcel.Query(@"C:\work\ExcelTest\template.xlsx");
// シート追加
// 使用不可
// シート指定
// 使用不可
// セル指定
// 使用不可
// 値代入
// 使用不可
// 数式
// 使用不可
// グラフ
// 使用不可
// 図形
// 使用不可
// マクロ実行
// 使用不可
メリット
- 非常に高速
- 低メモリ
- 大量データに強い
デメリット
- 書式設定は弱い
- 帳票用途には不向き
向いているケース
- CSV代替
- データエクスポート
- バッチ処理
NetOffice
NuGet追加
dotnet add package NetOffice.Excel
dotnet add package NetOfficeFw.Excel
サンプルコード
// usingディレクティブ
using NetOffice.ExcelApi;
using NetOffice.OfficeApi.Enums;
// アプリケーション起動
var app = new Application();
// 新規作成
var newbook = app.Workbooks.Add();
// ファイルを開く
//var workbook = app.Workbooks.Open(@"C:\work\ExcelTest\template.xlsx");
// シート追加
var ws = (Worksheet)newbook.Worksheets.Add();
// シート指定
ws = (Worksheet)newbook.Worksheets[1];
// セル指定
var cell = ws.Range("A1");
// 値代入
cell.Value = "Hello";
// 数式
ws.Range("B1").Formula = "=SUM(1,2)";
// グラフ
var charts = (ChartObjects)ws.ChartObjects();
charts.Add(100, 50, 300, 200);
// 図形
ws.Shapes.AddShape(MsoAutoShapeType.msoShapeRectangle, 50, 50, 100, 50);
// マクロ実行
app.Run("Macro1");
// 保存
newbook.SaveAs(@"C:\work\ExcelTest\new.xlsx");
// ブックを閉じる
newbook.Close();
// アプリケーション終了
app.Quit();
メリット
- 実際のExcelを操作できる
- マクロ実行可能
- 既存テンプレートとの相性が良い
- グラフ・図形・印刷設定など全機能が使える
デメリット
- Excelインストール必須
- COM解放が必要
- サーバー用途には不向き
向いているケース
- Windowsアプリ
- 既存テンプレートを活用
- ユーザー操作を伴うシステム
ライブラリ比較表
| 項目 | OpenXML | ClosedXML | EPPlus | NPOI | MiniExcel | NetOffice |
|---|---|---|---|---|---|---|
| Excel | 不要 | 不要 | 不要 | 不要 | 不要 | 必要 |
| 書式設定 | △ | ◎ | ◎ | ○ | △ | ◎ |
| 数式 | ○ | ○ | ◎ | ○ | △ | ◎ |
| グラフ | △ | △ | ◎ | △ | × | ◎ |
| 図形 | △ | △ | ○ | △ | × | ◎ |
| マクロ実行 | × | × | × | × | × | ◎ |
| .xls | × | × | × | ◎ | × | ◎ |
| 速度 | ○ | ○ | ○ | ○ | ◎ | △ |
| 学習コスト | 高 | 低 | 中 | 中 | 低 | 中 |
◎:Excelと同等レベルで自由に操作可能
○:実用的なレベルで操作可能
△:保持や一部操作は可能だが、作成・編集機能は限定的
×:非対応
図形編集
NetOfficeは 実際のExcelを操作するので、オートシェイプの追加・移動・回転・色変更などを自由に行えます。
一方、OpenXMLやClosedXMLは図形を保持できるものの、Excel COMほどの編集機能は持っていません。
グラフ・ピボット
EPPlusとNetOfficeは作成・編集できます。
OpenXMLなどは既存のグラフを保持することはできますが、こちらもExcel COMほどの編集機能は持っていません。
10万行以上の大量データ
MiniExcelは大量データの処理に向いています。
逆にNetOfficeはExcelを起動してCOM経由でセル操作するため、大量データの処理は不向きです。
どれを選ぶべきか?
| 項目 | OpenXML | ClosedXML | EPPlus | NPOI | MiniExcel | NetOffice |
|---|---|---|---|---|---|---|
| .xlsを扱う | × | × | × | ○ | × | ○ |
| Excelがインストールされていない | ○ | ○ | ○ | ○ | ○ | × |
| Excelテンプレートを使う | ○ | ○ | ○ | ○ | ○ | ◎ |
| マクロを実行する | × | × | × | × | × | ◎ |
| 図形を編集する | △ | △ | ○ | △ | × | ◎ |
| グラフ・ピボットを使う | △ | △ | ◎ | △ | × | ◎ |
| 10万行以上のデータを扱う | ○ | ○ | ○ | ○ | ◎ | △ |
おわりに
新規開発のライブラリとしてはClosedXMLが最もバランスが良いです。
Webアプリでは「Excelがインストールされていない前提」で設計する必要がありますが、WindowsアプリではOfficeが導入済みであることを前提にできるケースもあります。
以下の使い分けで考えると良いです。
- 標準帳票:ClosedXML
- 大量データ:MiniExcel
- Excel資産活用:NetOffice
- .xlsを使う:NPOI