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

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

Excelファイルへのデータのエクスポートの概要

データベースまたはアプリケーションから Excel ファイルにデータをエクスポートすることは、情報を効率的に分析、視覚化、共有する必要がある組織にとって基本的な要件です。 Excel ファイルはユーザーフレンドリーなインターフェースを備えているため、ユーザーがデータを操作したり解釈したりすることが簡単にでき、広く認識されています。 データセットを .XLSX 形式に変換することで、開発者はユーザーの技術的背景に関係なく、データがアクセス可能かつ構造化された状態を維持することを保証します。 このプロセスは、元のデータセットの整合性を維持するだけでなく、システム間でシームレスなデータ転送も可能にします。 これを実現するために、開発者はIronXL、EPPlus、NPOI、ClosedXMLといった様々なExcelライブラリを活用できます。これらのライブラリを利用することで、サーバーやクライアントマシンにMicrosoft Excelをインストールすることなく、Excelファイルをプログラムで作成、読み取り、操作できます。これらのライブラリを利用することで、ユーザーはExcel形式でプロフェッショナルなレポートやデータエクスポートを作成でき、幅広いビジネスニーズや分析ニーズに対応できます。

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

コードに取り組む前に、これら 2 つのアプローチの基本的な違いを理解しておくと、あらゆるプロジェクトで適切な選択を行うのに役立ちます。 比較には、DataTable から Excel へのエクスポート シナリオを扱う際の技術アーキテクチャ、展開要件、および実際の開発経験が含まれます。

特徴Microsoft Office 相互運用性アイアンXL
Officeのインストールが必要はい – Microsoft Excel がインストールされている必要がありますいいえ – スタンドアロンライブラリ
サーバーサイドサポートMicrosoft では推奨されていません完全にサポートされています
プラットフォームサポートWindowsのみWindows、Linux、macOS、Azure
.NET Core/.NET 5+ のサポート限定完全サポート(.NET 6、7、8、9、10)
リソース管理COMオブジェクトのクリーンアップが必要標準的な.NETの廃棄
インストール方法COM リファレンス + Office インストールNuGet 経由でパッケージをインストールする
スレッドモデルシングルスレッドアパートメント(STA)スレッドセーフな操作
大規模データセットメモリを大量に消費するプロセス効率的なファイルベースのアプローチ
ファイル形式XLSX、XLS、CSVXLSX、XLS、CSV、JSON、XML
ライセンスOfficeライセンスが必要です商用ライセンス利用可能

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

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

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

前提条件

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

  1. 開発マシンと展開マシンにMicrosoft Excelがインストールされている
  2. Visual Studioで"Microsoft Excel Object Library"へのCOM参照を追加します。
  3. Microsoft.Office.Interop.Excel名前空間を含める

相互運用コードの例

次のコードは、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));

// Fill the DataTable with sample rows
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
};

// Create new Workbook and get the active Worksheet
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();
        }
    }
    // Define file path and save the Excel file
    string filePath = @"C:\Reports\EmployeeReport_Interop.xlsx";
    workbook.SaveAs(filePath);
    Console.WriteLine("Excel file created successfully using Interop.");
}
catch (Exception ex)
{
    Console.WriteLine("Error exporting data to Excel: " + ex.Message);
}
finally
{
    // Close workbook and quit Excel application
    workbook.Close();
    excelApp.Quit();
    // Critical: Release COM objects to prevent memory leaks
    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));

// Fill the DataTable with sample rows
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
};

// Create new Workbook and get the active Worksheet
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();
        }
    }
    // Define file path and save the Excel file
    string filePath = @"C:\Reports\EmployeeReport_Interop.xlsx";
    workbook.SaveAs(filePath);
    Console.WriteLine("Excel file created successfully using Interop.");
}
catch (Exception ex)
{
    Console.WriteLine("Error exporting data to Excel: " + ex.Message);
}
finally
{
    // Close workbook and quit Excel application
    workbook.Close();
    excelApp.Quit();
    // Critical: Release COM objects to prevent memory leaks
    Marshal.ReleaseComObject(worksheet);
    Marshal.ReleaseComObject(workbook);
    Marshal.ReleaseComObject(excelApp);
}
$vbLabelText   $csharpLabel

