IRONSOFTWAREHOME
IRONXLの使用

Interop とIronXLを使用して C# で DataTable を Excel にエクスポートする方法

Curtis Chau
Curtis Chau
Updated: 2026年6月28日

.NET開発者にとって、データテーブルをExcelにエクスポートすることが重要なのはなぜですか?

データベースやアプリケーションからExcelファイルにデータをエクスポートすることは、情報を効率的に分析、視覚化、共有する必要のある組織にとって基本的な要件です。 Excelファイルは、そのユーザーフレンドリーなインターフェースで広く認知されており、エンドユーザーがデータを簡単に操作・解釈できる。 データセットを.xlsx形式に変換することで、開発者は受信者の技術的背景に関係なく、データがアクセス可能で適切に構造化されたままであることを保証します。

.NET開発者にとって、一般的なアプローチは2つあります。Microsoft Office Interopと、 IronXLなどの専用のExcelライブラリです。 このガイドでは、動作するC#コード例を用いて両方の方法を解説し、それぞれの長所と短所を比較し、本番環境のアプリケーションにおいてそれぞれの方法がどのような場合に適しているかを説明します。

InteropとIronXLの主な違いは何ですか?

コードを書き始める前に、これら2つのアプローチの根本的な違いを理解しておくことは、あらゆるプロジェクトにおいて適切な選択をするのに役立ちます。 この比較では、技術アーキテクチャ、導入要件、およびデータテーブルからExcelへのエクスポートシナリオを扱う際の実際の開発経験について検討します。

C# での Excel エクスポートにおける Microsoft Office Interop とIronXLの比較
特徴Microsoft Office InteropIronXL
オフィスへのインストールが必要ですはい、Microsoft Excelをインストールする必要があります。いいえ -- スタンドアロンライブラリ
サーバーサイドサポートマイクロソフトは推奨していません完全サポート
プラットフォームサポートWindowsのみWindows、Linux、macOS、Azure
.NET Core / .NET 5 以降をサポート制限あり完全サポート(.NET 6、7、8、9、10)
リソース管理COMオブジェクトのクリーンアップが必要です標準 for .NET破棄
インストール方法COMリファレンス + OfficeインストールNuGet パッケージ
スレッドモデルシングルスレッドアパート(STA)スレッドセーフな操作
大規模データセットメモリを大量に消費するプロセス効率的なファイルベースのアプローチ
対応ファイル形式XLSX、XLS、CSVXLSX、XLS、CSV、JSON、XML
ライセンスOfficeライセンスが必要です商用ライセンス利用可能

アーキテクチャ上の違いは根本的です。Excel InteropはCOMを介してMicrosoft Excelアプリケーション自体を自動化するのに対し、 IronXLは外部プロセスを起動することなくExcelファイル形式を直接読み書きします。 この違いは、メモリ使用量から導入の複雑さまで、あらゆる面に影響を与える。

IronXLをExcelエクスポート用にインストールするにはどうすればよいですか?

IronXLのインストールはNuGet経由でわずか数秒で完了します。 追加のソフトウェア、Officeのインストール、システム設定は一切不要です。 このライブラリは、Windows、Linux、macOS(Azure App Services、Azure Functions、コンテナインスタンスを含む)にインストール後すぐに動作します。

NuGetパッケージ マネージャー コンソールを開き、次を実行します。

PM > Install-Package IronXL.Excel

IronXLは.NET Framework 4.6.2+とすべての最新 for .NETバージョンを.NET 10までサポートします。インストールが完了したら、ファイルの先頭にusing IronXL;を追加し、エクスポートの準備が整います。

Interopを使用してC#でDataTableをExcelにエクスポートする方法

従来のアプローチはMicrosoft.Office.Interop.Excel名前空間を使用してExcelを直接自動化します。 この方法では、コードを実行するマシンにMicrosoft Excelがインストールされている必要があります。

相互運用性の前提条件

