フッターコンテンツにスキップ
他のコンポーネントと比較する

ASP.NETから Excel へのエクスポート: IronXL 、ClosedXML、EPPlus の比較

データを Excel にエクスポートすることは、 ASP.NET Core Web アプリケーションの標準要件です。 販売レポートを生成する場合、ユーザーが GridView コンテンツをダウンロードできるようにする場合、またはデータベース クエリから CSV ファイルを生成する場合、選択するアプローチによって、結果のファイルが Microsoft Excel できれいに開くか、または形式の警告がトリガーされるかが決まります。 この記事では、C# 開発者が利用できる最も一般的な Excel エクスポート方法 (従来の HTML ベースのストリーミングと、 IronXL、ClosedXML、EPPlus などの最新のライブラリ ソリューション) を比較し、プロジェクトに適したツールを選択できるようにします。

無料トライアルを開始して、 IronXL がASP.NET Coreアプリケーションで Excel ファイルの生成をどのように処理するかを確認してください。

ASP.NET CoreでデータをExcelにエクスポートする一般的な方法は何ですか?

ASP.NET Core開発者は、Excel エクスポート機能を追加するときにいくつかのパスを利用できます。 それぞれのアプローチは、出力ファイルの品質、実装に必要な労力、商用プロジェクトに対するライセンスの影響が異なります。

従来の MIME タイプ ストリーミングは最も古い手法です。 サーバーは応答のContent-Typeヘッダーをapplication/vnd.ms-excelに設定し、HTMLテーブルを書き込みます。 ブラウザはこれを Excel のダウンロードとして解釈しますが、ファイルには本物のスプレッドシート データではなく HTML マークアップが含まれています。 Microsoft Excelは不一致を検出し、ファイルを開く前に書式に関する警告を表示します。この方法では、数式、入力された列、または適切なセル書式設定はサポートされません。

ライブラリ ベースのソリューションは、 Microsoft によって定義されたOpen XML 形式を使用して本物の XLSX ファイルを構築するNuGetパッケージを追加します。 オプションには、 IronXL、ClosedXML、EPPlus などがあります。 これら 3 つのツールはすべて、警告なしで開くことができ、セル レベルの書式設定をサポートし、 .NET Coreで動作する有効な Excel ファイルを生成します。 ファイル ダウンロードに関する公式 for .NETドキュメントでは、これらすべてのアプローチで使用される基礎となるASP.NET Coreメカニズムについて説明しています。

以下の表は主な違いをまとめたものです。

Excelエクスポートライブラリの比較:機能マトリックス
特徴 MIMEタイプ / HTML ClosedXML EPPlus IronXL
本物のXLSX出力 なし はい はい はい
CSVファイルのサポート マニュアル 制限あり 制限あり ネイティブ
Excelの警告なしで開く なし はい はい はい
数式サポート なし はい はい はい
JSONとXMLのエクスポート なし なし なし はい
商用ライセンス 製品の更新とサポートオプション: マサチューセッツ工科大学 ポリフォーム コマーシャル
.NET Coreのサポート はい はい はい はい

ASP.NET CoreプロジェクトにIronXLをインストールするにはどうすればいいですか?

エクスポート コードを記述する前に、 NuGetパッケージ マネージャーまたは.NET CLI を使用してIronXL をプロジェクトに追加します。 IronXL はMicrosoft Office や COM 相互運用性に依存しないため、 .NETでサポートされているどのオペレーティング システムでも簡単にインストールできます。

dotnet add package IronXl.Excel
dotnet add package IronXl.Excel
SHELL

または、Visual Studio のパッケージ マネージャー コンソールを使用します。

Install-Package IronXl.Excel
Install-Package IronXl.Excel
SHELL

パッケージをインストールしたら、Excelファイルを生成する必要がある任意のコントローラーまたはサービスクラスにusing IronXL;を追加します。 基本的なエクスポート シナリオでは追加の構成は必要ありません。 ライセンスと展開オプションについては、 IronXLライセンス ページをご覧ください。