このコードは、Microsoft Interopを使用してDataTableをExcelファイルにエクスポートするための完全なワークフローを示しています。このプロセスは、従業員情報(ビジネスアプリケーションでよく使用されるID、名前、部門、給与の4つのデータ型を表す列)を含むdtという名前の新しいDataTableを作成することから始まります。

Applicationオブジェクトは、Excel プロセス自体を表します。 Visible = falseに設定すると、処理中に Excel アプリケーションが画面に表示されなくなります。これはバックグラウンド操作に不可欠です。 DisplayAlerts = false設定により、ユーザーがエクスポートを実行するときに自動ワークフローを中断する可能性のあるダイアログ ボックスが抑制されます。

WorkbookWorksheetオブジェクトは、Excel のファイル構造に直接対応します。 ワークブックはExcelファイル自体(.XLSXまたは.XLS形式)であり、ワークシートはそのファイル内の個々のシートタブです。このコードでは、 workbook.ActiveSheetを使用して、新しいワークブックごとに作成されるデフォルトのシートへの参照を取得しています。

IronXL を使用して DataTable を Excel にエクスポートする方法

IronXL は、Office をインストールしなくても動作する最新の代替手段を提供します。 このライブラリは Excel ファイルを直接読み書きするため、サーバー環境、クラウド展開、クロスプラットフォーム アプリケーションに適しています。

前提条件

NuGet パッケージ マネージャー コンソール経由で IronXL をインストールします。

Install-Package IronXL.Excel
Install-Package IronXL.Excel
SHELL

または.NET CLIを使用します:

dotnet add package IronXL.Excel
dotnet add package IronXL.Excel
SHELL

追加のソフトウェア、Office のインストール、システム構成は必要ありません。 ライブラリは、Windows、Linux、macOS にインストールするとすぐに動作します。 Azure デプロイの場合、IronXL は特別な構成なしで App Services、Functions、およびコンテナー インスタンスで実行されます。 このライブラリは、.NET Framework 4.6.2 以降と、.NET 6、7、8、9、10 を含むすべての最新の .NET バージョンをサポートしています。

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));

// Fill DataTable with rows of data
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 and worksheet
WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLSX);
WorkSheet sheet = workbook.CreateWorkSheet("Employees");

// Write column names to the first row as headers
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]);
    }
}

// Save to file path as xlsx format
string filePath = @"C:\Reports\EmployeeReport_IronXL.xlsx";
workbook.SaveAs(filePath);
Console.WriteLine("Excel file created successfully 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));

// Fill DataTable with rows of data
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 and worksheet
WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLSX);
WorkSheet sheet = workbook.CreateWorkSheet("Employees");

// Write column names to the first row as headers
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]);
    }
}

// Save to file path as xlsx format
string filePath = @"C:\Reports\EmployeeReport_IronXL.xlsx";
workbook.SaveAs(filePath);
Console.WriteLine("Excel file created successfully using IronXL.");
$vbLabelText   $csharpLabel

IronXL のアプローチは同様の論理構造に従いますが、構文がより明確で、COM の複雑さがありません。 この Excel ライブラリを使用すると、開発者は Microsoft Office に依存せずにスプレッドシート ファイルを作成、読み取り、書き込みできます。 WorkBook.Createメソッドは、指定された形式で新しいブックを初期化します。ExcelFileFormat.XLSX ExcelFileFormat.XLSX 、Excel 2007 以降と互換性のある最新の Office Open XML ファイルを生成しますが、ライブラリは従来のシステム用の XLS 形式もサポートしています。

出力

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

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

CreateWorkSheetメソッドは、指定されたテーブル名を持つ新しいワークシートをブックに追加します。 最初にアプリケーション オブジェクトを操作する Interop とは異なり、IronXL はファイル構造を直接操作します。 ユーザーがファイルを開くと、Excel の下部にあるタブにシート名が表示されます。