Interopを使用する前に、以下の点を確認してください。

  1. 開発用マシンと展開用マシンにMicrosoft Excelがインストールされています。
  2. Visual Studio に"Microsoft Excel オブジェクト ライブラリ"への COM 参照が追加されます。
  3. プロジェクトにMicrosoft.Office.Interop.Excel名前空間が含まれています。

相互運用エクスポートコード

次のコードは、C#のトップレベルステートメントを使用して、Microsoft Office InteropでDataTableをExcelファイルにエクスポートする方法を示しています。

using Microsoft.Office.Interop.Excel;
using System.Data;
using System.Runtime.InteropServices;

// Create a sample DataTable with employee data
DataTable dt = new DataTable("Employees");
dt.Columns.Add("EmployeeID", typeof(int));
dt.Columns.Add("Name", typeof(string));
dt.Columns.Add("Department", typeof(string));
dt.Columns.Add("Salary", typeof(decimal));

dt.Rows.Add(1, "John Smith", "Engineering", 75000);
dt.Rows.Add(2, "Sarah Johnson", "Marketing", 65000);
dt.Rows.Add(3, "Michael Chen", "Finance", 70000);
dt.Rows.Add(4, "Emily Davis", "Engineering", 80000);

// Initialize Excel Application object
Application excelApp = new Application
{
    Visible = false,
    DisplayAlerts = false
};

Workbook workbook = excelApp.Workbooks.Add();
Worksheet worksheet = (Worksheet)workbook.ActiveSheet;

try
{
    // Write column headers to the first row
    for (int i = 0; i < dt.Columns.Count; i++)
    {
        worksheet.Cells[1, i + 1] = dt.Columns[i].ColumnName;
    }

    // Write data rows starting from row 2
    for (int i = 0; i < dt.Rows.Count; i++)
    {
        for (int j = 0; j < dt.Columns.Count; j++)
        {
            worksheet.Cells[i + 2, j + 1] = dt.Rows[i][j].ToString();
        }
    }

    string filePath = @"C:\Reports\EmployeeReport_Interop.xlsx";
    workbook.SaveAs(filePath);
    Console.WriteLine("Excel file created using Interop.");
}
catch (Exception ex)
{
    Console.WriteLine("Error: " + ex.Message);
}
finally
{
    // Always release COM objects to prevent orphaned Excel processes
    workbook.Close();
    excelApp.Quit();
    Marshal.ReleaseComObject(worksheet);
    Marshal.ReleaseComObject(workbook);
    Marshal.ReleaseComObject(excelApp);
}

ApplicationオブジェクトはExcelプロセス自体を表します。 Visible = falseを設定することで、処理中にExcelが画面に表示されるのを防ぎ、バックグラウンド操作には不可欠です。 DisplayAlerts = false設定は、そうでなければ自動化されたワークフローを中断させるダイアログボックスを抑制します。

Marshal.ReleaseComObjectを使用して各COMオブジェクトを明示的に解放する必要があります。 この手順を省略すると、タスクマネージャーに孤立したExcelプロセスが残り、メモリを消費し、最終的にはサーバーを不安定にする原因となります。 このクリーンアップパターンはよく知られた問題点であり、InteropがWebアプリケーションやサービスには適さない理由となっている。

IronXLを使用してデータテーブルをExcelにエクスポートするにはどうすればよいですか?

IronXLは、Officeのインストールが不要な最新の代替手段を提供します。 このライブラリはExcelファイルを直接読み書きできるため、サーバー環境、クラウド環境、クロスプラットフォームアプリケーションに最適です。 APIの詳細については、 IronXLの公式ドキュメント全文を参照してください。

IronXL輸出コード

次のコードは、IronXLライブラリを使用してトップレベルステートメントでDataTableをExcelファイルに変換する方法を示しています。

using IronXL;
using System.Data;

// Create a sample DataTable
DataTable dt = new DataTable("Employees");
dt.Columns.Add("EmployeeID", typeof(int));
dt.Columns.Add("Name", typeof(string));
dt.Columns.Add("Department", typeof(string));
dt.Columns.Add("Salary", typeof(decimal));

