4
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Excel編集ライブラリを比較してみた【OpenXML / ClosedXML / EPPlus / NPOI / MiniExcel / NetOffice】

4
Posted at

はじめに

アプリケーションを開発していると、Excelの編集機能が必要になる事があります。

今回は、無料で利用可能なライブラリに限定して以下の6つを比較します。

  • OpenXml
  • ClosedXML
  • EPPlus(Ver5以降は商用利用時にライセンス契約が必要)
  • NPOI
  • MiniExcel
  • NetOffice

各ライブラリの特徴

※ サンプルコードではエラーハンドリングやDisposeを省略しています。

OpenXML

NuGet追加

dotnet add package DocumentFormat.OpenXml

サンプルコード

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

サンプルコード

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

サンプルコード

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

サンプルコード

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

サンプルコード

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追加

.NET(Core / 5以降)の場合
dotnet add package NetOffice.Excel
.NET Frameworkの場合
dotnet add package NetOfficeFw.Excel

サンプルコード

NetOffice
// 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を操作するので、オートシェイプの追加・移動・回転・色変更などを自由に行えます。
一方、OpenXMLClosedXMLは図形を保持できるものの、Excel COMほどの編集機能は持っていません。

グラフ・ピボット

EPPlusNetOfficeは作成・編集できます。
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
4
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?