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

IronXLを使用してC#でデータセットをExcelにエクスポート | Officeは不要

C# で DataSet または DataTable を Excel にエクスポートすると、構造化されたメモリ内データを、ターゲットマシンに Microsoft Office がインストールされているかどうかに関係なく、Professionalスプレッドシート ファイルに変換する信頼性の高い方法が提供されます。SQL データベースからレコードを取得する場合でも、プログラムで DataSet を構築する場合でも、既存の DataGrid を操作する場合でも、 IronXL はクリーンなコード優先の API を通じてパイプライン全体を処理します。 このガイドでは、トップレベルの C# ステートメントと.NET 10 を使用して、単一テーブルのエクスポートから複数シートのワークブック、ライブデータベースクエリの結果まで、すべての主要なシナリオについて説明します。

IronXLを一度インストールし、数行のコードを書くだけで、Officeに一切依存することなく、データがXLSXファイルに保存されます。 以下のセクションでは、インストール、基本パターン、高度なフォーマット、データベース統合について、ご自身のプロジェクトに直接コピー&ペーストできる形で解説しています。

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

エクスポートコードを記述する前に、 NuGetパッケージマネージャーを使用してIronXLをプロジェクトに追加してください。 プロジェクトのルートディレクトリでターミナルを開き、 .NET CLI コマンドを実行するか、Visual Studio のパッケージ マネージャー コンソールで Install-Package コマンドを使用します。

dotnet add package IronXl.Excel
# Or in Visual Studio Package Manager Console:
# Install-Package IronXl.Excel
dotnet add package IronXl.Excel
# Or in Visual Studio Package Manager Console:
# Install-Package IronXl.Excel
SHELL

インストール後、 IronXL名前空間をインポートするためのトップレベルのusingステートメントを追加します。

using IronXL;
using System.Data;
using IronXL;
using System.Data;
Imports IronXL
Imports System.Data
$vbLabelText   $csharpLabel

IronXLは、.NET 8、 .NET 9、 .NET 10に加え、それ以前 for .NET Frameworkバージョン(4.6.2以降)にも対応しています。 サーバー、デスクトップ、クラウドなど、どのマシンにもOfficeをインストールする必要はありません。 パッケージをインストールすると、XLSX、XLS、CSVファイルの作成、読み取り、書き込みをすべてマネージドコードで行うことができます。

詳細なインストールオプションについては、 IronXLのインストールガイドおよびバージョン履歴についてはNuGetパッケージページを参照してください。

単一のデータテーブルをExcelファイルにエクスポートするにはどうすればよいですか?

最も一般的なシナリオは、1つのデータテーブルを1つのワークシートにエクスポートすることです。 IronXL の WorkBook および WorkSheet クラスは、Excel オブジェクト モデルに自然にマッピングされます。 ワークブックを作成し、ワークシートを追加してから、データテーブルの列と行を反復処理します。

次の例では、メモリ内に従業員データテーブルを作成し、それを EmployeeData.xlsx に書き込みます。

using IronXL;
using System.Data;

// Build an in-memory DataTable
DataTable dt = new DataTable("Employees");
dt.Columns.Add("ID", typeof(int));
dt.Columns.Add("Name", typeof(string));
dt.Columns.Add("Department", typeof(string));

dt.Rows.Add(1, "John Smith", "Engineering");
dt.Rows.Add(2, "Sarah Jones", "Marketing");
dt.Rows.Add(3, "Mike Wilson", "Sales");

// Create a workbook and a named worksheet
WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLSX);
WorkSheet worksheet = workbook.CreateWorkSheet("Employees");

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

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

workbook.SaveAs("EmployeeData.xlsx");
using IronXL;
using System.Data;

// Build an in-memory DataTable
DataTable dt = new DataTable("Employees");
dt.Columns.Add("ID", typeof(int));
dt.Columns.Add("Name", typeof(string));
dt.Columns.Add("Department", typeof(string));

dt.Rows.Add(1, "John Smith", "Engineering");
dt.Rows.Add(2, "Sarah Jones", "Marketing");
dt.Rows.Add(3, "Mike Wilson", "Sales");

// Create a workbook and a named worksheet
WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLSX);
WorkSheet worksheet = workbook.CreateWorkSheet("Employees");

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

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

workbook.SaveAs("EmployeeData.xlsx");
Imports IronXL
Imports System.Data

' Build an in-memory DataTable
Dim dt As New DataTable("Employees")
dt.Columns.Add("ID", GetType(Integer))
dt.Columns.Add("Name", GetType(String))
dt.Columns.Add("Department", GetType(String))