dt.Rows.Add(1, "John Smith", "Engineering", 75000);
dt.Rows.Add(2, "Sarah Johnson", "Marketing", 65000);
dt.Rows.Add(3, "Michael Chen", "Finance", 70000);
dt.Rows.Add(4, "Emily Davis", "Engineering", 80000);

// Create a new Excel workbook
WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLSX);
WorkSheet sheet = workbook.CreateWorkSheet("Employees");

// Write column headers to row 0
for (int i = 0; i < dt.Columns.Count; i++)
{
    sheet.SetCellValue(0, i, dt.Columns[i].ColumnName);
}

// Export DataTable rows to Excel cells
for (int i = 0; i < dt.Rows.Count; i++)
{
    for (int j = 0; j < dt.Columns.Count; j++)
    {
        sheet.SetCellValue(i + 1, j, dt.Rows[i][j]);
    }
}

string filePath = @"C:\Reports\EmployeeReport_IronXL.xlsx";
workbook.SaveAs(filePath);
Console.WriteLine("Excel file created using IronXL.");

IronXLのアプローチは、同様の論理構造を採用していますが、構文がより簡潔で、COMの複雑さもありません。 ExcelFileFormat.XLSXはExcel 2007以降と互換性のある最新のOffice Open XMLファイルを生成します。 このライブラリは、旧システム向けにXLSファイルもサポートしています。

SetCellValueは標準 for .NET慣例に合った0から始まるインデックスを使用し、インデックスシステム間の変換時に一般的に発生するオフバイワンエラーを減少させます。 このメソッドは型変換を自動的に処理します。整数、文字列、小数、およびDateTime値は適切なExcelセルタイプで書き込まれます。

クリーンアップコードが全くないことに注目してください。 IronXLオブジェクトは、ガベージコレクターが自動的に処理する標準的な.NETマネージドオブジェクトです。 孤立したプロセスやCOM参照カウントを管理するリスクはありません。

データテーブルをInterop対IronXLを使用してExcel C#にエクスポートする方法: 画像1 - Excel出力

データテーブルをInterop対IronXLを使用してExcel C#にエクスポートする方法: 画像2 - コンソール出力

ワークブックの作成に関する詳細については、 IronXLのスプレッドシート作成ガイドを参照してください。

再利用可能なエクスポート方法を作成するにはどうすればよいですか?

プロダクションアプリケーションは、任意のDataTableをExcelファイルにエクスポートできる再利用可能なメソッドを必要とすることがよくあります。次の例は、エクスポートロジックをカプセル化し、null値を処理し、出力ディレクトリが存在しない場合は自動的に作成するヘルパーを示しています。IronXL例のページでさらに多くのパターンを参照してください。

再利用可能なIronXLエクスポートヘルパー

using IronXL;
using IronXL.Styles;
using System;
using System.Data;
using System.IO;

// --- ExcelExporter helper ---

bool ExportToExcel(DataTable dt, string filePath)
{
    if (dt == null || dt.Rows.Count == 0)
        return false;

    try
    {
        WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLSX);
        WorkSheet sheet = workbook.CreateWorkSheet(dt.TableName ?? "Sheet1");

        // Bold headers in the first row
        for (int i = 0; i < dt.Columns.Count; i++)
        {
            var cell = sheet.GetCellAt(0, i);
            cell.Value = dt.Columns[i].ColumnName;
            cell.Style.Font.Bold = true;
        }

        // Data rows
        for (int i = 0; i < dt.Rows.Count; i++)
        {
            for (int j = 0; j < dt.Columns.Count; j++)
            {
                var value = dt.Rows[i][j];
                sheet.SetCellValue(
                    i + 1, j,
                    (value == DBNull.Value || value == null) ? "" : value
                );
            }
        }

        FileInfo fileInfo = new FileInfo(filePath);
        if (!fileInfo.Directory!.Exists)
            fileInfo.Directory.Create();

        workbook.SaveAs(filePath);
        return true;
    }
    catch (Exception ex)
    {
        Console.WriteLine("Export failed: " + ex.Message);
        return false;
    }
}