セルへのデータ入力にはSetCellValue使用します。これは行インデックス、列インデックス、および書き込む値を受け取ります。Excel Interop の 1 から始まるインデックスとは異なり、IronXL は .NET Framework の標準規則に準拠した 0 から始まるインデックスを使用します。つまり、行 0 が最初の行、列 0 が最初の列です。 他の .NET コレクションおよびDataTable列とのこの一貫性により、認知負荷が軽減され、インデックス システム間の変換時に頻繁に発生する off-by-one エラーが排除されます。

このメソッドは、型変換を自動的かつインテリジェントに処理します。 整数、文字列、小数、および日付時刻の値は、適切な Excel セル書式を使用して書き込まれます。 小数値は数式に使用できる数値として表示されますが、日付値は dd/mm/yyyy またはその他の地域形式としてフォーマットできます。 ライブラリは例外をスローせずに null 値と欠損データを適切に処理します。

クリーンアップ コードがまったく存在しないことに注意してください。 IronXL オブジェクトは、ガベージ コレクターが自動的に処理する標準の .NET 管理オブジェクトです。 孤立したプロセスのリスクはなく、COM 参照カウントを管理する必要もなく、不適切な破棄パターンによるメモリ リークもありません。 この簡素化だけで、Excel Interop ソリューションを悩ませる一連のバグがすべて解消されます。

IronXL の Excel 作成機能の詳細については、スプレッドシートの作成に関するドキュメントを参照してください。

再利用可能なエクスポート メソッドを作成するにはどうすればよいでしょうか?

実稼働アプリケーションでは、任意のDataTable Excelファイルにエクスポートできる再利用可能なメソッドが必要になることがよくあります。次のコード例は、エクスポートロジックをカプセル化し、ボタンクリックなどのイベントハンドラーからobject senderパラメータを使用して呼び出すことができるヘルパークラスを示しています。

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