dt.Rows.Add(1, "John Smith", "Engineering")
dt.Rows.Add(2, "Sarah Jones", "Marketing")
dt.Rows.Add(3, "Mike Wilson", "Sales")

' Create a workbook and a named worksheet
Dim workbook As WorkBook = WorkBook.Create(ExcelFileFormat.XLSX)
Dim worksheet As WorkSheet = workbook.CreateWorkSheet("Employees")

' Write column headers in row 0
For col As Integer = 0 To dt.Columns.Count - 1
    worksheet.SetCellValue(0, col, dt.Columns(col).ColumnName)
Next

' Write data rows starting at row 1
For row As Integer = 0 To dt.Rows.Count - 1
    For col As Integer = 0 To dt.Columns.Count - 1
        worksheet.SetCellValue(row + 1, col, dt.Rows(row)(col).ToString())
    Next
Next

workbook.SaveAs("EmployeeData.xlsx")
$vbLabelText   $csharpLabel

出力

VB .NETでデータセットを Excel にエクスポートする方法 : IronXLを使用した完全ガイド : 画像 1 - VB .NETでシンプルな DataTable を Excel にエクスポートしたときの出力

SetCellValue は int、double、string、bool を受け入れるので、追加のキャストなしでネイティブの Excel セル型を取得できます。 IronXL はメモリに直接書き込み、SaveAs が呼び出されたときにのみディスクにフラッシュするため、ループパターンはあらゆるサイズのテーブルで機能し、数千行の場合でもプロセスを効率的に維持します。

読み書きのテクニックについてより詳しく知りたい場合は、 IronXLのC#チュートリアルで、このエクスポートパターンに加えて、ファイル操作の全範囲が解説されています。

データセットを複数のExcelワークシートにエクスポートするにはどうすればよいですか?

データセットに製品や注文など、関連する複数のテーブルが含まれている場合、1つのワークブック内で各データテーブルをそれぞれ別のワークシートにマッピングできます。 これにより、受信者は複数の文書を開くことなく、関連するすべてのデータを単一のファイルで確認できるようになります。

以下のループは ds.Tables を繰り返し、テーブルごとに 1 つのシートを作成します。

using IronXL;
using System.Data;

// Build a DataSet with two related tables
DataSet ds = new DataSet("CompanyData");

DataTable dtProducts = new DataTable("Products");
dtProducts.Columns.Add("ProductID", typeof(int));
dtProducts.Columns.Add("ProductName", typeof(string));
dtProducts.Columns.Add("Price", typeof(decimal));
dtProducts.Rows.Add(101, "Widget A", 29.99m);
dtProducts.Rows.Add(102, "Widget B", 49.99m);
ds.Tables.Add(dtProducts);

DataTable dtOrders = new DataTable("Orders");
dtOrders.Columns.Add("OrderID", typeof(int));
dtOrders.Columns.Add("Customer", typeof(string));
dtOrders.Columns.Add("Total", typeof(decimal));
dtOrders.Rows.Add(1001, "Acme Corp", 599.90m);
dtOrders.Rows.Add(1002, "Tech Inc", 299.95m);
ds.Tables.Add(dtOrders);

// Create one workbook and iterate each DataTable
WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLSX);

foreach (DataTable table in ds.Tables)
{
    WorkSheet sheet = workbook.CreateWorkSheet(table.TableName);

    // Write headers
    for (int col = 0; col < table.Columns.Count; col++)
    {
        sheet.SetCellValue(0, col, table.Columns[col].ColumnName);
    }

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

workbook.SaveAs("CompanyReport.xlsx");
using IronXL;
using System.Data;

// Build a DataSet with two related tables
DataSet ds = new DataSet("CompanyData");

DataTable dtProducts = new DataTable("Products");
dtProducts.Columns.Add("ProductID", typeof(int));
dtProducts.Columns.Add("ProductName", typeof(string));
dtProducts.Columns.Add("Price", typeof(decimal));
dtProducts.Rows.Add(101, "Widget A", 29.99m);
dtProducts.Rows.Add(102, "Widget B", 49.99m);
ds.Tables.Add(dtProducts);

DataTable dtOrders = new DataTable("Orders");
dtOrders.Columns.Add("OrderID", typeof(int));
dtOrders.Columns.Add("Customer", typeof(string));
dtOrders.Columns.Add("Total", typeof(decimal));
dtOrders.Rows.Add(1001, "Acme Corp", 599.90m);
dtOrders.Rows.Add(1002, "Tech Inc", 299.95m);
ds.Tables.Add(dtOrders);

// Create one workbook and iterate each DataTable
WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLSX);

