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

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

C# でデータテーブルを Excel ファイルにエクスポートすることは、Office に依存することなく、適切なライブラリを使用すれば簡単です。 WorkBook.Create() を呼び出し、dataTable.Columns からヘッダーを書き込み、dataTable.Rows をループしてセルにデータを入力し、最後に workbook.SaveAs("output.xlsx") で保存します。 その結果、 .NET 10、Linuxコンテナ、Azureサーバーレス関数など、あらゆるプラットフォームで動作する、完全にフォーマットされたXLSXファイルが生成されます。

このガイドでは、従来のオレDB方式と、最新のIronXL for .NET方式を比較します。 オレDBドライバがなぜ導入や互換性の問題を引き起こすのか、そしてSQL構文やWindows専用のドライバインストールを必要とせずに、列ヘッダー、データ型、セル書式設定、大規模データセットを処理する、クリーンで保守性の高いコードに置き換える方法がわかります。


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

エクスポートコードを記述する前に、 IronXLをプロジェクトに追加してください。 Visual StudioでPackage Manager Consoleを開き、実行してください:

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

IronXLは、Microsoft Office、Accessデータベースエンジン、またはCOM相互運用レイヤーに依存していません。 パッケージをインストールすれば、Windows、Linux、macOS、Docker、 AzureAWS上で、コードを一行も変更することなく同じコードを実行できます。

オレDBにドライバのインストールが必要な理由

従来のオレDB方式では、Excelファイルをデータベースとして扱います。 オレDBConnection プロバイダー (または Microsoft.ACE.OLEDB.12.0 ファイルの場合は古い Microsoft.Jet.OLEDB.4.0) を使用して .xls を確立し、スプレッドシートに対して SQL CREATE TABLE および INSERT INTO コマンドを実行します。 これは、Microsoft Officeまたはスタンドアロン版のAccessデータベースエンジン再頒布可能パッケージが既にインストールされている開発者用マシンで動作します。 しかし、本番環境、特にクラウド関数、Dockerコンテナ、ヘッドレス.NET 10を実行するサーバーファームでは、このドライバが利用できることはほとんどなく、インストールには管理者権限と、ドライバとプロセス間のビット数の一致が必要です。

開発者はなぜ今でもExcelエクスポートにオレDBを使用するのか?

オレDBは.NET Frameworkの一部であったため、Excelの自動化におけるデフォルトの選択肢となった。 開発者は既に.NETを知っていたので、オレDBDataAdapterを再利用してExcelに書き込むことは自然なことだった。 サードパーティ製のパッケージは必要なく、CREATE TABLE および INSERT INTO のような SQL ライクな構文により、データベース プログラミングに精通している人であれば誰でも意図を明確に理解できる。

オレDBを使用してDataTableをエクスポートする従来の手順は次のとおりです。

using System.Data;
using System.Data.OleDb;

// Build a sample DataTable
DataTable dataTable = new DataTable("Products");
dataTable.Columns.Add("ProductID", typeof(int));
dataTable.Columns.Add("ProductName", typeof(string));
dataTable.Columns.Add("Price", typeof(decimal));
dataTable.Rows.Add(1, "Widget", 29.99m);
dataTable.Rows.Add(2, "Gadget", 49.99m);
dataTable.Rows.Add(3, "Gizmo", 19.99m);

// OleDb connection string -- file must already exist on disk
string filename = @"C:\Output\Products.xlsx";
string connectionString =
    $"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={filename};" +
    "Extended Properties='Excel 12.0 Xml;HDR=YES'";

using OleDbConnection connection = new(connectionString);
connection.Open();

// Create the sheet structure with SQL DDL
string create = "CREATE TABLE [Sheet1$] (ProductID INT, ProductName CHAR(255), Price DOUBLE)";
using (var createCmd = new OleDbCommand(create, connection))
    createCmd.ExecuteNonQuery();

// Insert rows one at a time
string insert = "INSERT INTO [Sheet1$] (ProductID, ProductName, Price) VALUES (?, ?, ?)";
using OleDbCommand insertCmd = new(insert, connection);
insertCmd.Parameters.Add(new OleDbParameter("ProductID", OleDbType.Integer));
insertCmd.Parameters.Add(new OleDbParameter("ProductName", OleDbType.VarChar, 255));
insertCmd.Parameters.Add(new OleDbParameter("Price", OleDbType.Double));