従来のGridViewエクスポートアプローチはどのように機能しますか?

従来の WebForms や一部の古い MVC パターンでは、開発者は GridView データを HTML としてレンダリングし、誤解を招く Content-Type ヘッダーを使用してブラウザーにストリーミングすることでエクスポートしていました。 アプリケーションはファイル名を設定するためにResponse.AddHeaderを呼び出し、HTML出力を直接書き込みます。

// Traditional approach -- exports HTML disguised as Excel
public void ExportToExcel(object sender, EventArgs e)
{
    Response.Clear();
    Response.Buffer = true;
    Response.ContentType = "application/vnd.ms-excel";
    Response.AddHeader("content-disposition", "attachment;filename=Report.xls");
    StringWriter stringWriter = new StringWriter();
    HtmlTextWriter htmlTextWriter = new HtmlTextWriter(stringWriter);
    // Render grid content as HTML
    DataGrid1.RenderControl(htmlTextWriter);
    Response.Write(stringWriter.ToString());
    Response.End();
}

public override void VerifyRenderingInServerForm(Control control)
{
    // Required to prevent server form rendering errors
}
// Traditional approach -- exports HTML disguised as Excel
public void ExportToExcel(object sender, EventArgs e)
{
    Response.Clear();
    Response.Buffer = true;
    Response.ContentType = "application/vnd.ms-excel";
    Response.AddHeader("content-disposition", "attachment;filename=Report.xls");
    StringWriter stringWriter = new StringWriter();
    HtmlTextWriter htmlTextWriter = new HtmlTextWriter(stringWriter);
    // Render grid content as HTML
    DataGrid1.RenderControl(htmlTextWriter);
    Response.Write(stringWriter.ToString());
    Response.End();
}

public override void VerifyRenderingInServerForm(Control control)
{
    // Required to prevent server form rendering errors
}
$vbLabelText   $csharpLabel

レガシー出力

ASP.NETからExcelへのエクスポート: C# 開発者向けベストツール比較: イメージ 1 - 旧式のExcelエクスポート出力

このメソッドはサーバーサイドのバリデーションをバイパスするためにVerifyRenderingInServerFormをオーバーライドする必要があります。 生成されたファイルには、本物のスプレッドシート データではなく HTML が含まれているため、ユーザーがファイルを開くと、Microsoft Excel によって形式の警告が表示されます。 出力では、ワークシートの数式、入力されたデータ列、またはセル レベルの書式設定をサポートできません。 新しいASP.NET Core開発では、このパターンを避けて適切な Excel ライブラリを使用する必要があります。

IronXLはどのようにASP.NET CoreでのExcelファイル生成を簡素化しますか?

IronXLは、Microsoft OfficeやCOM相互運用性を必要とせずに、本物のXLSXファイルを作成するためのAPIを提供します。このライブラリは、ワークブックオブジェクトを完全にマネージドコードで構築するため、追加の依存関係なしでLinux、macOS、Windowsで実行できます。

次の例では、ワークブックを作成し、ワークシートに売上データを入力し、ヘッダー行に太字の書式を適用し、ファイルをブラウザにストリーミングします。

using IronXL;
using Microsoft.AspNetCore.Mvc;

public class ExportController : Controller
{
    [HttpPost]
    public IActionResult ExportReport()
    {
        // Create workbook and worksheet
        WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLSX);
        WorkSheet worksheet = workbook.CreateWorkSheet("Sales Data");

        // Add header row
        worksheet["A1"].Value = "Product";
        worksheet["B1"].Value = "Quantity";
        worksheet["C1"].Value = "Revenue";

        // Populate data rows
        worksheet["A2"].Value = "Widget A";
        worksheet["B2"].Value = 150;
        worksheet["C2"].Value = 4500.00;
        worksheet["A3"].Value = "Widget B";
        worksheet["B3"].Value = 230;
        worksheet["C3"].Value = 6900.00;