foreach (DataTable table in ds.Tables)
{
    WorkSheet sheet = workbook.CreateWorkSheet(table.TableName);

    // Write headers
    for (int col = 0; col < table.Columns.Count; col++)
    {
        sheet.SetCellValue(0, col, table.Columns[col].ColumnName);
    }

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

workbook.SaveAs("CompanyReport.xlsx");
Imports IronXL
Imports System.Data

' Build a DataSet with two related tables
Dim ds As New DataSet("CompanyData")

Dim dtProducts As New DataTable("Products")
dtProducts.Columns.Add("ProductID", GetType(Integer))
dtProducts.Columns.Add("ProductName", GetType(String))
dtProducts.Columns.Add("Price", GetType(Decimal))
dtProducts.Rows.Add(101, "Widget A", 29.99D)
dtProducts.Rows.Add(102, "Widget B", 49.99D)
ds.Tables.Add(dtProducts)

Dim dtOrders As New DataTable("Orders")
dtOrders.Columns.Add("OrderID", GetType(Integer))
dtOrders.Columns.Add("Customer", GetType(String))
dtOrders.Columns.Add("Total", GetType(Decimal))
dtOrders.Rows.Add(1001, "Acme Corp", 599.90D)
dtOrders.Rows.Add(1002, "Tech Inc", 299.95D)
ds.Tables.Add(dtOrders)

' Create one workbook and iterate each DataTable
Dim workbook As WorkBook = WorkBook.Create(ExcelFileFormat.XLSX)

For Each table As DataTable In ds.Tables
    Dim sheet As WorkSheet = workbook.CreateWorkSheet(table.TableName)

    ' Write headers
    For col As Integer = 0 To table.Columns.Count - 1
        sheet.SetCellValue(0, col, table.Columns(col).ColumnName)
    Next

    ' Write rows
    For row As Integer = 0 To table.Rows.Count - 1
        For col As Integer = 0 To table.Columns.Count - 1
            sheet.SetCellValue(row + 1, col, table.Rows(row)(col).ToString())
        Next
    Next
Next

workbook.SaveAs("CompanyReport.xlsx")
$vbLabelText   $csharpLabel

出力

VB .NETでデータセットを Excel にエクスポートする方法 : IronXLを使用した完全ガイド : 画像 2 - エクスポートされたデータセットが個別のワークシートとして含まれた生成された Excel ファイル

各ワークシートは元のデータテーブルと同じ名前になっているため、Excel内でのナビゲーションが容易です。 WorkBook.Create はワークブックをメモリに割り当てるため、ファイルを再度開くことなくループ内でワークシートを追加し続けることができます。IronXLはディスクに書き込む前に XLSX 構造全体を構築します。

IronXLのWorkBookに関するドキュメントには、シートの並べ替え、パスワード保護、XLSX以外の形式での保存など、WorkBookオブジェクトで利用可能なすべてのメソッドが記載されています。

Excelエクスポートにヘッダー書式を追加するにはどうすればよいですか?

プレーンなデータエクスポートでも機能はしますが、太字のヘッダーと列幅を追加することで、出力結果をビジネス環境ですぐに利用できるようになります。 IronXL は、任意の WorkSheet 範囲に添付された Style オブジェクトを介して、セルと範囲のスタイルを公開します。

以下のコードスニペットは、ヘッダー行に太字のフォント書式を適用し、データ書き込み後に列のサイズを自動的に調整します。

using IronXL;
using System.Data;

DataTable dt = new DataTable("Sales");
dt.Columns.Add("Region", typeof(string));
dt.Columns.Add("Q1", typeof(decimal));
dt.Columns.Add("Q2", typeof(decimal));
dt.Columns.Add("Q3", typeof(decimal));
dt.Columns.Add("Q4", typeof(decimal));

dt.Rows.Add("North", 120000m, 135000m, 142000m, 158000m);
dt.Rows.Add("South", 98000m, 104000m, 112000m, 121000m);
dt.Rows.Add("East",  87000m, 93000m,  99000m,  108000m);
dt.Rows.Add("West",  145000m, 152000m, 161000m, 174000m);

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

// Write and style headers
for (int col = 0; col < dt.Columns.Count; col++)
{
    sheet.SetCellValue(0, col, dt.Columns[col].ColumnName);
    sheet["A1:E1"].Style.Font.Bold = true;
    sheet["A1:E1"].Style.Font.Height = 12;
}

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

workbook.SaveAs("SalesReport.xlsx");
using IronXL;
using System.Data;

DataTable dt = new DataTable("Sales");
dt.Columns.Add("Region", typeof(string));
dt.Columns.Add("Q1", typeof(decimal));
dt.Columns.Add("Q2", typeof(decimal));
dt.Columns.Add("Q3", typeof(decimal));
dt.Columns.Add("Q4", typeof(decimal));

dt.Rows.Add("North", 120000m, 135000m, 142000m, 158000m);
dt.Rows.Add("South", 98000m, 104000m, 112000m, 121000m);
dt.Rows.Add("East",  87000m, 93000m,  99000m,  108000m);
dt.Rows.Add("West",  145000m, 152000m, 161000m, 174000m);

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

// Write and style headers
for (int col = 0; col < dt.Columns.Count; col++)
{
    sheet.SetCellValue(0, col, dt.Columns[col].ColumnName);
    sheet["A1:E1"].Style.Font.Bold = true;
    sheet["A1:E1"].Style.Font.Height = 12;
}

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

workbook.SaveAs("SalesReport.xlsx");
Imports IronXL
Imports System.Data

Dim dt As New DataTable("Sales")
dt.Columns.Add("Region", GetType(String))
dt.Columns.Add("Q1", GetType(Decimal))
dt.Columns.Add("Q2", GetType(Decimal))
dt.Columns.Add("Q3", GetType(Decimal))
dt.Columns.Add("Q4", GetType(Decimal))

dt.Rows.Add("North", 120000D, 135000D, 142000D, 158000D)
dt.Rows.Add("South", 98000D, 104000D, 112000D, 121000D)
dt.Rows.Add("East", 87000D, 93000D, 99000D, 108000D)
dt.Rows.Add("West", 145000D, 152000D, 161000D, 174000D)

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

' Write and style headers
For col As Integer = 0 To dt.Columns.Count - 1
    sheet.SetCellValue(0, col, dt.Columns(col).ColumnName)
    sheet("A1:E1").Style.Font.Bold = True
    sheet("A1:E1").Style.Font.Height = 12
Next

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

workbook.SaveAs("SalesReport.xlsx")
$vbLabelText   $csharpLabel

Style.Font.Bold プロパティは、単一のステートメントでヘッダー範囲全体に適用されます。 IronXL は、背景色 (Style.BackgroundColor)、枠線スタイル (Style.Border)、数値形式 (Style.NumberFormat.FormatCode)、水平方向の配置 (Style.HorizontalAlignment) もサポートしています。 書式設定の詳細については、 IronXL のセル書式設定ガイドを参照してください。

データベースのクエリ結果をExcelにエクスポートするにはどうすればよいですか?

SQLデータベースに接続し、結果をExcelに直接エクスポートする機能は、定期レポート、データスナップショット、管理用エクスポートなど、実際の業務における主要なユースケースに対応しています。 このアプローチでは、SqlDataAdapter を使用して DataSet にデータを入力し、結果として得られる DataTable をIronXLワークシートにマッピングします。

using IronXL;
using System.Data;
using System.Data.SqlClient;

string connectionString = "Server=localhost;Database=SalesDB;Integrated Security=True;";
string query = "SELECT CustomerID, CompanyName, ContactName, Country FROM Customers";

// Fill DataSet from SQL query
DataSet ds = new DataSet();
using (SqlConnection connection = new SqlConnection(connectionString))
{
    SqlDataAdapter adapter = new SqlDataAdapter(query, connection);
    adapter.Fill(ds, "Customers");
}

DataTable dt = ds.Tables["Customers"]!;

// Create workbook and export
WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLSX);
WorkSheet worksheet = workbook.CreateWorkSheet("CustomerData");