foreach (DataRow row in dataTable.Rows)
{
    insertCmd.Parameters[0].Value = row["ProductID"];
    insertCmd.Parameters[1].Value = row["ProductName"];
    insertCmd.Parameters[2].Value = row["Price"];
    insertCmd.ExecuteNonQuery();
}
using System.Data;
using System.Data.OleDb;

// Build a sample DataTable
DataTable dataTable = new DataTable("Products");
dataTable.Columns.Add("ProductID", typeof(int));
dataTable.Columns.Add("ProductName", typeof(string));
dataTable.Columns.Add("Price", typeof(decimal));
dataTable.Rows.Add(1, "Widget", 29.99m);
dataTable.Rows.Add(2, "Gadget", 49.99m);
dataTable.Rows.Add(3, "Gizmo", 19.99m);

// OleDb connection string -- file must already exist on disk
string filename = @"C:\Output\Products.xlsx";
string connectionString =
    $"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={filename};" +
    "Extended Properties='Excel 12.0 Xml;HDR=YES'";

using OleDbConnection connection = new(connectionString);
connection.Open();

// Create the sheet structure with SQL DDL
string create = "CREATE TABLE [Sheet1$] (ProductID INT, ProductName CHAR(255), Price DOUBLE)";
using (var createCmd = new OleDbCommand(create, connection))
    createCmd.ExecuteNonQuery();

// Insert rows one at a time
string insert = "INSERT INTO [Sheet1$] (ProductID, ProductName, Price) VALUES (?, ?, ?)";
using OleDbCommand insertCmd = new(insert, connection);
insertCmd.Parameters.Add(new OleDbParameter("ProductID", OleDbType.Integer));
insertCmd.Parameters.Add(new OleDbParameter("ProductName", OleDbType.VarChar, 255));
insertCmd.Parameters.Add(new OleDbParameter("Price", OleDbType.Double));

foreach (DataRow row in dataTable.Rows)
{
    insertCmd.Parameters[0].Value = row["ProductID"];
    insertCmd.Parameters[1].Value = row["ProductName"];
    insertCmd.Parameters[2].Value = row["Price"];
    insertCmd.ExecuteNonQuery();
}
Imports System.Data
Imports System.Data.OleDb

' Build a sample DataTable
Dim dataTable As New DataTable("Products")
dataTable.Columns.Add("ProductID", GetType(Integer))
dataTable.Columns.Add("ProductName", GetType(String))
dataTable.Columns.Add("Price", GetType(Decimal))
dataTable.Rows.Add(1, "Widget", 29.99D)
dataTable.Rows.Add(2, "Gadget", 49.99D)
dataTable.Rows.Add(3, "Gizmo", 19.99D)

' OleDb connection string -- file must already exist on disk
Dim filename As String = "C:\Output\Products.xlsx"
Dim connectionString As String = $"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={filename};" &
                                 "Extended Properties='Excel 12.0 Xml;HDR=YES'"

Using connection As New OleDbConnection(connectionString)
    connection.Open()

    ' Create the sheet structure with SQL DDL
    Dim create As String = "CREATE TABLE [Sheet1$] (ProductID INT, ProductName CHAR(255), Price DOUBLE)"
    Using createCmd As New OleDbCommand(create, connection)
        createCmd.ExecuteNonQuery()
    End Using

    ' Insert rows one at a time
    Dim insert As String = "INSERT INTO [Sheet1$] (ProductID, ProductName, Price) VALUES (?, ?, ?)"
    Using insertCmd As New OleDbCommand(insert, connection)
        insertCmd.Parameters.Add(New OleDbParameter("ProductID", OleDbType.Integer))
        insertCmd.Parameters.Add(New OleDbParameter("ProductName", OleDbType.VarChar, 255))
        insertCmd.Parameters.Add(New OleDbParameter("Price", OleDbType.Double))

        For Each row As DataRow In dataTable.Rows
            insertCmd.Parameters(0).Value = row("ProductID")
            insertCmd.Parameters(1).Value = row("ProductName")
            insertCmd.Parameters(2).Value = row("Price")
            insertCmd.ExecuteNonQuery()
        Next
    End Using
End Using
$vbLabelText   $csharpLabel