using IronXL;
using System.Data;
using System.IO;
using System;
public class ExcelExporter
{
    /// <summary>
    /// Export a DataTable to Excel file at the specified path
    /// </summary>
    public static bool ExportToExcel(DataTable dt, string filePath)
    {
        if (dt == null || dt.Rows.Count == 0)
            return false;
        try
        {
            // Create new workbook and worksheet
            WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLSX);
            WorkSheet sheet = workbook.CreateWorkSheet(dt.TableName ?? "Sheet1");
            // Write column names as 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;
            }
            // Fill cells with data values from each row
            for (int i = 0; i < dt.Rows.Count; i++)
            {
                for (int j = 0; j < dt.Columns.Count; j++)
                {
                    var value = dt.Rows[i][j];
                    // Handle missing or null values
                    if (value == DBNull.Value || value == null)
                        sheet.SetCellValue(i + 1, j, "");
                    else
                        sheet.SetCellValue(i + 1, j, value);
                }
            }
            // Validate file path and save
            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;
        }
    }
    /// <summary>
    /// Query a DataTable and export filtered results
    /// </summary>
    public static DataTable FilterAndExport(DataTable dt, string filterExpression, string filePath)
    {
        if (dt == null)
            return dt;
        // Create filtered view and export
        DataRow[] filteredRows = dt.Select(filterExpression);
        DataTable filteredTable = dt.Clone();
        foreach (DataRow row in filteredRows)
        {
            filteredTable.ImportRow(row);
        }
        ExportToExcel(filteredTable, filePath);
        return filteredTable;
    }
    /// <summary>
    /// Export DataTable to CSV file as an alternative format
    /// </summary>
    public static string ExportToCsv(DataTable dt)
    {
        StringBuilder sb = new StringBuilder();
        // Write column headers
        string[] columnNames = dt.Columns.Cast<DataColumn>().Select(column => column.ColumnName).ToArray();
        sb.AppendLine(string.Join(",", columnNames));
        // Write data rows
        foreach (DataRow row in dt.Rows)
        {
            string[] values = row.ItemArray.Select(field => field?.ToString() ?? "").ToArray();
            sb.AppendLine(string.Join(",", values));
        }
        return sb.ToString();
    }
}
// Usage example in Windows Forms or WPF event handler
public void ExportButton_Click(object sender, EventArgs e)
{
    DataTable dt = GetEmployeeData(); // Your data source
    string filePath = @"C:\Reports\Export.xlsx";
    bool success = ExcelExporter.ExportToExcel(dt, filePath);
    if (success)
        Console.WriteLine("Export completed successfully");
}
using IronXL;
using System.Data;
using System.IO;
using System;
public class ExcelExporter
{
    /// <summary>
    /// Export a DataTable to Excel file at the specified path
    /// </summary>
    public static bool ExportToExcel(DataTable dt, string filePath)
    {
        if (dt == null || dt.Rows.Count == 0)
            return false;
        try
        {
            // Create new workbook and worksheet
            WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLSX);
            WorkSheet sheet = workbook.CreateWorkSheet(dt.TableName ?? "Sheet1");
            // Write column names as 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;
            }
            // Fill cells with data values from each row
            for (int i = 0; i < dt.Rows.Count; i++)
            {
                for (int j = 0; j < dt.Columns.Count; j++)
                {
                    var value = dt.Rows[i][j];
                    // Handle missing or null values
                    if (value == DBNull.Value || value == null)
                        sheet.SetCellValue(i + 1, j, "");
                    else
                        sheet.SetCellValue(i + 1, j, value);
                }
            }
            // Validate file path and save
            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;
        }
    }
    /// <summary>
    /// Query a DataTable and export filtered results
    /// </summary>
    public static DataTable FilterAndExport(DataTable dt, string filterExpression, string filePath)
    {
        if (dt == null)
            return dt;
        // Create filtered view and export
        DataRow[] filteredRows = dt.Select(filterExpression);
        DataTable filteredTable = dt.Clone();
        foreach (DataRow row in filteredRows)
        {
            filteredTable.ImportRow(row);
        }
        ExportToExcel(filteredTable, filePath);
        return filteredTable;
    }
    /// <summary>
    /// Export DataTable to CSV file as an alternative format
    /// </summary>
    public static string ExportToCsv(DataTable dt)
    {
        StringBuilder sb = new StringBuilder();
        // Write column headers
        string[] columnNames = dt.Columns.Cast<DataColumn>().Select(column => column.ColumnName).ToArray();
        sb.AppendLine(string.Join(",", columnNames));
        // Write data rows
        foreach (DataRow row in dt.Rows)
        {
            string[] values = row.ItemArray.Select(field => field?.ToString() ?? "").ToArray();
            sb.AppendLine(string.Join(",", values));
        }
        return sb.ToString();
    }
}
// Usage example in Windows Forms or WPF event handler
public void ExportButton_Click(object sender, EventArgs e)
{
    DataTable dt = GetEmployeeData(); // Your data source
    string filePath = @"C:\Reports\Export.xlsx";
    bool success = ExcelExporter.ExportToExcel(dt, filePath);
    if (success)
        Console.WriteLine("Export completed successfully");
}
$vbLabelText   $csharpLabel

このヘルパー クラスは、本番環境ですぐに使用できるパターンをいくつか示します。 ExportToExcelメソッドは、任意のDataTableとファイル パス文字列を受け入れ、エクスポートが失敗した場合、またはテーブルが空の場合は false を返します。 このメソッドは、セルに書き込む前にDBNull.Valueをチェックすることで、欠損値を適切に処理します。

FilterAndExportメソッドは、エクスポート前にフィルター式を使用してDataTableクエリする方法を示します。これは、ユーザーが特定のレコードのみをエクスポートする必要がある場合に便利です。 このメソッドはフィルターされたDataTable返すため、呼び出し元のコードはそれを追加の処理に使用できます。

ExportToCsvメソッドは、 StringBuilderを使用して、Excel 形式の代替として CSV 出力を効率的に構築します。 IronXL は CSV エクスポートをネイティブに処理しますが、この例では教育目的で手動のアプローチを示します。

イベント ハンドラーの例では、これらのメソッドが、 object senderEventArgsが標準パラメーターである Windows フォームまたは WPF アプリケーションと統合される方法を示しています。 ClosedXML に精通している開発者の中にはnew XLWorkbook()を使用した同様のパターンを認識している人もいるかもしれませんが、IronXL の API は追加の形式サポートを備えた同等の機能を提供します。

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