// Bold header row
for (int col = 0; col < dt.Columns.Count; col++)
{
    worksheet.SetCellValue(0, col, dt.Columns[col].ColumnName);
}
worksheet["A1:D1"].Style.Font.Bold = true;

// Write rows, handling DBNull values safely
for (int row = 0; row < dt.Rows.Count; row++)
{
    for (int col = 0; col < dt.Columns.Count; col++)
    {
        object cellValue = dt.Rows[row][col];
        worksheet.SetCellValue(row + 1, col,
            cellValue == DBNull.Value ? "" : cellValue.ToString()!);
    }
}

workbook.SaveAs("CustomerExport.xlsx");
Console.WriteLine("Export complete.");
using IronXL;
using System.Data;
using System.Data.SqlClient;

string connectionString = "Server=localhost;Database=SalesDB;Integrated Security=True;";
string query = "SELECT CustomerID, CompanyName, ContactName, Country FROM Customers";

// Fill DataSet from SQL query
DataSet ds = new DataSet();
using (SqlConnection connection = new SqlConnection(connectionString))
{
    SqlDataAdapter adapter = new SqlDataAdapter(query, connection);
    adapter.Fill(ds, "Customers");
}

DataTable dt = ds.Tables["Customers"]!;

// Create workbook and export
WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLSX);
WorkSheet worksheet = workbook.CreateWorkSheet("CustomerData");