このコードは、各データ行を個別のデータベース往復通信として挿入します。大規模なデータセットの場合、オレDBにはバッチ挿入メカニズムがないため、このループがボトルネックになります。 各行は、次の行に進む前に、完全なSQL解析、パラメータバインド、および書き込みサイクルをトリガーします。

ExcelエクスポートにおけるオレDBの主な制限事項は何ですか?

オレDBの欠点を理解することで、チームにとって移行の必要性を正当化し、適切な代替ソリューションを選択するのに役立ちます。

ドライバの依存関係とビット数の競合

Microsoft.ACE.OLEDB.12.0 プロバイダは、アプリケーションを実行するすべてのマシンに個別にインストールする必要があります。 プロセスが 64 ビットであるにもかかわらず、32 ビットの Access データベース エンジンしか利用できない場合(これは、64 ビット for .NETランタイムと 32 ビットの Microsoft Office が共存する場合によく見られる構成です)、実行時に接続例外が発生します。Microsoft は これらのビット数の制限について文書化しており、ドライバーと呼び出し元のプロセス間でビット数を一致させることを推奨していますが、共有ホスティング環境やコンテナ環境では、これは多くの場合現実的ではありません。

クロスプラットフォーム対応なし

オレDBはWindows専用の技術です。 .NET 10はLinuxとmacOSをネイティブにサポートしており、最新のアーキテクチャでは、Linuxノード上のDockerコンテナでアプリケーションワークロードを実行するケースが増えています。 System.Data.OleDb 名前空間は非 Windows オペレーティングシステムで PlatformNotSupportedException をスローするため、オレDB を使用するコード パスは、これらのプラットフォームでは完全に実行がブロックされます。

セル書式設定機能なし

オレDBはスプレッドシートをフラットなデータベーステーブルとして扱います。 生の値を挿入することはできますが、セルのフォント、背景色、罫線、数値形式、列幅などを適用する仕組みはありません。 エクスポートするレポートに、ヘッダー行のスタイル設定、通貨の書式設定、条件付き色付けなど、プロフェッショナルな外観が必要な場合、オレDB では対応できません。 別のライブラリを使用するか、独自のOffice依存関係を追加するExcel Interop COMオブジェクトを使用して、再度処理を実行する必要があります。

Excelファイルは既に存在している必要があります

オレDB は、Excel ワークブックをゼロから新規作成することはできません。 接続を開く前に、対象パスにファイルが既に存在している必要があります。 これには、事前にテンプレートファイルが用意されているか、別のライブラリを使用してワークブックを作成する別の手順が必要となり、デプロイメントパッケージに不要な複雑さが加わります。

削除操作はサポートされていません

Excel 用 オレDB ドライバーは、INSERT および限定的な UPDATE 操作をサポートしていますが、DELETE FROM を使用した行の削除はサポートされていません。 エクスポート後に行を削除する必要がある場合、データ操作のワークフローでは手動でのファイル操作またはファイルの完全な再作成を行う必要がありますが、どちらもオレDBインターフェースでは簡単にはできません。

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

IronXLは、オレDBパイプライン全体を直接オブジェクトモデルに置き換えます。 接続文字列も、SQLコマンドも、ドライバ要件も一切ありません。 各セルに対して、WorkBook を作成し、WorkSheet を追加し、SetCellValue() を呼び出します。

using IronXL;
using System.Data;

// Build the same DataTable
DataTable dataTable = new DataTable("Products");
dataTable.Columns.Add("ProductID", typeof(int));
dataTable.Columns.Add("ProductName", typeof(string));
dataTable.Columns.Add("Price", typeof(decimal));
dataTable.Rows.Add(1, "Widget", 29.99m);
dataTable.Rows.Add(2, "Gadget", 49.99m);
dataTable.Rows.Add(3, "Gizmo", 19.99m);

// Create a new workbook and worksheet -- no template file needed
WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLSX);
WorkSheet worksheet = workbook.CreateWorkSheet("Products");

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

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

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

// Build the same DataTable
DataTable dataTable = new DataTable("Products");
dataTable.Columns.Add("ProductID", typeof(int));
dataTable.Columns.Add("ProductName", typeof(string));
dataTable.Columns.Add("Price", typeof(decimal));
dataTable.Rows.Add(1, "Widget", 29.99m);
dataTable.Rows.Add(2, "Gadget", 49.99m);
dataTable.Rows.Add(3, "Gizmo", 19.99m);