        // Apply bold formatting to headers
        var headerRange = worksheet["A1:C1"];
        headerRange.Style.Font.Bold = true;

        // Stream file to browser
        byte[] fileBytes = workbook.ToByteArray();
        string filename = $"SalesReport_{DateTime.なしw:yyyyMMdd}.xlsx";
        return File(fileBytes,
            "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
            filename);
    }
}
using IronXL;
using Microsoft.AspNetCore.Mvc;

public class ExportController : Controller
{
    [HttpPost]
    public IActionResult ExportReport()
    {
        // Create workbook and worksheet
        WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLSX);
        WorkSheet worksheet = workbook.CreateWorkSheet("Sales Data");

        // Add header row
        worksheet["A1"].Value = "Product";
        worksheet["B1"].Value = "Quantity";
        worksheet["C1"].Value = "Revenue";

        // Populate data rows
        worksheet["A2"].Value = "Widget A";
        worksheet["B2"].Value = 150;
        worksheet["C2"].Value = 4500.00;
        worksheet["A3"].Value = "Widget B";
        worksheet["B3"].Value = 230;
        worksheet["C3"].Value = 6900.00;

        // Apply bold formatting to headers
        var headerRange = worksheet["A1:C1"];
        headerRange.Style.Font.Bold = true;

        // Stream file to browser
        byte[] fileBytes = workbook.ToByteArray();
        string filename = $"SalesReport_{DateTime.なしw:yyyyMMdd}.xlsx";
        return File(fileBytes,
            "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
            filename);
    }
}
$vbLabelText   $csharpLabel

IronXLアウトプット

ASP.NETからExcelへのエクスポート: C# 開発者向けベストツール比較: イメージ 2 - IronXLからExcelへのエクスポート出力

WorkBook.Createはメモリ内に新しいExcelドキュメントを構築します。 CreateWorkSheetはユーザーがExcelウィンドウの下部に見る名前付きタブを追加します。 セルの値はExcelスタイルの範囲表記("B2")を使用して割り当てられます。これにより、多くのC#開発者が読みやすく、維持しやすいと感じます。

ToByteArray()メソッドは完成したワークブックをバイト配列に変換し、ASP.NET CoreのFile()応答メソッドはそれをユーザーのブラウザに正しいMIMEタイプとコンテントディスポジションヘッダーを伴って直接ストリーミングします。 ダウンロードしたファイルは、形式の警告なしで Excel で開きます。

IronXL は、 SaveAsCsv メソッドによる CSV 形式へのエクスポートもサポートしています。

// Export as CSV instead of XLSX
workbook.SaveAsCsv("output.csv");
// Export as CSV instead of XLSX
workbook.SaveAsCsv("output.csv");
$vbLabelText   $csharpLabel

ワークシートデータをJSONまたはXMLとしてエクスポートする必要があるシナリオでは、IronXLはSaveAsXmlメソッドを提供します。これらの機能はClosedXMLやEPPlusでは利用できません。 追加のパターンについては、 IronXLコード例API リファレンスを参照してください。

IronXL はDataTable とデータベースの統合をどのように処理しますか?

多くのASP.NET Coreアプリケーションは、データをエクスポートする前に、SQL Server または別のリレーショナル データベースからデータを取得します。 IronXLはDataTableをワークシートに直接ロードするための一流のサポートを提供し、行を手動で繰り返す必要をなくします。

以下の例では、ADO.NETを使用してデータベースをクエリし、結果として得られたDataTableからExcelワークシートを作成しています。

using IronXL;
using System.Data;
using System.Data.SqlClient;
using Microsoft.AspNetCore.Mvc;

public class ReportController : Controller
{
    private readonly string _connectionString;

    public ReportController(IConfiguration config)
    {
        _connectionString = config.GetConnectionString("DefaultConnection");
    }