// Bold header row
for (int col = 0; col < dt.Columns.Count; col++)
{
    worksheet.SetCellValue(0, col, dt.Columns[col].ColumnName);
}
worksheet["A1:D1"].Style.Font.Bold = true;

// Write rows, handling DBNull values safely
for (int row = 0; row < dt.Rows.Count; row++)
{
    for (int col = 0; col < dt.Columns.Count; col++)
    {
        object cellValue = dt.Rows[row][col];
        worksheet.SetCellValue(row + 1, col,
            cellValue == DBNull.Value ? "" : cellValue.ToString()!);
    }
}

workbook.SaveAs("CustomerExport.xlsx");
Console.WriteLine("Export complete.");
Imports IronXL
Imports System.Data
Imports System.Data.SqlClient

Dim connectionString As String = "Server=localhost;Database=SalesDB;Integrated Security=True;"
Dim query As String = "SELECT CustomerID, CompanyName, ContactName, Country FROM Customers"

' Fill DataSet from SQL query
Dim ds As New DataSet()
Using connection As New SqlConnection(connectionString)
    Dim adapter As New SqlDataAdapter(query, connection)
    adapter.Fill(ds, "Customers")
End Using

Dim dt As DataTable = ds.Tables("Customers")

' Create workbook and export
Dim workbook As WorkBook = WorkBook.Create(ExcelFileFormat.XLSX)
Dim worksheet As WorkSheet = workbook.CreateWorkSheet("CustomerData")

' Bold header row
For col As Integer = 0 To dt.Columns.Count - 1
    worksheet.SetCellValue(0, col, dt.Columns(col).ColumnName)
Next
worksheet("A1:D1").Style.Font.Bold = True

' Write rows, handling DBNull values safely
For row As Integer = 0 To dt.Rows.Count - 1
    For col As Integer = 0 To dt.Columns.Count - 1
        Dim cellValue As Object = dt.Rows(row)(col)
        worksheet.SetCellValue(row + 1, col, If(cellValue Is DBNull.Value, "", cellValue.ToString()))
    Next
Next

workbook.SaveAs("CustomerExport.xlsx")
Console.WriteLine("Export complete.")
$vbLabelText   $csharpLabel

データベースエクスポートの重要ポイント

null ガード (cellValue == DBNull.Value ? "" : cellValue.ToString()) prevents exceptions when the database returns NULL 値 -- オプション列でよく発生する現象。 ヘッダー行を太字にすることで、レポートの受信者はヘッダーとデータをすぐに区別できます。

ExcelからC#オブジェクトにデータを読み戻す際のその他のパタ​​ーンについては、 IronXL DataTableのエクスポートチュートリアルで、このワークフローを逆にする方法が説明されています。

IronXLを他のExcelエクスポート方法と比較するとどうですか?

ライブラリを選択する前に、データセットのエクスポートシナリオにおいて最も重要な領域で、主要な選択肢が互いにどのように比較されるかを理解しておくことが役立ちます。

.NET DataSetシナリオにおけるExcelエクスポートライブラリの比較
アプローチ オフィス必須 XLSXサポート スタイリングAPI 複数枚 パフォーマンス(大規模データ)
IronXL なし はい 満杯 はい 高い
Microsoft Office Interop はい はい 満杯 はい 低い
EPPlus なし はい 部分的 はい 高い
ClosedXML なし はい 部分的 はい 中くらい
CSV(手動) なし なし 該当なし なし 非常に高い

Microsoft Office Interopは、OfficeがインストールされているWindowsマシンでのみ動作するため、サーバー展開やクラウド機能には適用できません。 IronXL、EPPlus、ClosedXMLはいずれもサーバーサイド生成をサポートしており、主な違いはスタイリングAPIの幅広さとライセンスモデルにある。 IronXLのライセンスには商用利用が含まれており、単一のパッケージで全て for .NETターゲットフレームワークをカバーしています。

サードパーティによるベンチマークや比較については、 Excelファイル形式に関するMicrosoftのドキュメントEPPlusプロジェクトページが、プロジェクトに最適な選択をするための追加情報を提供します。

メモリ不足の問題なく大規模なデータセットを処理するにはどうすればよいでしょうか?

数万行のデータテーブルをエクスポートする場合、メモリ使用量を予測可能な範囲に保つことが重要です。 以下のパターンでは、結果セット全体を最初に DataTable に読み込むのではなく、IDataReader からデータをストリーミングします。これにより、リーダーバッファと DataTable を同時に保持することによるメモリ使用量の二重コストを回避できます。