// Create a new workbook and worksheet -- no template file needed
WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLSX);
WorkSheet worksheet = workbook.CreateWorkSheet("Products");

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

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

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

' Build the same DataTable
Dim dataTable As New DataTable("Products")
dataTable.Columns.Add("ProductID", GetType(Integer))
dataTable.Columns.Add("ProductName", GetType(String))
dataTable.Columns.Add("Price", GetType(Decimal))
dataTable.Rows.Add(1, "Widget", 29.99D)
dataTable.Rows.Add(2, "Gadget", 49.99D)
dataTable.Rows.Add(3, "Gizmo", 19.99D)

' Create a new workbook and worksheet -- no template file needed
Dim workbook As WorkBook = WorkBook.Create(ExcelFileFormat.XLSX)
Dim worksheet As WorkSheet = workbook.CreateWorkSheet("Products")

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

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

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

WorkBook.Create(ExcelFileFormat.XLSX) メモリ上に新しいワークブックを作成します。事前にファイルが存在する必要はありません。 CreateWorkSheet("Products") は名前付きタブを追加します。 ネストされたループは、データテーブルの行数と列数を正確に反映し、セルごとに1つの値を書き込みます。 SaveAs() はワークブックを完全に有効な XLSX ファイルとしてディスクにフラッシュします。

出力

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

利用可能なオプションの詳細については、 DataSet および DataTable のエクスポート方法に関するガイドを参照してください。このガイドでは、追加のオーバーロードとバッチエクスポートのパターンについて説明しています。

データテーブルをエクスポートする際に、セルの書式設定を追加するにはどうすればよいですか?

基本的なエクスポート後によくある要望の一つは、ヘッダー行をデータ行と区別するためにスタイルを設定することです。 IronXLは、オレDBでは実現できない完全なスタイリングAPIを提供します。

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

DataTable dataTable = new DataTable("Products");
dataTable.Columns.Add("ProductID", typeof(int));
dataTable.Columns.Add("ProductName", typeof(string));
dataTable.Columns.Add("Price", typeof(decimal));
dataTable.Rows.Add(1, "Widget", 29.99m);
dataTable.Rows.Add(2, "Gadget", 49.99m);
dataTable.Rows.Add(3, "Gizmo", 19.99m);

WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLSX);
WorkSheet worksheet = workbook.CreateWorkSheet("Products");

// Write and style the header row
for (int col = 0; col < dataTable.Columns.Count; col++)
{
    var headerCell = worksheet[$"{(char)('A' + col)}1"];
    headerCell.Value = dataTable.Columns[col].ColumnName;
    headerCell.Style.Font.Bold = true;
    headerCell.Style.BackgroundColor = "#4472C4";
    headerCell.Style.Font.FontColor = "#FFFFFF";
}

// Write data rows with price column formatted as currency
for (int row = 0; row < dataTable.Rows.Count; row++)
{
    for (int col = 0; col < dataTable.Columns.Count; col++)
    {
        var cell = worksheet[$"{(char)('A' + col)}{row + 2}"];
        cell.Value = dataTable.Rows[row][col].ToString();

        // Apply currency format to the Price column
        if (dataTable.Columns[col].ColumnName == "Price")
            cell.FormatString = "$#,##0.00";
    }
}

// Auto-size columns so content is not clipped
worksheet.AutoSizeColumn(0);
worksheet.AutoSizeColumn(1);
worksheet.AutoSizeColumn(2);

workbook.SaveAs("ProductsStyled.xlsx");
using IronXL;
using IronXl.Styles;
using System.Data;

DataTable dataTable = new DataTable("Products");
dataTable.Columns.Add("ProductID", typeof(int));
dataTable.Columns.Add("ProductName", typeof(string));
dataTable.Columns.Add("Price", typeof(decimal));
dataTable.Rows.Add(1, "Widget", 29.99m);
dataTable.Rows.Add(2, "Gadget", 49.99m);
dataTable.Rows.Add(3, "Gizmo", 19.99m);

WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLSX);
WorkSheet worksheet = workbook.CreateWorkSheet("Products");