// --- Usage ---

DataTable employees = new DataTable("Employees");
employees.Columns.Add("EmployeeID", typeof(int));
employees.Columns.Add("Name", typeof(string));
employees.Columns.Add("Department", typeof(string));
employees.Rows.Add(1, "John Smith", "Engineering");
employees.Rows.Add(2, "Sarah Johnson", "Marketing");

bool success = ExportToExcel(employees, @"C:\Reports\Export.xlsx");
Console.WriteLine(success ? "Export completed." : "Export failed.");

falseを返します。 それは、セルを書き込む前にDBNull.Valueをチェックすることによって、欠落している値をうまく処理します。 ディレクトリ作成ステップは、DirectoryNotFoundExceptionが新しいフォルダパスへのスケジュールドエクスポートを妨げるのを防ぎます - これは新しい環境にデプロイする際の一般的な生産問題です。

太字のヘッダーはcell.Style.Font.Bold = trueを使用して適用され、追加設定なしでプロフェッショナルな外観の出力を生成します。 このパターンは簡単に拡張できます。背景色、枠線、列幅の自動調整などを追加して、組織のレポート作成基準に合わせることができます。

大規模なデータセットを扱う場合、 IronXLのパフォーマンスガイドでは、メモリ割り当てを最小限に抑える一括書き込み戦略について解説しています。 ライブラリは、単一のワークブック内の複数のワークシートに関連するDataSetのエクスポートもサポートしており、複数シートレポートに便利です。

両方のアプローチは、セルの書式設定をどのように処理するのでしょうか?

ProfessionalExcelエクスポートでは、多くの場合、太字の見出し、色付きのセル、罫線、数値形式などの書式設定が必要になります。 どちらのライブラリもスタイル設定をサポートしていますが、その実装は冗長性や信頼性の点で大きく異なります。

IronXLによるフォーマット

using IronXL;
using IronXL.Styles;
using System.Data;

DataTable dt = new DataTable("Sales");
dt.Columns.Add("Product", typeof(string));
dt.Columns.Add("Revenue", typeof(decimal));
dt.Rows.Add("Widget A", 15000.50m);
dt.Rows.Add("Widget B", 22500.75m);

WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLSX);
WorkSheet sheet = workbook.CreateWorkSheet("Sales");

// Write headers with light blue background and bold font
for (int i = 0; i < dt.Columns.Count; i++)
{
    var cell = sheet.GetCellAt(0, i);
    cell.Value = dt.Columns[i].ColumnName;
    cell.Style.Font.Bold = true;
    cell.Style.SetBackgroundColor("#ADD8E6");
    cell.Style.BottomBorder.SetColor("#000000");
    cell.Style.BottomBorder.Type = BorderType.Thin;
}

// Write data rows
for (int i = 0; i < dt.Rows.Count; i++)
{
    for (int j = 0; j < dt.Columns.Count; j++)
    {
        sheet.SetCellValue(i + 1, j, dt.Rows[i][j]);
    }
}

workbook.SaveAs(@"C:\Reports\FormattedReport_IronXL.xlsx");
Console.WriteLine("Formatted Excel file created.");

IronXLのスタイリングAPIは、クリーンなオブジェクトモデルを採用しています。 色値は#ADD8E6(ライトブルー)のような標準の16進コードを受け入れるため、色システム間で変換することなく企業ブランドに合わせることが簡単です。 BorderType.Thickは、列挙ルックアップを必要とせずに標準の境界線シナリオをカバーします。

データテーブルをInterop対IronXLを使用してExcel C#にエクスポートする方法: 画像3 - IronXL出力でのフォーマット