using IronXL;
using System.Data;
using System.Data.SqlClient;

string connectionString = "Server=localhost;Database=InventoryDB;Integrated Security=True;";
string query = "SELECT ProductID, SKU, Description, StockLevel, UnitCost FROM Products";

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

using SqlConnection conn = new SqlConnection(connectionString);
conn.Open();

using SqlCommand cmd = new SqlCommand(query, conn);
using SqlDataReader reader = cmd.ExecuteReader();

// Write schema-derived headers
for (int col = 0; col < reader.FieldCount; col++)
{
    sheet.SetCellValue(0, col, reader.GetName(col));
}

// Stream rows directly into IronXL without buffering a DataTable
int excelRow = 1;
while (reader.Read())
{
    for (int col = 0; col < reader.FieldCount; col++)
    {
        sheet.SetCellValue(excelRow, col,
            reader.IsDBNull(col) ? "" : reader.GetValue(col).ToString()!);
    }
    excelRow++;
}

workbook.SaveAs("InventoryExport.xlsx");
Console.WriteLine($"Exported {excelRow - 1} rows.");
using IronXL;
using System.Data;
using System.Data.SqlClient;

string connectionString = "Server=localhost;Database=InventoryDB;Integrated Security=True;";
string query = "SELECT ProductID, SKU, Description, StockLevel, UnitCost FROM Products";

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

using SqlConnection conn = new SqlConnection(connectionString);
conn.Open();

using SqlCommand cmd = new SqlCommand(query, conn);
using SqlDataReader reader = cmd.ExecuteReader();

// Write schema-derived headers
for (int col = 0; col < reader.FieldCount; col++)
{
    sheet.SetCellValue(0, col, reader.GetName(col));
}

// Stream rows directly into IronXL without buffering a DataTable
int excelRow = 1;
while (reader.Read())
{
    for (int col = 0; col < reader.FieldCount; col++)
    {
        sheet.SetCellValue(excelRow, col,
            reader.IsDBNull(col) ? "" : reader.GetValue(col).ToString()!);
    }
    excelRow++;
}

workbook.SaveAs("InventoryExport.xlsx");
Console.WriteLine($"Exported {excelRow - 1} rows.");
Imports IronXL
Imports System.Data
Imports System.Data.SqlClient

Dim connectionString As String = "Server=localhost;Database=InventoryDB;Integrated Security=True;"
Dim query As String = "SELECT ProductID, SKU, Description, StockLevel, UnitCost FROM Products"

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

Using conn As New SqlConnection(connectionString)
    conn.Open()

    Using cmd As New SqlCommand(query, conn)
        Using reader As SqlDataReader = cmd.ExecuteReader()

            ' Write schema-derived headers
            For col As Integer = 0 To reader.FieldCount - 1
                sheet.SetCellValue(0, col, reader.GetName(col))
            Next

            ' Stream rows directly into IronXL without buffering a DataTable
            Dim excelRow As Integer = 1
            While reader.Read()
                For col As Integer = 0 To reader.FieldCount - 1
                    sheet.SetCellValue(excelRow, col, If(reader.IsDBNull(col), "", reader.GetValue(col).ToString()))
                Next
                excelRow += 1
            End While

            workbook.SaveAs("InventoryExport.xlsx")
            Console.WriteLine($"Exported {excelRow - 1} rows.")
        End Using
    End Using
End Using
$vbLabelText   $csharpLabel

結果セットが50,000行を超える可能性がある場合、またはメモリ制約のあるサービス内で実行する場合に、このパターンが推奨されます。IronXL のパフォーマンスに関するドキュメントには、大量のエクスポートにおけるメモリとスループットのチューニングオプションに関する詳細な説明が記載されています。

非常に大規模なエクスポートのためのCSVへの一括保存

メモリ容量が極めて限られている状況で、50万行を超えるエクスポートを行う場合は、出力を複数のワークブックに分割するか、CSV形式でエクスポートすることを検討してください。

using IronXL;

// IronXL can save any workbook as CSV
workbook.SaveAs("LargeExport.csv");
using IronXL;

// IronXL can save any workbook as CSV
workbook.SaveAs("LargeExport.csv");
Imports IronXL

' IronXL can save any workbook as CSV
workbook.SaveAs("LargeExport.csv")
$vbLabelText   $csharpLabel

CSV形式は書式設定と複数シートのサポートを失いますが、区切り文字付きの生データを扱う下流のETLプロセスでは引き続き有効です。

Excelファイルを異なる形式や場所に保存するにはどうすればよいですか?