// Write and style the header row
for (int col = 0; col < dataTable.Columns.Count; col++)
{
    var headerCell = worksheet[$"{(char)('A' + col)}1"];
    headerCell.Value = dataTable.Columns[col].ColumnName;
    headerCell.Style.Font.Bold = true;
    headerCell.Style.BackgroundColor = "#4472C4";
    headerCell.Style.Font.FontColor = "#FFFFFF";
}

// Write data rows with price column formatted as currency
for (int row = 0; row < dataTable.Rows.Count; row++)
{
    for (int col = 0; col < dataTable.Columns.Count; col++)
    {
        var cell = worksheet[$"{(char)('A' + col)}{row + 2}"];
        cell.Value = dataTable.Rows[row][col].ToString();

        // Apply currency format to the Price column
        if (dataTable.Columns[col].ColumnName == "Price")
            cell.FormatString = "$#,##0.00";
    }
}

// Auto-size columns so content is not clipped
worksheet.AutoSizeColumn(0);
worksheet.AutoSizeColumn(1);
worksheet.AutoSizeColumn(2);

workbook.SaveAs("ProductsStyled.xlsx");
Imports IronXL
Imports IronXl.Styles
Imports System.Data

Dim dataTable As New DataTable("Products")
dataTable.Columns.Add("ProductID", GetType(Integer))
dataTable.Columns.Add("ProductName", GetType(String))
dataTable.Columns.Add("Price", GetType(Decimal))
dataTable.Rows.Add(1, "Widget", 29.99D)
dataTable.Rows.Add(2, "Gadget", 49.99D)
dataTable.Rows.Add(3, "Gizmo", 19.99D)

Dim workbook As WorkBook = WorkBook.Create(ExcelFileFormat.XLSX)
Dim worksheet As WorkSheet = workbook.CreateWorkSheet("Products")

' Write and style the header row
For col As Integer = 0 To dataTable.Columns.Count - 1
    Dim headerCell = worksheet($"{ChrW(AscW("A"c) + col)}1")
    headerCell.Value = dataTable.Columns(col).ColumnName
    headerCell.Style.Font.Bold = True
    headerCell.Style.BackgroundColor = "#4472C4"
    headerCell.Style.Font.FontColor = "#FFFFFF"
Next

' Write data rows with price column formatted as currency
For row As Integer = 0 To dataTable.Rows.Count - 1
    For col As Integer = 0 To dataTable.Columns.Count - 1
        Dim cell = worksheet($"{ChrW(AscW("A"c) + col)}{row + 2}")
        cell.Value = dataTable.Rows(row)(col).ToString()

        ' Apply currency format to the Price column
        If dataTable.Columns(col).ColumnName = "Price" Then
            cell.FormatString = "$#,##0.00"
        End If
    Next
Next

' Auto-size columns so content is not clipped
worksheet.AutoSizeColumn(0)
worksheet.AutoSizeColumn(1)
worksheet.AutoSizeColumn(2)

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

これにより、青色のヘッダー行、白色のヘッダーテキスト、ドル記号と小数点以下2桁で表示された価格値を含むファイルが生成されます。 セルのフォントサイズガイドと、枠線と配置に関するリファレンスには、利用可能なすべてのスタイル設定オプションが説明されています。

大規模なデータテーブルのエクスポートの処理

数千行にも及ぶデータセットの場合、パフォーマンスは重要となる。 IronXL は、SaveAs() に単一のディスク書き込みを行う前に、すべてのセル値をメモリに書き込みます。これは、行ごとに 1 つの ExecuteNonQuery() という オレDB のパターンよりもはるかに効率的です。 非常に大きなテーブルをエクスポートする必要がある場合は、 DataTableをExcelにエクスポートする最速の方法について解説したガイドを参照してください。このガイドでは、メモリ効率の良いストリーミング技術について説明しています。

エクスポートロジックは、数式、範囲、名前付きテーブルとグループ化することもできます。 スプレッドシートの作成方法.NETでのExcel記述ガイドでは、 DataTablesから複数シートのワークブックを構築するための完全なパターンを提供しています。

ASP.NETでデータテーブルをExcelにエクスポートするにはどうすればよいですか?

ウェブアプリケーションでは、通常、ワークブックをディスクに保存するのではなく、ブラウザに直接ストリーミングします。 IronXLは、workbook.ToByteArray()を使用してこれをサポートしており、HTTPレスポンスに書き込むことができるバイナリコンテンツを返します。