数値形式、条件付き書式、セル結合など、すべてのスタイル設定オプションについては、 IronXL のセルスタイル設定ガイドおよび罫線と配置に関するドキュメントを参照してください。

相互運用フォーマットの複雑さ

Interopの同等品は、個々のBorders.LineStyleなどのプロパティを設定します。 各プロパティアクセスはCOMプロセス間呼び出しであり、オーバーヘッドを増加させ、Excelが応答しなくなった場合に例外の可能性を高めます。色値はSystem.Drawing.ColorTranslator.ToOle変換が必要で、すべてのスタイリングブロックは標準のCOMクリーンアップチェーン - 最低でも3回のMarshal.ReleaseComObject呼び出し - に従う必要があります。

この冗長性は、条件付き書式、列幅、または数値形式を大規模なワークシート全体に適用する際に問題となる。 IronXLは、より少ないコード行数で同様のシナリオに対応し、クラッシュ後にExcelプロセスが実行状態のままになるリスクもありません。

.NETにおけるExcelエクスポートのベストプラクティスとは?

エクスポートルーチン全体で一貫した手順に従うことで、バグが減り、保守性が向上し、コードのテストとデプロイが容易になります。

命名規則とパス規則

エクスポートされたファイルに一貫した命名規則を使用してください: {ReportName}_{Timestamp}.xlsx。 予測可能なファイル名は、自動的なクリーンアップとアーカイブを容易にします。 ハードコードされたパスを使うのではなく、出力ディレクトリをアプリケーション設定に保存します - これは新しい環境にデプロイする際のDirectoryNotFoundExceptionを防ぎます。

エラーハンドリング

すべてのエクスポートロジックをtry-catchブロックで囲み、例外をログに記録して、障害の原因を特定できるように十分なコンテキストを提供する。 スケジュールされたエクスポートの場合、例外をスローするのではなく、結果オブジェクトを返すことを検討してください。そうすることで、呼び出し元のサービスはクラッシュすることなく再試行したり、オペレーターに警告を発したりすることができます。 上記のboolの戻り値を持つこのパターンを示しています。

大規模データセットの取り扱い

5万行を超えるデータセットの場合は、メモリ負荷を軽減するためにデータをバッチ処理でストリーミングしてください。 IronXLはプログレッシブ書き込みをサポートしており、 OpenXML SDKは非常に大きなファイル向けに低レベルのストリーミング機能を提供します。 大規模なデータセットにはInteropを一切使用しない方が良いでしょう。そのインメモリモデルは、大規模なデータセットでは著しい処理速度低下を引き起こします。

クロスプラットフォームデプロイメント

アプリケーションがLinuxまたはmacOS上で動作する場合(例えば、DockerコンテナやAzure Linux App Services内など)、 IronXLが唯一の選択肢となります。InteropはExcel COMサーバーに依存するため、Windows以外の環境では機能しません。 .NETクロスプラットフォーム展開ガイドを使用して、ターゲットランタイムですべての依存関係が利用可能であることを確認してください。

テスティング

エクスポートロジックの単体テストでは、出力ファイルが存在すること、期待される行数が含まれていること、および正しい列名が使用されていることを検証する必要があります。 IronXLのWorkBook.Loadメソッドは、テストでExcelを起動せずにエクスポートされたファイルを簡単に読み戻すことができます。 例については、IronXLのリーディングガイドを参照してください。

それぞれの方法をいつ選択すべきか?

最適な選択は、プロジェクトの具体的な要件、導入環境、および長期的な保守に関する考慮事項によって異なります。

Microsoft Office Excel Interop を選択する場合:

  • 既に相互運用性に依存しているレガシーシステムとの連携や移行は現実的ではありません。 マクロ、ピボットテーブル、グラフの自動化などの高度なExcel機能を使用するには、完全なExcelアプリケーションオブジェクトモデルが必要です。
  • ユーザーがMicrosoft Excelをインストールしている環境で、対話的に動作するデスクトップアプリケーションを構築する。 展開環境は完全に管理されており、Windowsのみで構成され、Officeライセンスは既に導入済みです。 ・複雑な埋め込み数式やVBAコードを含む既存のExcelテンプレートを自動化する。