IronXL は、ファイル パス、MemoryStream、および byte[] への保存をサポートしています。これは、Excel をダウンロード レスポンスとして返すASP.NETアプリケーションにとって重要です。

using IronXL;
using System.IO;

WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLSX);
WorkSheet sheet = workbook.CreateWorkSheet("Report");
sheet.SetCellValue(0, 0, "Generated Report");

// Save to file path
workbook.SaveAs("Report.xlsx");

// Save as XLS (legacy format)
workbook.SaveAs("Report.xls");

// Save to MemoryStream for HTTP response
using MemoryStream ms = new MemoryStream();
workbook.SaveAs(ms);
byte[] fileBytes = ms.ToArray();
// fileBytes can be returned from an ASP.NET controller action
using IronXL;
using System.IO;

WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLSX);
WorkSheet sheet = workbook.CreateWorkSheet("Report");
sheet.SetCellValue(0, 0, "Generated Report");

// Save to file path
workbook.SaveAs("Report.xlsx");

// Save as XLS (legacy format)
workbook.SaveAs("Report.xls");

// Save to MemoryStream for HTTP response
using MemoryStream ms = new MemoryStream();
workbook.SaveAs(ms);
byte[] fileBytes = ms.ToArray();
// fileBytes can be returned from an ASP.NET controller action
Imports IronXL
Imports System.IO

Dim workbook As WorkBook = WorkBook.Create(ExcelFileFormat.XLSX)
Dim sheet As WorkSheet = workbook.CreateWorkSheet("Report")
sheet.SetCellValue(0, 0, "Generated Report")

' Save to file path
workbook.SaveAs("Report.xlsx")

' Save as XLS (legacy format)
workbook.SaveAs("Report.xls")

' Save to MemoryStream for HTTP response
Using ms As New MemoryStream()
    workbook.SaveAs(ms)
    Dim fileBytes As Byte() = ms.ToArray()
    ' fileBytes can be returned from an ASP.NET controller action
End Using
$vbLabelText   $csharpLabel

ASP.NET Coreの場合、ブラウザーのダウンロードをトリガーするには、コントローラーのアクションから File(fileBytes, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "Report.xlsx") を返します。 IronXL ASP.NET Excelガイドでは、コントローラーの統合パターン全体を示しています。

代替となる.NET Excelライブラリの場合、 Open XML SDKは多くのライブラリが構築されているオープンソースの基盤です。

サポートされている出力形式

IronXLは、追加の依存関係なしに以下の形式で保存できます。

  • XLSX -- OpenXML形式、Excel 2007以降に対応
  • XLS -- 従来のバイナリ形式、Excel 97-2003と互換性あり
  • CSV -- カンマ区切り値、広くサポートされています
  • TSV -- タブ区切り値
  • JSON -- 構造化データのエクスポート

SaveAs パス内のファイル拡張子を変更するか、ExcelFileFormat 列挙値を受け入れるオーバーロードされたメソッドを使用することで、フォーマットを切り替えます。

エクスポートしたExcelファイルが正しいことを確認するにはどうすればよいですか?

エクスポート後、 IronXLを使用してファイルを読み込み、行数を確認したり、値をスポットチェックしたり、テストプロジェクトで自動アサーションを実行したりできます。

using IronXL;

WorkBook loaded = WorkBook.Load("EmployeeData.xlsx");
WorkSheet sheet = loaded.WorkSheets[0];

// Verify row count (header row + data rows)
int totalRows = sheet.Rows.Count();
Console.WriteLine($"Rows in file: {totalRows}");

// Spot-check specific cell values
string header = sheet["A1"].StringValue;
string firstEmployee = sheet["A2"].StringValue;

Console.WriteLine($"Header: {header}, First row: {firstEmployee}");
using IronXL;

WorkBook loaded = WorkBook.Load("EmployeeData.xlsx");
WorkSheet sheet = loaded.WorkSheets[0];

// Verify row count (header row + data rows)
int totalRows = sheet.Rows.Count();
Console.WriteLine($"Rows in file: {totalRows}");

// Spot-check specific cell values
string header = sheet["A1"].StringValue;
string firstEmployee = sheet["A2"].StringValue;

Console.WriteLine($"Header: {header}, First row: {firstEmployee}");
Imports IronXL

Dim loaded As WorkBook = WorkBook.Load("EmployeeData.xlsx")
Dim sheet As WorkSheet = loaded.WorkSheets(0)

' Verify row count (header row + data rows)
Dim totalRows As Integer = sheet.Rows.Count()
Console.WriteLine($"Rows in file: {totalRows}")

' Spot-check specific cell values
Dim header As String = sheet("A1").StringValue
Dim firstEmployee As String = sheet("A2").StringValue

