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のパッケージマネージャーコンソールで@--CODE-42828--@@コマンドを使用してください:
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
インストール後、 IronXL名前空間をインポートするためのトップレベルのusingステートメントを追加します。
using IronXL;
using System.Data;
using IronXL;
using System.Data;
Imports IronXL
Imports System.Data
IronXLは、.NET 8、 .NET 9、 .NET 10に加え、それ以前の.NET Frameworkバージョン(4.6.2以降)にも対応しています。 サーバー、デスクトップ、クラウドなど、どのマシンにもOfficeをインストールする必要はありません。 パッケージをインストールすると、XLSX、XLS、CSVファイルの作成、読み取り、書き込みをすべてマネージドコードで行うことができます。
詳細なインストール方法については、IronXLのインストールガイドを参照してください。また、バージョン履歴についてはNuGetパッケージのページをご覧ください。
単一のデータテーブルをExcelファイルにエクスポートするにはどうすればよいですか?
最も一般的なシナリオは、1つのデータテーブルを1つのワークシートにエクスポートすることです。 IronXLのWorkBookとWorkSheetクラスはエクセルのオブジェクトモデルに自然にマッピングされます。 ワークブックを作成し、ワークシートを追加してから、データテーブルの列と行を反復処理します。
次の例では、メモリ内に Employees DataTable を作成し、それを 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")
出力
How to Export Dataset to Excel VB .NET:IronXLによる完全ガイド:イメージ1 - VB.NETで単純なDataTableをExcelにエクスポートする出力。
CODE-42832は、int、double、string、boolを受け付けます。 IronXLはメモリに直接書き込み、ディスクにフラッシュするため、ループパターンはどのようなサイズのテーブルでも機能します。
読み書きのテクニックについてより詳しく知りたい場合は、 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")
出力
各ワークシートは元のデータテーブルと同じ名前になっているため、Excel内でのナビゲーションが容易です。 CODE-42835--@@@はメモリ上にワークブックを割り当てるので、ファイルを再度開くことなく、ループ内でワークシートを追加し続けることができます -- IronXLはディスクに書き込む前にXLSX構造全体を構築します。
IronXLのWorkBookに関するドキュメントには、シートの並べ替え、パスワード保護、XLSX以外の形式での保存など、WorkBookオブジェクトで利用可能なすべてのメソッドが記載されています。
Excelエクスポートにヘッダー書式を追加するにはどうすればよいですか?
プレーンなデータエクスポートでも機能はしますが、太字のヘッダーと列幅を追加することで、出力結果をビジネス環境ですぐに利用できるようになります。 IronXLは任意のStyle範囲にアタッチされたWorkSheetオブジェクトを通してセルと範囲のスタイルを公開します。
以下のコードスニペットは、ヘッダー行に太字のフォント書式を適用し、データ書き込み後に列のサイズを自動的に調整します。
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("なしrth", 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("なしrth", 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("なしrth", 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")
CODE-42838--@@@プロパティは、1つの文でヘッダー範囲全体に適用されます。 XLは背景色(@--CODE-42839--@@)、ボーダースタイル(@--CODE-42840--@)、数値フォーマット(@--CODE-42841--@)、水平アライメント(@--CODE-42842--@)もサポートしています。 スタイルに関する詳細については、IronXLのセル書式設定ガイドを参照してください。
データベースのクエリ結果をExcelにエクスポートするにはどうすればよいですか?
SQLデータベースに接続し、結果をExcelに直接エクスポートする機能は、定期レポート、データスナップショット、管理用エクスポートなど、実際の業務における主要なユースケースに対応しています。 このアプローチはSqlDataAdapterを使用してDataSetを埋め、結果のDataTableをXLワークシートにマップします。
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.")
データベースエクスポートの重要ポイント
null ガード (cellValue == DBNull.Value ? "" : cellValue.ToString()@--CODE-42844--@@NULL 値 -- オプションの列でよく発生する。 ヘッダー行を太字にすることで、レポートの受信者はヘッダーとデータをすぐに区別できます。
ExcelからC#オブジェクトにデータを読み戻す際のその他のパターンについては、 IronXL DataTableのエクスポートチュートリアルで、このワークフローを逆にする方法が説明されています。
IronXLを他のExcelエクスポート方法と比較するとどうですか?
ライブラリを選択する前に、データセットのエクスポートシナリオにおいて最も重要な領域で、主要な選択肢が互いにどのように比較されるかを理解しておくことが役立ちます。
| アプローチ | オフィス必須 | XLSXサポート | スタイリングAPI | 複数枚 | パフォーマンス(大規模データ) |
|---|---|---|---|---|---|
| IronXL | なし | はい | 満杯 | はい | 高い |
| Microsoft Office Interop | はい | はい | 満杯 | はい | 低い |
| EPPlus | なし | はい | 部分的 | はい | 高い |
| ClosedXML | なし | はい | 部分的 | はい | 中くらい |
| CSV(手動) | なし | なし | 該当なし | なし | 非常に高い |
Microsoft Office Interopは、OfficeがインストールされているWindowsマシンでのみ動作するため、サーバー展開やクラウド機能には適用できません。 IronXL、EPPlus、ClosedXMLはいずれもサーバーサイド生成をサポートしており、主な違いはスタイリングAPIの幅広さとライセンスモデルにある。 IronXLのライセンスには商用利用が含まれており、単一のパッケージで全ての.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
このパターンは、結果セットが 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")
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
.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 -- 構造化データのエクスポート
CODE-42849--@@パスのファイル拡張子を変更するか、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}")
この検証パターンは、ファイルを外部システムに送信する前にエクスポートの正しさを確認する必要がある統合テストスイートにおいて特に有用です。 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 形式をサポートし、すべての.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 を提供します。