IronXLをお選びください:

  • Excelファイルのエクスポートを生成するWebアプリケーション、REST API、またはバックグラウンドサービスを構築する。
  • Azure App Services 、AWS Lambda、Dockerコンテナなどのクラウド環境へのデプロイ。 Windows、Linux、macOSのいずれのプラットフォームにも対応するクロスプラットフォームサポートが必要です。
  • .NET Framework 4.6.2以降、または相互運用サポートが制限されている最新 for .NETバージョンでの作業。 COMクリーンアップの心配をせずに、信頼性の高いリソース管理を実現する必要があります。
  • 本番サーバーにおけるOfficeライセンスへの依存を回避する。
  • 独立したExcelファイル生成が必要なマルチテナントアプリケーションの構築。 COMプロセス間通信のオーバーヘッドなしに、大規模なデータセットを効率的に処理します。
  • XLSX、XLS、CSV、JSON、XMLなど、複数の形式へのエクスポートが必要です。

IronXLのチュートリアルでは、既存のExcelファイルの読み込み数式の操作、複数のワークシートの管理など、その他のシナリオについても解説しています。

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

ExcelファイルへのDataTableのエクスポートは、ビジネスデータを操作する.NETアプリケーションにとって基本的な要件です。 ソースがデータベースクエリ、DataSet内の複数の関連テーブル、または動的に構築されたメモリ内コレクションであっても、適切なライブラリ選択はデプロイメントの柔軟性と長期的な保守性を決定します。

Microsoft Office Excel Interopは長年にわたり開発者に利用されてきましたが、Officeのインストールへの依存、COMの複雑さ、サポートされていないサーバーシナリオ、リソース管理の課題などにより、現代のアプリケーション開発においてはますます実用的ではなくなってきています。

IronXLは、これらの制約を解消する、よりクリーンな代替手段を提供します。 NuGetによる簡単なインストール、Windows、Linux、macOSを網羅するクロスプラットフォームサポート、そして.NETの慣例に準拠した分かりやすいAPIにより、Excel相互運用ソリューションにつきものの導入の煩雑さやリソース管理上の落とし穴を解消します。

始めるには、NuGetからIronXLをインストールし、上記のコード例の1つをコピーし、テストDataTableから迅速なエクスポートを実行します。 IronXLのクイックスタートガイドでは、最も一般的なシナリオを数分で解説しています。 本番環境への移行準備が整ったら、 IronXLのライセンスページを確認し、チームの規模と導入モデルに合ったオプションを選択してください。 さらに詳しく知りたい場合は、 IronXL APIリファレンス全体と、コミュニティのサンプルが掲載されているIronXL GitHubリポジトリを参照してください。

Curtis Chau
テクニカルライター

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

...
詳しく読む

関連する記事

Key in blue circle

無料の30日間トライアルキーをすぐに入手してください。

Your trial license will be sent to your email address

制限なし。100% ロック解除済み。クレジットカード不要。

bullet_checkedクレジットカードやアカウントの作成は不要です。制限なし。100% ロック解除済み。クレジットカード不要。
  • Logo Aetna
  • Logo NASA
  • Logo GE
  • Logo Porsche
  • Logo USDA
  • Logo Qatar
Join Millions of Engineers who’ve tried IronPDF
無料のライブデモを予約する
Booking Badge

世界中の数百万人のエンジニアから信頼されています。

ライセンスはより安く
義務のない相談を受ける
下記のフォームを記入するか、sales@ironsoftware.comにメールしてください。
あなたの詳細は常に守秘されます。
世界中の数百万人のエンジニアから信頼されています。
ライセンスはより安く
あなたの無料30日間の試用キーをすぐに入手。
クレジットカードやアカウントの作成は不要です。