    [HttpGet]
    public IActionResult DownloadReport()
    {
        DataTable table = new DataTable();

        using (SqlConnection connection = new SqlConnection(_connectionString))
        {
            string query = "SELECT OrderId, CustomerName, Total, OrderDate FROM Orders";
            using SqlDataAdapter adapter = new SqlDataAdapter(query, connection);
            adapter.Fill(table);
        }

        WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLSX);
        WorkSheet worksheet = workbook.CreateWorkSheet("Orders");

        // Write column headers from DataTable schema
        for (int col = 0; col < table.Columns.Count; col++)
        {
            worksheet[0, col].Value = table.Columns[col].ColumnName;
        }

        // Write data rows
        for (int row = 0; row < table.Rows.Count; row++)
        {
            for (int col = 0; col < table.Columns.Count; col++)
            {
                worksheet[row + 1, col].Value = table.Rows[row][col].ToString();
            }
        }

        byte[] fileBytes = workbook.ToByteArray();
        return File(fileBytes,
            "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
            "Orders.xlsx");
    }
}
using IronXL;
using System.Data;
using System.Data.SqlClient;
using Microsoft.AspNetCore.Mvc;

public class ReportController : Controller
{
    private readonly string _connectionString;

    public ReportController(IConfiguration config)
    {
        _connectionString = config.GetConnectionString("DefaultConnection");
    }

    [HttpGet]
    public IActionResult DownloadReport()
    {
        DataTable table = new DataTable();

        using (SqlConnection connection = new SqlConnection(_connectionString))
        {
            string query = "SELECT OrderId, CustomerName, Total, OrderDate FROM Orders";
            using SqlDataAdapter adapter = new SqlDataAdapter(query, connection);
            adapter.Fill(table);
        }

        WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLSX);
        WorkSheet worksheet = workbook.CreateWorkSheet("Orders");

        // Write column headers from DataTable schema
        for (int col = 0; col < table.Columns.Count; col++)
        {
            worksheet[0, col].Value = table.Columns[col].ColumnName;
        }

        // Write data rows
        for (int row = 0; row < table.Rows.Count; row++)
        {
            for (int col = 0; col < table.Columns.Count; col++)
            {
                worksheet[row + 1, col].Value = table.Rows[row][col].ToString();
            }
        }

        byte[] fileBytes = workbook.ToByteArray();
        return File(fileBytes,
            "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
            "Orders.xlsx");
    }
}
$vbLabelText   $csharpLabel

このパターンにより、コントローラーはスリムかつテスト可能な状態になります。 データベース クエリとワークブックの構築は明確に分離されているため、データ ソースを交換したり、要約データ用のワークシートを追加したりすることが簡単になります。 既存のExcelファイルをDataTableに読み込む方法については、Excelファイルの読み取りに関するIronXLのハウツーガイドをご覧ください。

ClosedXMLとEPPlusの比較は?

ClosedXML は、アクセス可能な API を使用して Microsoft の Open XML SDK をラップします。 NuGetからインストールします:

Install-Package ClosedXML
Install-Package ClosedXML
SHELL

次の例は、一般的な ClosedXML エクスポート アクションを示しています。

using ClosedXML.Excel;
using Microsoft.AspNetCore.Mvc;

public class ExportController : Controller
{
    [HttpGet]
    public IActionResult ExportWithClosedXML()
    {
        using var workbook = new XLWorkbook();
        var worksheet = workbook.AddWorksheet("Data");
        worksheet.Cell(1, 1).Value = "Name";
        worksheet.Cell(1, 2).Value = "Amount";
        worksheet.Cell(2, 1).Value = "Alpha";
        worksheet.Cell(2, 2).Value = 1200;

        using var stream = new MemoryStream();
        workbook.SaveAs(stream);
        return File(stream.ToArray(),
            "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
            "export.xlsx");
    }
}
using ClosedXML.Excel;
using Microsoft.AspNetCore.Mvc;