プロフェッショナルな Excel エクスポートでは、太字のヘッダー、色付きのセル、境界線、数値の書式設定などの書式設定が必要になることがよくあります。 どちらのライブラリもスタイルをサポートしていますが、実装は大きく異なります。

Interopによるフォーマット

using Microsoft.Office.Interop.Excel;
using System.Data;
using System.Runtime.InteropServices;
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);
Application excelApp = new Application();
Workbook workbook = excelApp.Workbooks.Add();
Worksheet worksheet = (Worksheet)workbook.ActiveSheet;
// Write column headers with formatting to first row
for (int i = 0; i < dt.Columns.Count; i++)
{
    Range headerCell = worksheet.Cells[1, i + 1];
    headerCell.Value = dt.Columns[i].ColumnName;
    headerCell.Font.Bold = true;
    headerCell.Interior.Color = System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.LightBlue);
    headerCell.Borders.LineStyle = XlLineStyle.xlContinuous;
}
// Write data values to cells
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];
    }
}
string filePath = @"C:\Reports\FormattedReport_Interop.xlsx";
workbook.SaveAs(filePath);
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;
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);
Application excelApp = new Application();
Workbook workbook = excelApp.Workbooks.Add();
Worksheet worksheet = (Worksheet)workbook.ActiveSheet;
// Write column headers with formatting to first row
for (int i = 0; i < dt.Columns.Count; i++)
{
    Range headerCell = worksheet.Cells[1, i + 1];
    headerCell.Value = dt.Columns[i].ColumnName;
    headerCell.Font.Bold = true;
    headerCell.Interior.Color = System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.LightBlue);
    headerCell.Borders.LineStyle = XlLineStyle.xlContinuous;
}
// Write data values to cells
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];
    }
}
string filePath = @"C:\Reports\FormattedReport_Interop.xlsx";
workbook.SaveAs(filePath);
workbook.Close();
excelApp.Quit();
Marshal.ReleaseComObject(worksheet);
Marshal.ReleaseComObject(workbook);
Marshal.ReleaseComObject(excelApp);
$vbLabelText   $csharpLabel