// In an ASP.NET controller action
WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLSX);
WorkSheet worksheet = workbook.CreateWorkSheet("Report");

// Assume dataTable is populated from your data source
for (int col = 0; col < dataTable.Columns.Count; col++)
    worksheet.SetCellValue(0, col, dataTable.Columns[col].ColumnName);

for (int row = 0; row < dataTable.Rows.Count; row++)
    for (int col = 0; col < dataTable.Columns.Count; col++)
        worksheet.SetCellValue(row + 1, col, dataTable.Rows[row][col].ToString());

byte[] fileBytes = workbook.ToByteArray();
return File(fileBytes, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "Report.xlsx");
// In an ASP.NET controller action
WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLSX);
WorkSheet worksheet = workbook.CreateWorkSheet("Report");

// Assume dataTable is populated from your data source
for (int col = 0; col < dataTable.Columns.Count; col++)
    worksheet.SetCellValue(0, col, dataTable.Columns[col].ColumnName);

for (int row = 0; row < dataTable.Rows.Count; row++)
    for (int col = 0; col < dataTable.Columns.Count; col++)
        worksheet.SetCellValue(row + 1, col, dataTable.Rows[row][col].ToString());

byte[] fileBytes = workbook.ToByteArray();
return File(fileBytes, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "Report.xlsx");
' In an ASP.NET controller action
Dim workbook As WorkBook = WorkBook.Create(ExcelFileFormat.XLSX)
Dim worksheet As WorkSheet = workbook.CreateWorkSheet("Report")

' Assume dataTable is populated from your data source
For col As Integer = 0 To dataTable.Columns.Count - 1
    worksheet.SetCellValue(0, col, dataTable.Columns(col).ColumnName)
Next

For row As Integer = 0 To dataTable.Rows.Count - 1
    For col As Integer = 0 To dataTable.Columns.Count - 1
        worksheet.SetCellValue(row + 1, col, dataTable.Rows(row)(col).ToString())
    Next
Next

Dim fileBytes As Byte() = workbook.ToByteArray()
Return File(fileBytes, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "Report.xlsx")
$vbLabelText   $csharpLabel

ASP.NETから DataTable を Excel にエクスポートするチュートリアルでは、 ASP.NETアプリケーションのコントローラーとビューの配線手順全体を詳しく解説します。 DataTable から Excel への C# ガイドでは、複数シートのエクスポートや DataSet のサポートなど、その他のシナリオについても解説しています。

オレDBとIronXLの比較概要

C# での DataTable から Excel へのエクスポートにおける オレDB とIronXLの機能比較
能力 オレDB IronXL
ドライバーのインストールが必要です はい(ACE.OLEDBまたはJet) なし
クロスプラットフォーム(.NET 10 / Linux) なし はい
新規ワークブックをゼロから作成する なし はい
セルの書式設定とスタイル設定 なし はい
数式サポート なし はい
バッチ挿入のパフォーマンス 1列ずつ(ゆっくり) インメモリ(高速)
行削除のサポート なし はい
Docker / コンテナのサポート なし はい

エクスポート時に列のデータ型をどのように処理しますか?

DataTableの列に数値または日付の値が格納されている場合、それらを文字列として書き込むと、Excelはセルをテキストとして扱い、並べ替え、フィルタリング、および数式参照が無効になります。 IronXL は、.ToString() を呼び出すのではなく値を直接渡すとネイティブ型を保持します。

WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLSX);
WorkSheet worksheet = workbook.CreateWorkSheet("TypedData");

DataTable table = new DataTable();
table.Columns.Add("ID", typeof(int));
table.Columns.Add("Amount", typeof(decimal));
table.Columns.Add("Date", typeof(DateTime));
table.Rows.Add(1, 1500.75m, new DateTime(2025, 6, 15));
table.Rows.Add(2, 3200.00m, new DateTime(2025, 7, 4));

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

// Write typed values -- no .ToString() conversion
for (int row = 0; row < table.Rows.Count; row++)
{
    worksheet.SetCellValue(row + 1, 0, (int)table.Rows[row]["ID"]);
    worksheet.SetCellValue(row + 1, 1, (double)(decimal)table.Rows[row]["Amount"]);
    worksheet[$"C{row + 2}"].Value = (DateTime)table.Rows[row]["Date"];
    worksheet[$"C{row + 2}"].FormatString = "yyyy-MM-dd";
}