public class ExportController : Controller
{
    [HttpGet]
    public IActionResult ExportWithClosedXML()
    {
        using var workbook = new XLWorkbook();
        var worksheet = workbook.AddWorksheet("Data");
        worksheet.Cell(1, 1).Value = "Name";
        worksheet.Cell(1, 2).Value = "Amount";
        worksheet.Cell(2, 1).Value = "Alpha";
        worksheet.Cell(2, 2).Value = 1200;

        using var stream = new MemoryStream();
        workbook.SaveAs(stream);
        return File(stream.ToArray(),
            "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
            "export.xlsx");
    }
}
$vbLabelText   $csharpLabel

ClosedXMLの出力

ASP.NETからExcelへのエクスポート: C# 開発者向けベストツール比較: イメージ 3 - ClosedXMLからExcelへのエクスポート出力

ClosedXMLはIronXLが使う範囲文字列の表記ではなく、整数ベースのセルアドレッシング(Cell(row, col))を使用します。 どちらの方法でも有効な XLSX ファイルが生成されます。 ClosedXML は マサチューセッツ工科大学 ライセンスの下でリリースされているため、商用ライセンスの懸念なくオープンソース プロジェクトに適しています。 ClosedXML GitHubリポジトリでは、問題追跡とコミュニティが提供した例が提供されます。

EPPlus は、非商用利用向けに ポリフォーム 非商用ライセンスで同様の機能を提供していますが、実稼働環境での展開には商用ライセンスが必要です。 商用製品で使用する前に、 EPPlus ライセンスの概要を参照してください。 EPPlus と ClosedXML はどちらも有効な Excel ファイルを生成しますが、どちらもIronXLのようなネイティブの CSV、JSON、または XML エクスポートは提供しません。

以下の表は、運用中のASP.NET Coreアプリケーションに関連する特定の機能を比較したものです。

実稼働ASP.NET Coreプロジェクトの詳細な機能比較
能力 IronXL ClosedXML EPPlus
CSV、JSON、XMLエクスポート ネイティブ 利用不可 利用不可
DataTable統合 はい はい はい
技術サポート ライセンスに含まれる コミュニティのみ 有料プラン
Microsoft Officeへの依存 該当なし 該当なし 該当なし
クロスプラットフォーム(Linux上 for .NET ) はい はい はい
ライセンスの種類 コマーシャル マサチューセッツ工科大学 ポリフォーム / 商業

プロジェクトに適したライブラリを選択するにはどうすればよいでしょうか?

適切な Excel エクスポート ライブラリの選択は、必要な出力形式、プロジェクトのライセンス制約、専門家のサポートが必要かどうかという 3 つの要素によって決まります。

アプリケーションで複数形式の出力 (XLSX、CSV、JSON、XML) が必要な場合、保証されたサポート チャネルを必要とする商用製品を構築する場合、または数式の評価、セルのスタイル設定、IronXLの生成などの高度な Excel 機能が必要な場合は、IronXL を選択してください。 IronXL のドキュメントでは、すべての API サーフェスが詳細にカバーされており、サポート チームがライセンス所有者に直接対応します。 追加のパターンとチュートリアルについては、 IronXLブログをご覧ください。

プロジェクトがオープンソースまたは非商用であり、XLSX 出力のみが必要な場合は、ClosedXML を選択します。 マサチューセッツ工科大学 ライセンスでは再配布に制限はなく、API はコミュニティ リソースを通じて十分に文書化されています。

既存のコードベースですでに EPPlus を使用しており、別のライブラリに移行すると商用ライセンスを購入するよりもコストがかかる場合は、EPPlus を選択します

IronXL を他の製品と比較して評価しているチームの場合、 IronXL試用ライセンスを使用すると、購入を決定する前にフル機能のテストを行うことができます。 Excel ファイルの読み取りと書き込みに関する追加のコード例は、 IronXLの例ページで入手できます。

次のステップは何ですか?