Interop 書式設定コードは、個々のRangeオブジェクトにアクセスし、 Font.BoldInterior.ColorBorders.LineStyleなどのプロパティを設定します。 各プロパティ アクセスは COM プロセス間呼び出しであるため、オーバーヘッドが追加され、Excel が応答しなくなった場合に例外が発生する可能性が高くなります。

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 column headers with formatting to first row
for (int i = 0; i < dt.Columns.Count; i++)
{
    sheet.SetCellValue(0, i, dt.Columns[i].ColumnName);
    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 with values from DataTable
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\FormattedReport_IronXL.xlsx";
workbook.SaveAs(filePath);
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 column headers with formatting to first row
for (int i = 0; i < dt.Columns.Count; i++)
{
    sheet.SetCellValue(0, i, dt.Columns[i].ColumnName);
    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 with values from DataTable
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\FormattedReport_IronXL.xlsx";
workbook.SaveAs(filePath);
$vbLabelText   $csharpLabel

IronXL のスタイリング API は、.NET 開発者にとって馴染みのある、流暢で直感的な構文を使用します。 Styleプロパティは、クリーンなオブジェクト モデルを通じてフォント設定、背景色、境界線へのアクセスを提供します。 色の値は、 #ADD8E6 (水色) などの標準の 16 進コードを受け入れるため、カラー システム間で変換することなく、企業のブランドやデザイン仕様に簡単に合わせることができます。

出力

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

セル アクセサー構文sheet[row, col]使用すると、追加のオブジェクトや範囲参照を作成せずに、個々のセルに直接アクセスできます。 このアプローチにより、コードの冗長性が軽減され、COMベースのAPIに必要な形式的な記述が不要になります。同じセルに複数のスタイルプロパティを設定するのも簡単です。各プロパティの割り当てによってセルの外観が直接変更されます。

ボーダー構成は IronXL の実用的なデザインを示しています。 開発者は、ドキュメントの検索を必要とする列挙値を処理するのではなく、標準の境界線にはBorderType.Thin使用し、強調された境界線にはBorderType.Thick使用します。 SetColorメソッドは、背景色の指定との一貫性を維持しながら、境界線の色付けに 16 進カラー コードを受け入れます。

数値書式、条件付き書式、高度なスタイル設定テクニックなどの包括的な書式設定オプションについては、セル スタイル設定のドキュメント境界線の配置ガイドを参照してください。

輸出のベストプラクティス

Excel へのデータのスムーズで信頼性の高いエクスポートを確実に行うには、開発プロセス全体を通じてベスト プラクティスに従うことが重要です。 ファイル管理を簡単かつ予測可能にするために、エクスポートされた Excel ファイルには常に一貫したファイル パスと命名規則を使用します。 catch (Exception ex)などの使用によって例外をキャッチし、エクスポート中にエラーが発生した場合には false を返すか、意味のあるフィードバックを提供することで、堅牢なエラー処理を実装します。 大規模なデータセットの場合は、Microsoft Excel を自動化するオーバーヘッドなしで、高パフォーマンスかつメモリ効率の高い方法で Excel ファイルにデータを書き込むことができる OpenXML SDK の使用を検討してください。 ClosedXML などのライブラリはエクスポート プロセスをさらに簡素化し、コードが効率的に動作し、保守が容易になるようにする直感的な API を提供します。 これらのベスト プラクティスに従うことで、開発者は信頼性が高くスケーラブルなエクスポート ルーチンを作成し、データセットのサイズや複雑さに関係なく正確なデータを Excel ファイルに提供できます。

それぞれのアプローチをいつ選択すべきでしょうか?

DataTable データを Excel ファイルにエクスポートする必要がある場合、適切な選択は、プロジェクトの特定の要件、展開環境、および長期的なメンテナンスの考慮事項によって異なります。

次の場合は Microsoft Office Excel Interop を選択します。

  • 既に Office がインストールされており、相互運用性に依存しているレガシー システムでの作業
  • マクロ、ピボット テーブル、グラフ自動化などの 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 ファイルの読み取り数式の操作、複数のワークシートの管理など、一般的なシナリオをカバーする追加の例が提供されています。 ライブラリは、複数の関連テーブルを異なるシートにエクスポートする必要がある場合の DataSet オブジェクトの操作もサポートします。

結論

DataTable を Excel ファイルにエクスポートすることは、ビジネス データを処理する .NET アプリケーションの基本要件です。 データベース クエリからデータをエクスポートしたり、DataSet からレポートを作成したり、DataTable 列をフォーマットされた Excel シートに変換したりする必要がある場合、適切なライブラリを選択することが重要です。

Microsoft Office Excel Interop は長年にわたって開発者に役立ってきましたが、Office インストールへの依存、COM の複雑さ、サポートされていないサーバー シナリオ、リソース管理の課題により、最新のアプリケーション開発にはますます非実用的になっています。 COM クリーンアップ コードで満たされたcatch (Exception ex)ブロックや、参照の欠落に対する回避策などの問題は、よくある問題点です。

IronXL は、これらの制限に直接対処する、よりクリーンで信頼性の高い代替手段を提供します。 NuGet によるシンプルなInstall-Package 、Windows、Linux、macOS にまたがるクロスプラットフォーム サポート、および .NET Framework 規則に準拠した簡単な API により、Excel Interop ソリューションを悩ませる展開の悩みやリソース管理の落とし穴が解消されます。 この記事のコード例は、同じ DataTable から Excel へのエクスポート タスクを実行するには同様の開発作業が必要であることを示していますが、IronXL では運用上のオーバーヘッドやメンテナンスの負担なしに結果が得られます。

.NET プロジェクトで Excel ファイルの生成を簡素化する準備はできていますか? IronXL の無料トライアルを開始して、開発ワークフローの違いを体験してください。 実稼働展開とチーム ライセンスについては、組織のニーズに合ったライセンス オプションを検討してください。

よくある質問

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

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

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

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

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

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

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

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ボットを作成したりして、技術に対する愛情と創造性を組み合わせています。