フッターコンテンツにスキップ
IRONXLの使用

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

.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 Interop IronXL
オフィスへのインストールが必要です はい、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、CSV XLSX、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パッケージ マネージャー コンソールを開き、次を実行します。

Install-Package IronXL
dotnet add package IronXL
Install-Package IronXL
dotnet add package IronXL
SHELL

IronXLは.NET Framework 4.6.2以降および.NET 10までのすべての最新.NETバージョンをサポートしています。インストール後、ファイルの先頭にusing IronXL;を追加すれば、エクスポートの準備が整います。

C#でInteropを使用して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);
}
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);
}
Imports Microsoft.Office.Interop.Excel
Imports System.Data
Imports System.Runtime.InteropServices

' Create a sample DataTable with employee data
Dim dt As New DataTable("Employees")
dt.Columns.Add("EmployeeID", GetType(Integer))
dt.Columns.Add("Name", GetType(String))
dt.Columns.Add("Department", GetType(String))
dt.Columns.Add("Salary", GetType(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
Dim excelApp As New Application With {
    .Visible = False,
    .DisplayAlerts = False
}

Dim workbook As Workbook = excelApp.Workbooks.Add()
Dim worksheet As Worksheet = CType(workbook.ActiveSheet, Worksheet)

Try
    ' Write column headers to the first row
    For i As Integer = 0 To dt.Columns.Count - 1
        worksheet.Cells(1, i + 1) = dt.Columns(i).ColumnName
    Next

    ' Write data rows starting from row 2
    For i As Integer = 0 To dt.Rows.Count - 1
        For j As Integer = 0 To dt.Columns.Count - 1
            worksheet.Cells(i + 2, j + 1) = dt.Rows(i)(j).ToString()
        Next
    Next

    Dim filePath As String = "C:\Reports\EmployeeReport_Interop.xlsx"
    workbook.SaveAs(filePath)
    Console.WriteLine("Excel file created using Interop.")
Catch ex As Exception
    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)
End Try
$vbLabelText   $csharpLabel

Application オブジェクトは、Excel プロセス自体を表します。 Visible = false を設定すると、処理中に Excel が画面上に開かなくなります。これはバックグラウンド処理に不可欠です。 DisplayAlerts = false 設定は、自動化されたワークフローを中断させる可能性のあるダイアログボックスを抑制します。

finally ブロックは省略できません。各 COM オブジェクトを Marshal.ReleaseComObject を使用して明示的に解放する必要があります。 この手順を省略すると、タスクマネージャーに孤立した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.");
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.");
Imports IronXL
Imports System.Data

' Create a sample DataTable
Dim dt As New DataTable("Employees")
dt.Columns.Add("EmployeeID", GetType(Integer))
dt.Columns.Add("Name", GetType(String))
dt.Columns.Add("Department", GetType(String))
dt.Columns.Add("Salary", GetType(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
Dim workbook As WorkBook = WorkBook.Create(ExcelFileFormat.XLSX)
Dim sheet As WorkSheet = workbook.CreateWorkSheet("Employees")

' Write column headers to row 0
For i As Integer = 0 To dt.Columns.Count - 1
    sheet.SetCellValue(0, i, dt.Columns(i).ColumnName)
Next

' Export DataTable rows to Excel cells
For i As Integer = 0 To dt.Rows.Count - 1
    For j As Integer = 0 To dt.Columns.Count - 1
        sheet.SetCellValue(i + 1, j, dt.Rows(i)(j))
    Next
Next

Dim filePath As String = "C:\Reports\EmployeeReport_IronXL.xlsx"
workbook.SaveAs(filePath)
Console.WriteLine("Excel file created using IronXL.")
$vbLabelText   $csharpLabel

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

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

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

InteropとIronXLを使用してC#でDataTableをExcelにエクスポートする方法:画像1 - Excel出力

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

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

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

実稼働環境のアプリケーションでは、あらゆるデータを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.");
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.");
Imports IronXL
Imports IronXl.Styles
Imports System
Imports System.Data
Imports System.IO

' --- ExcelExporter helper ---

Function ExportToExcel(dt As DataTable, filePath As String) As Boolean
    If dt Is Nothing OrElse dt.Rows.Count = 0 Then
        Return False
    End If

    Try
        Dim workbook As WorkBook = WorkBook.Create(ExcelFileFormat.XLSX)
        Dim sheet As WorkSheet = workbook.CreateWorkSheet(If(dt.TableName, "Sheet1"))

        ' Bold headers in the first row
        For i As Integer = 0 To dt.Columns.Count - 1
            Dim cell = sheet.GetCellAt(0, i)
            cell.Value = dt.Columns(i).ColumnName
            cell.Style.Font.Bold = True
        Next

        ' Data rows
        For i As Integer = 0 To dt.Rows.Count - 1
            For j As Integer = 0 To dt.Columns.Count - 1
                Dim value = dt.Rows(i)(j)
                sheet.SetCellValue(i + 1, j, If(value Is DBNull.Value OrElse value Is Nothing, "", value))
            Next
        Next

        Dim fileInfo As New FileInfo(filePath)
        If Not fileInfo.Directory.Exists Then
            fileInfo.Directory.Create()
        End If

        workbook.SaveAs(filePath)
        Return True
    Catch ex As Exception
        Console.WriteLine("Export failed: " & ex.Message)
        Return False
    End Try
End Function

' --- Usage ---

Dim employees As New DataTable("Employees")
employees.Columns.Add("EmployeeID", GetType(Integer))
employees.Columns.Add("Name", GetType(String))
employees.Columns.Add("Department", GetType(String))
employees.Rows.Add(1, "John Smith", "Engineering")
employees.Rows.Add(2, "Sarah Johnson", "Marketing")

Dim success As Boolean = ExportToExcel(employees, "C:\Reports\Export.xlsx")
Console.WriteLine(If(success, "Export completed.", "Export failed."))
$vbLabelText   $csharpLabel

ExportToExcel ヘルパーは任意の DataTable とファイルパス文字列を受け取り、エクスポートが失敗した場合、またはテーブルが空の場合は false を返します。 セルに書き込む前に DBNull.Value をチェックすることで、欠損値を適切に処理します。 ディレクトリ作成の手順により、新しいフォルダー パスへのスケジュールされたエクスポートが中断されるのを防ぎます。これは、新しい環境にデプロイする際によく発生する本番環境の問題です。

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

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

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

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.");
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.");
Imports IronXL
Imports IronXl.Styles
Imports System.Data

Dim dt As New DataTable("Sales")
dt.Columns.Add("Product", GetType(String))
dt.Columns.Add("Revenue", GetType(Decimal))
dt.Rows.Add("Widget A", 15000.50D)
dt.Rows.Add("Widget B", 22500.75D)

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

' Write headers with light blue background and bold font
For i As Integer = 0 To dt.Columns.Count - 1
    Dim 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
Next

' Write data rows
For i As Integer = 0 To dt.Rows.Count - 1
    For j As Integer = 0 To dt.Columns.Count - 1
        sheet.SetCellValue(i + 1, j, dt.Rows(i)(j))
    Next
Next

workbook.SaveAs("C:\Reports\FormattedReport_IronXL.xlsx")
Console.WriteLine("Formatted Excel file created.")
$vbLabelText   $csharpLabel

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

InteropとIronXLを使用してC#でDataTableをExcelにエクスポートする方法:画像3 - IronXL出力による書式設定

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

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

Interop の同等機能は、個々の Range オブジェクトにアクセスし、Interior.Color、および Borders.LineStyle などのプロパティを設定します。 各プロパティへのアクセスは COM プロセス間呼び出しであり、オーバーヘッドが増加し、Excel が応答しなくなった場合に例外が発生する可能性が高まります。色の値は System.Drawing.ColorTranslator.ToOle 変換が必要であり、すべてのスタイル設定ブロックの後には標準の COM クリーンアップ チェーン (最低 3 つの Marshal.ReleaseComObject 呼び出し) が続く必要があります。

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

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

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

命名規則とパス規則

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

エラーハンドリング

すべてのエクスポートロジックをtry-catchブロックで囲み、例外をログに記録して、障害の原因を特定できるように十分なコンテキストを提供する。 スケジュールされたエクスポートの場合、例外をスローするのではなく、結果オブジェクトを返すことを検討してください。そうすることで、呼び出し元のサービスはクラッシュすることなく再試行したり、オペレーターに警告を発したりすることができます。 上記のヘルパー関数 ExportToExcel は、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ファイルの読み込み数式の操作、複数のワークシートの管理など、その他のシナリオについても解説しています。

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

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

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

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

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

よくある質問

C# で DataTables をエクスポートする場合、Excel Interop ではなくIronXLを使用する主な利点は何ですか?

IronXL は、サーバー上に Excel をインストールする必要なく、C# で DataTables を Excel にエクスポートするための、よりシンプルで効率的な方法を提供します。

IronXL は、Excel にエクスポートするときに大きな DataTables を処理できますか?

はい、 IronXLはパフォーマンスが最適化されており、大規模な DataTables を処理できるため、Excel ファイルへの迅速かつ確実なエクスポートが保証されます。

IronXL を使用してデータをエクスポートするには、Microsoft Excel をインストールする必要がありますか?

いいえ、 IronXLでは Microsoft Excel をインストールする必要がないため、サーバー側アプリケーションに最適です。

Interop と比較して、 IronXLDataTables のエクスポート プロセスがどのように簡素化されますか?

IronXL は、Interop に関連する複雑なセットアップと依存関係を排除し、DataTables をエクスポートするための簡単な API を提供することでプロセスを簡素化します。

IronXL は、DataTables を Excel にエクスポートするために.NET Coreと互換性がありますか?

はい、 IronXL は.NET Coreと完全に互換性があり、クロスプラットフォーム アプリケーションで DataTables を Excel にエクスポートできます。

IronXL はDataTables をどのようなファイル形式でエクスポートできますか?

IronXL は、DataTables を XLSX、XLS、CSV などのさまざまな Excel ファイル形式にエクスポートできます。

IronXL はExcel シートのスタイルと書式設定をサポートしていますか?

はい、 IronXL は高度なスタイル設定と書式設定のオプションをサポートしており、DataTables から洗練された Excel シートを作成できます。

IronXL を使用して C# で Excel 関連のタスクを自動化できますか?

はい、 IronXL は、DataTables のエクスポートから複雑なデータ分析操作まで、Excel 関連の幅広いタスクを自動化するために使用できます。

IronXLを初めて使用する開発者にとって、学習曲線はありますか?

IronXLは直感的で簡単に習得できるように設計されており、開発者がすぐに作業を開始できるように、豊富なドキュメントと例が用意されています。

IronXL を商用プロジェクトで使用する場合のライセンス オプションは何ですか?

IronXL は、商用利用のための永久ライセンスやサブスクリプション ライセンスなど、さまざまなプロジェクトのニーズに合わせてさまざまなライセンス オプションを提供します。

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

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

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

アイアンサポートチーム

私たちは週5日、24時間オンラインで対応しています。
チャット
メール
電話してね