ASP.NET Coreで利用可能な Excel エクスポート方法を確認したので、次の手順に進みます。

  • IronXLをインストールしてdotnet add package IronXl.Excelを使用し、入門ガイドを順に実行して最初のワークブックを作成してください。
  • データベースのエクスポート、複数シートのワークブック、スタイル設定されたレポートなど、ユースケースに一致するシナリオのIronXLサンプル ページを確認して、コード パターンを比較します
  • IronXLライセンス ページにアクセスしてライセンスを評価し、開発、ステージング、本番環境の展開のオプションを理解します。
  • 追加の形式を探るために、アプリケーションが同じコードベースから複数の形式でデータをエクスポートする必要がある場合は、SaveAsXmlメソッドをテストしてください。
  • 旧式のコードから移行するには、ソリューション内の既存のResponse.ContentType = "application/vnd.ms-excel"パターンを特定し、それらをIronXLのワークブック作成に置き換えることで、ユーザーにフォーマット警告をなくします。

実稼働環境での展開の場合は、ライセンスを購入して専門的なサポートを受け、 IronXLライセンス条件に準拠していることを確認してください。

今IronXLを始めましょう。
green arrow pointer

よくある質問

ASP.NET CoreでExcelにエクスポートするためのIronXLの主な機能は何ですか?

IronXLは、Microsoft Officeを必要とせずに、XLSX、CSV、JSON、XML形式のファイルを生成します。ブックとワークシートの管理、セルレベルのスタイル設定、数式の評価、DataTableとの統合など、直感的なAPIをすべて標準 for .NETマネージドコード内で提供します。

IronXL は、ClosedXML for ASP.NET Core プロジェクトと比較してどうですか?

IronXLは複数のエクスポート形式(XLSX、CSV、JSON、XML)をサポートし、商用ライセンスにはプロフェッショナルサポートが含まれています。ClosedXMLはMITライセンスの下で有効なXLSXファイルを生成するため、スプレッドシート出力のみを必要とするオープンソースプロジェクトに最適です。

IronXLはASP.NETでデータベースからExcelレポートを作成するのに適していますか?

はい。IronXLはDataTable オブジェクトと ADO .NETクエリ結果を直接操作するため、SQL Server やその他のリレーショナル データベースからワークシートにデータを入力し、結果のファイルをブラウザーにストリーミングすることが簡単になります。

EPPlusよりIronXLを使用する利点は何ですか?

IronXLはCSV、JSON、XMLエクスポートをネイティブにサポートし、すべての商用ライセンスにプロフェッショナルサポートが付属し、非商用利用に関する制限はありません。EPPlusは、本番環境での使用には別途商用ライセンスが必要であり、ネイティブのマルチフォーマットエクスポートは提供していません。

IronXLは大量のデータセットを効率的に処理できますか?

IronXLはサーバーサイドのワークロード向けに設計されており、Microsoft ExcelやCOM相互運用性を必要とせずに大規模なデータセットを処理できます。非常に大きなエクスポートの場合、バイト配列をASP.NET CoreのFile()レスポンスを通じて直接ストリーミングすることで、ファイル全体をメモリにバッファリングする必要がなくなります。

IronXLはExcelにエクスポートするためにMicrosoft Officeをインストールする必要がありますか?

いいえ。IronXLは完全にマネージド.NETコードで動作し、Microsoft Office、COM相互運用性、Officeオートメーションに依存しません.NETがサポートされているWindows、Linux、macOSで動作します。

カーティス・チャウ
テクニカルライター

Curtis Chauは、カールトン大学でコンピュータサイエンスの学士号を取得し、Node.js、TypeScript、JavaScript、およびReactに精通したフロントエンド開発を専門としています。直感的で美しいユーザーインターフェースを作成することに情熱を持ち、Curtisは現代のフレームワークを用いた開発や、構造の良い視覚的に魅力的なマニュアルの作成を楽しんでいます。

開発以外にも、CurtisはIoT(Internet of Things)への強い関心を持ち、ハードウェアとソフトウェアの統合方法を模索しています。余暇には、ゲームをしたりDiscordボットを作成したりして、技術に対する愛情と創造性を組み合わせています。

Iron Support Team

We're online 24 hours, 5 days a week.
Chat
Email
Call Me