workbook.SaveAs("TypedData.xlsx");
WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLSX);
WorkSheet worksheet = workbook.CreateWorkSheet("TypedData");

DataTable table = new DataTable();
table.Columns.Add("ID", typeof(int));
table.Columns.Add("Amount", typeof(decimal));
table.Columns.Add("Date", typeof(DateTime));
table.Rows.Add(1, 1500.75m, new DateTime(2025, 6, 15));
table.Rows.Add(2, 3200.00m, new DateTime(2025, 7, 4));

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

// Write typed values -- no .ToString() conversion
for (int row = 0; row < table.Rows.Count; row++)
{
    worksheet.SetCellValue(row + 1, 0, (int)table.Rows[row]["ID"]);
    worksheet.SetCellValue(row + 1, 1, (double)(decimal)table.Rows[row]["Amount"]);
    worksheet[$"C{row + 2}"].Value = (DateTime)table.Rows[row]["Date"];
    worksheet[$"C{row + 2}"].FormatString = "yyyy-MM-dd";
}

workbook.SaveAs("TypedData.xlsx");
Imports System
Imports System.Data

Dim workbook As WorkBook = WorkBook.Create(ExcelFileFormat.XLSX)
Dim worksheet As WorkSheet = workbook.CreateWorkSheet("TypedData")

Dim table As New DataTable()
table.Columns.Add("ID", GetType(Integer))
table.Columns.Add("Amount", GetType(Decimal))
table.Columns.Add("Date", GetType(DateTime))
table.Rows.Add(1, 1500.75D, New DateTime(2025, 6, 15))
table.Rows.Add(2, 3200.00D, New DateTime(2025, 7, 4))

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

' Write typed values -- no .ToString() conversion
For row As Integer = 0 To table.Rows.Count - 1
    worksheet.SetCellValue(row + 1, 0, CInt(table.Rows(row)("ID")))
    worksheet.SetCellValue(row + 1, 1, CDbl(CDec(table.Rows(row)("Amount"))))
    worksheet($"C{row + 2}").Value = CType(table.Rows(row)("Date"), DateTime)
    worksheet($"C{row + 2}").FormatString = "yyyy-MM-dd"
Next

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

Excelでは、金額列を数値順に並べ替えたり、日付列を日付選択ツールで絞り込んだりできるようになりました。 その他のデータ形式パターンについては、 "セルデータ形式設定ガイド"を参照してください。 エクスポート後にデータを読み戻す必要がある場合は、 "ExcelからDataTableへの変換"チュートリアルで逆の操作方法が説明されています。

既存のオレDBエクスポートコードの移行

オレDBからIronXLへの移行は、通常、1回のスプリントよりも短い時間で完了します。 構造的な変更点は以下のとおりです。

  1. すべての using System.Data.OleDb 参照と、ACE ドライバー ラッパー パッケージへのNuGet参照を削除します。
  2. OleDbConnection 初期化ブロックを WorkBook.Create(ExcelFileFormat.XLSX) に置き換えます。
  3. CREATE TABLE コマンドを workbook.CreateWorkSheet("SheetName") に置き換えます。
  4. INSERT INTO ループを、セルごとに 1 つのネストされた SetCellValue() 呼び出しに置き換えます。
  5. connection.Close()workbook.SaveAs("output.xlsx") に置き換えます。

また、下流の利用者がまだ Excel 2007 以降にアップグレードしていない場合は、workbook.SaveAs().xls 拡張子付きで呼び出すことで、レガシー形式のファイルを作成することもできます。 スプレッドシートファイル形式の変換ガイドには、サポートされているすべての出力形式が記載されています。

IronXLのテストとライセンス取得はどのように行いますか?

IronXLは、試用ライセンスを使用すれば開発用途で無料で利用できます。 最初のIronXL呼び出しの前に、コード内でキーを適用します。

IronXl.License.LicenseKey = "YOUR-LICENSE-KEY-HERE";
IronXl.License.LicenseKey = "YOUR-LICENSE-KEY-HERE";
Imports IronXl

IronXl.License.LicenseKey = "YOUR-LICENSE-KEY-HERE"
$vbLabelText   $csharpLabel