Console.WriteLine($"Header: {header}, First row: {firstEmployee}")
$vbLabelText   $csharpLabel

この検証パターンは、ファイルを外部システムに送信する前にエクスポートの正しさを確認する必要がある統合テストスイートにおいて特に有用です。 IronXLの読み込みチュートリアルでは、ファイルを読み込んだ後に利用できるすべての読み込み操作を紹介しています。

.NETにおける DataSet および DataTable パターンの詳細については、 Microsoft DataSet のドキュメントで ADO .NETオブジェクト モデルが詳しく解説されています。

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

これで、単一のデータテーブルから複数シートのワークブック、データベース駆動型のエクスポート、書式付きヘッダー、大規模データストリーミングまで、C# での主要な DataSet から Excel へのエクスポートシナリオすべてに対応する動作パターンが揃いました。 目標に応じて次のステップに進む方法は次のとおりです。

  • IronXLを無料でお試しください--無料トライアルライセンスから始めて、本番環境に導入する前に、上記の例を自分のデータで実行してみてください。
  • API リファレンス全文をお読みください-- IronXLオブジェクトリファレンスには、WorkBook、WorkSheet、およびセル範囲のすべてのメソッドが記載されています。 -関連するエクスポートチュートリアルをご覧ください-- C# DataTable から Excel へのガイドでは、逆のワークフロー、つまり Excel から DataTable オブジェクトに読み戻す方法について説明しています。 -書式設定オプションを確認する-- IronXLのセル書式設定に関するドキュメントには、数値形式、罫線、背景色、配置オプションが記載されています。 -ライセンスを確認してください。本番環境への導入については、 IronXLのライセンスページを参照して、開発者向け、組織向け、ロイヤリティフリーのオプションから選択してください。 -他のIron Softwareツールと比較してください-- プロジェクトで PDF 生成や OCR も必要な場合は、 Iron Software製品Suiteを使用すると、複数のライブラリを割引価格でバンドルできます。

ここで説明したパターンを基に、スケジュールされたタスクの自動化、 ASP.NET Core のダウンロードエンドポイント、マルチフォーマット出力パイプラインを、Office、COM、 NuGetパッケージ以外のランタイム依存関係を一切必要としないマネージド C# で完全に構築できます。

よくある質問

C# で DataSet を Excel にエクスポートするにはどうすればよいですか?

IronXLライブラリを使用すると、C# で DataSet を Excel にエクスポートできます。このライブラリは、Microsoft Office を必要とせずに Excel ファイルを作成、編集、操作するためのコード ファースト API を提供します。

IronXLを使用するためにMicrosoft Officeをインストールする必要がありますか?

いいえ、 IronXL、Excel ファイルをエクスポートまたは操作するために、マシンに Microsoft Office がインストールされている必要はありません。

IronXLを使用してエクスポートできるデータの種類は何ですか?

IronXL を使用すると、DataTables や DataSet などの構造化データのほか、SqlDataReader やその他の ADO .NETソースからのデータを Excel ファイルにエクスポートできます。

IronXL はExcel ファイルの作成と編集を処理できますか?

はい、 IronXL はC# でプログラム的に Excel ファイルを作成、編集、操作する機能を提供します。

IronXL はサーバー側およびクラウド アプリケーションに適していますか?

はい、 IronXL は、Office をインストールせずに Excel ファイルを生成する必要があるサーバー側アプリケーションやクラウド機能に最適です。

DataSet をエクスポートするためにIronXLを使用する利点は何ですか?

IronXL は、Microsoft Office などの外部依存なしに Excel ファイルの作成と操作を処理し、XLSX、XLS、CSV 形式をサポートし、すべて for .NETターゲット フレームワークで動作します。

IronXL をASP.NET Coreで使用して Excel のダウンロードを返すことはできますか?

はい、 IronXL はワークブックを MemoryStream に保存でき、結果のバイト配列はASP.NET Coreコントローラー アクションからファイルのダウンロードとして返すことができます。

IronXL は大規模な DataSet をサポートしていますか?

はい、 IronXL は完全な DataTable をバッファリングせずに SqlDataReader から直接データをストリーミングできるため、大規模な結果セットのメモリ使用量を予測可能に保つことができます。

IronXL はどのような Excel 形式での保存をサポートしていますか?

IronXL は、追加の依存関係なしで、XLSX、XLS、CSV、TSV、JSON 形式への保存をサポートします。

Excel にエクスポートするときに太字のヘッダーなどの書式を適用できますか?

はい、 IronXL は、太字フォント、背景色、境界線、数値形式、配置用のセル範囲のスタイル API を提供します。

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

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

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

アイアンサポートチーム

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