フッターコンテンツにスキップ
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オブジェクトのクリーンアップが必要です 標準の.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

CODE-42949--@@オブジェクトは、Excelのプロセスそのものを表しています。 CODE-42950--@@を設定すると、処理中にExcelが画面上に開くのを防ぐことができます。 CODE-42951--@@設定は、自動化されたワークフローを中断させるダイアログボックスを抑制します。

CODE-42952--@@ブロックはオプションではなく、@@--CODE-42953--@を使用して各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.");
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の複雑さもありません。 CODE-42955--@@@メソッドは、指定されたフォーマットで新しいワークブックを初期化します--@--CODE-42956--@@は、Excel 2007以降と互換性のある最新のOffice Open XMLファイルを作成します。 このライブラリは、旧システム向けにXLSファイルもサポートしています。

CODE-42957--@@は、標準的な.NETの慣例に一致する0ベースのインデックスを使用しており、インデックスシステム間の変換時によく発生する1つ違いによるエラーを減らします。 整数、文字列、10進数、およびDateTime値は、適切なExcelのセルタイプで記述されます。

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

How to Export DataTable to Excel C# Using Interop vs IronXL: Image 1 - Excel Output.

How to Export DataTable to Excel C# Using Interop vs IronXL: Image 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.");
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

CODE-42960--@@ヘルパーは、任意のDataTableとファイルパス文字列を受け取り、エクスポートに失敗した場合やテーブルが空の場合はfalseを返します。 セルを書く前にDBNull.Valueをチェックすることで、欠落値を潔く処理します。 ディレクトリを作成するステップでは、新しいフォルダパスへのスケジュールされたエクスポートが中断されるのを防ぎます。

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

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

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

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進コードを受け入れるため、カラーシステム間で変換することなく、企業のブランディングに合わせることができます。 CODE-42969--@@とBorderType.Thickは、列挙検索を必要としない標準的なボーダーシナリオをカバーしています。

How to Export DataTable to Excel C# Using Interop vs IronXL: Image 3 - IronXL出力でフォーマットする.

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

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

Interopに相当するものは、個々の@--CODE-42971--@@オブジェクトにアクセスし、@--CODE-42972--@、@--CODE-42973--@、@--CODE-42974--@のようなプロパティを設定します。 各プロパティアクセスはCOMプロセス間呼び出しであるため、オーバーヘッドが追加され、Excelが応答しなくなった場合に例外が発生する可能性が高くなります。色の値にはSystem.Drawing.ColorTranslator.ToOle変換が必要であり、すべてのスタイリング・ブロックには標準的なCOMクリーンアップ・チェイン(最低でも3回のMarshal.ReleaseComObject呼び出し)が続かなければならない。

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

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

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

命名規則とパス規則

エクスポートされたファイルには、一貫した命名規則を使用してください:code-42977--@@。 予測可能なファイル名は、自動的なクリーンアップとアーカイブを容易にします。 新しい環境にデプロイするときに、パスをハードコーディングするのではなく、アプリケーションのコンフィギュレーションに出力ディレクトリを保存してください。

エラーハンドリング

すべてのエクスポートロジックを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以降、または相互運用サポートが制限されている最新の.NETバージョンでの作業。 COMクリーンアップの心配をせずに、信頼性の高いリソース管理を実現する必要があります。
  • 本番サーバーにおけるOfficeライセンスへの依存を回避する。
  • 独立したExcelファイル生成が必要なマルチテナントアプリケーションの構築。 COMプロセス間通信のオーバーヘッドなしに、大規模なデータセットを効率的に処理します。
  • XLSX、XLS、CSV、JSON、XMLなど、複数の形式へのエクスポートが必要です。

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

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

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

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

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

始めるには、NuGetからIronXLをインストールし、上記のコード例の一つをコピーし、テストからクイックエクスポートを実行してください。 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時間オンラインで対応しています。
チャット
メール
電話してね