ライセンスキーの適用ガイドでは、設定ファイルや環境変数など、すべての配置オプションについて詳しく説明しています。 クラウド環境への導入については、 DockerLinuxの入門ページでプラットフォーム固有の設定手順を説明しています。

Microsoftは、オレDBシナリオにおけるAccessデータベースエンジンの既知の制限事項を文書化しており、 NuGet、完全なバージョン履歴とダウンロード統計情報を含むIronXLパッケージが提供されています。 公式のOpen XML SDKドキュメントには、 IronXLが実装している基盤となるXLSX仕様について説明されています。

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

これで、オレDBドライバ、SQL構文、プラットフォームの制限なしに、DataTableをXLSXファイルにエクスポートするための実用的なパターンが完成しました。 コアとなるワークフローは、ループ内で SetCellValue() を実行し、その後 SaveAs() -- 3 行のサンプルから数十万行のデータセットまで拡張できます。

まず、既存の オレDB エクスポートを上記に示した基本的なIronXLパターンに置き換え、データのエクスポートが検証されたら、スタイリング API を使用してフォーマットを重ねていきます。 IronXLの入門ガイド機能概要は、ライブラリがサポートする機能の全容を理解するために、次に読むべき良い資料です。 同じパイプラインの一部としてCSVファイルを扱う場合は、 C# DataTableからCSVへの変換ガイドで、同じDataTableオブジェクトからカンマ区切りの出力を生成する方法が説明されています。

よくある質問

C# で OleDb を使用して DataTable を Excel にエクスポートする場合の制限は何ですか?

C#でOleDbを使用してDataTableをExcelにエクスポートするのは、そのレガシーな性質のために面倒な場合があります。開発者は互換性の問題、パフォーマンスの低下、エラー処理の複雑化といった制限に直面することが多く、 IronXLのような最新の代替手段の方が魅力的です。

IronXL はDataTable を Excel にエクスポートするプロセスをどのように改善しますか?

IronXLは、DataTableをExcelにエクスポートするための最新のアプローチを提供し、優れたパフォーマンス、幅広い互換性、そして簡素化されたコードを実現します。OleDbでよくあるフラストレーションを解消し、 .NET開発者がExcelエクスポートをより簡単に管理できるようにします。

DataTable エクスポートのために OleDb からIronXLへの切り替えを検討する必要があるのはなぜですか?

DataTable エクスポートにIronXLに切り替えると、パフォーマンスの向上、実装の簡素化、最新 for .NETアプリケーションとの互換性の強化など、いくつかの利点が得られ、開発に必要な時間と労力が削減されます。

IronXL は、大規模な DataTable エクスポートを OleDb よりも効率的に処理できますか?

はい、 IronXLは大規模な DataTable エクスポートを効率的に処理するように設計されており、OleDb と比較して処理時間が短縮され、メモリ使用量が削減されるため、大量のデータ セットを扱うアプリケーションに最適です。

IronXL は最新バージョンの C# および.NETと互換性がありますか?

IronXL は最新バージョンの C# および.NETと完全に互換性があり、最新のアプリケーションとのシームレスな統合を保証すると同時に、新機能や改善点をサポートする継続的な更新を提供します。

IronXLのような最新の代替手段は、従来の OleDb に比べてどのような利点がありますか?

IronXLのような最新の代替手段は、パフォーマンスの向上、エラー処理の簡素化、さまざまな Excel 形式との互換性の向上、コードの簡素化などの利点を提供し、開発者の生産性を大幅に向上させます。

OleDb と比較して、 IronXL はエラー管理をどのように処理しますか?

IronXL は、明確な例外処理による簡素化されたエラー管理を提供し、OleDb に関連する複雑さと潜在的な問題を軽減するため、開発者がアプリケーションをデバッグおよび保守しやすくなります。

UI ベース for .NETアプリケーションで DataTable を Excel にエクスポートする一般的な使用例は何ですか?

UI ベース for .NETアプリケーションでは、DataTable を Excel にエクスポートすることは、レポートの生成、データ分析、およびユーザーフレンドリなデータ操作によく使用され、多くの場合、オブジェクト センダー パターンを使用するイベント ハンドラーからトリガーされます。

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

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

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

アイアンサポートチーム

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