
IronXLを使用して C# で SQL データを Excel にエクスポートする
SQL ServerからMicrosoft Excelへのデータのエクスポートは、レポートシステム、データ分析ツール、およびビジネスアプリケーションを構築する.NET開発者にとって一般的な作業です。 このチュートリアルでは、Microsoft Officeのインストールを必要とせずに処理全体を処理する.NET ExcelライブラリであるIronXLを使用して、C#でSQLデータをExcelにエクスポートする方法を説明します。
無料トライアルを開始して、以下のコード例に従ってください。
SQLデータエクスポート用のIronXLはどのようにインストールするのですか?
コードを記述する前に、プロジェクトにIronXLを追加する必要があります。 最も簡単な方法は、Visual Studio のNuGetパッケージ マネージャー コンソールを使用することです。
または、 .NET CLI を使用してください。
インストールが完了したら、ファイルの先頭に必要な名前空間を追加します。.NET 10のトップレベルステートメントを使用した場合、設定は次のようになります。
using IronXL;
using System.Data;
using System.Data.SqlClient;Imports IronXL
Imports System.Data
Imports System.Data.SqlClientIronXLは.NET Standard 2.0以降を対象としているため、追加の設定なしで.NET 10、 .NET Framework、 ASP.NET Core、およびBlazorプロジェクトと連携して動作します。 このパッケージはNuGetで入手できます。
SQLサーバーのデータベースからデータをエクスポートする最良の方法は何ですか?
SQL ServerからExcelファイルへデータをエクスポートする最も効率的な方法は、データベース接続を確立し、DataTableへデータを取得し、IronXLを使用してデータをExcelシートに書き込む3つのステップを含みます。 Microsoftの相互運用ソリューションとは異なり、 IronXLは独立して動作し、COM相互運用オーバーヘッドによるパフォーマンスのボトルネックなしに大規模なデータセットを処理できます。
基本的なパターンは単純明快だ。 SqlDataAdapterは、MicrosoftのADO.NETデータアクセスフレームワークの一部であり、.NET 1.0以来、リレーショナルデータベースからDataTableオブジェクトを埋めるための標準的な方法です。
- 接続文字列を用いて
SqlConnectionを開く DataSetを埋める- IronXLのメソッドを呼び出してワークブックを作成し、ワークシートのセルにデータを入力します。
- ワークブックを
.xlsとして保存する
この方法は、SQL Server 2012以降、Azure SQL Database、Amazon RDS for SQL Server、およびADO.NET互換のデータソースと互換性があります。 コンソールアプリケーションを使用する場合でも、Webベースのレポートツールを使用する場合でも、同じパターンが適用されます。
どのように SQL Server に接続し、データを取得しますか?
SQLデータをエクスポートする前に、接続を確立し、SQLクエリを実行してDataTableを埋める必要があります。 接続文字列には、データへのアクセスに必要なSQL Serverデータベースの認証情報とサーバー情報が含まれています。
次の例では、なしrthwind Customers テーブルに対してクエリを実行し、 IronXL のセル書き込み APIを使用して各行を Excel ワークシートに書き込みます。
using IronXL;
using System.Data;
using System.Data.SqlClient;
string connectionString = "Data Source=localhost;Initial Catalog=なしrthwind;Integrated Security=True";
string sql = "SELECT * FROM Customers";
using SqlConnection connection = new SqlConnection(connectionString);
connection.Open();
SqlDataAdapter adapter = new SqlDataAdapter(sql, connection);
DataTable dt = new DataTable();
adapter.Fill(dt);
WorkBook workBook = WorkBook.Create(ExcelFileFormat.XLSX);
WorkSheet workSheet = workBook.CreateWorkSheet("Customers");
// Write column headers
for (int col = 0; col < dt.Columns.Count; col++)
{
workSheet.SetCellValue(0, col, dt.Columns[col].ColumnName);
}
// Write data rows
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("CustomerExport.xlsx");
出力

このコードは、SQL Serverのテーブル構造から適切な形式の列ヘッダーを持つExcelファイルを作成します。 DataTable dtはクエリの結果を格納し、それをゼロベースの行と列のインデックスを使用して、各セルに体系的に書き込みます。 IronXLは、Microsoft Officeアプリケーションと広範な互換性を持つ.xlsx形式の両方をサポートしています。
SQLテーブルにSetCellValueを呼び出す前にセル値を適切にキャストしてください。 数値型を直接渡すことで、Excelのデータ型が保持され、エクスポートされた列に対して並べ替えや数式計算が可能になります。
LoadWorkSheetsFromDataSet を使用して複数のテーブルをエクスポートするにはどうすればよいですか?
レポートが複数のSQLテーブルからデータを必要とする場合、例えば、製品とカテゴリーのテーブルからなら、DataSetにロードし、IronXLが自動的に各テーブルに対してワークシートを作成できます。 これは、DataSetまたはDataTableをExcelにエクスポートするための最も簡潔な方法です。
using IronXL;
using System.Data;
using System.Data.SqlClient;
string connectionString = "Data Source=.;Initial Catalog=Inventory;Integrated Security=True";
using SqlConnection connection = new SqlConnection(connectionString);
connection.Open();
SqlDataAdapter productsAdapter = new SqlDataAdapter("SELECT * FROM Products", connection);
SqlDataAdapter categoriesAdapter = new SqlDataAdapter("SELECT * FROM Categories", connection);
DataSet dataSet = new DataSet();
productsAdapter.Fill(dataSet, "Products");
categoriesAdapter.Fill(dataSet, "Categories");
WorkBook workBook = WorkBook.Create(ExcelFileFormat.XLSX);
WorkBook.LoadWorkSheetsFromDataSet(dataSet, workBook);
workBook.SaveAs("InventoryReport.xlsx");Imports IronXL
Imports System.Data
Imports System.Data.SqlClient
Dim connectionString As String = "Data Source=.;Initial Catalog=Inventory;Integrated Security=True"
Using connection As New SqlConnection(connectionString)
connection.Open()
Dim productsAdapter As New SqlDataAdapter("SELECT * FROM Products", connection)
Dim categoriesAdapter As New SqlDataAdapter("SELECT * FROM Categories", connection)
Dim dataSet As New DataSet()
productsAdapter.Fill(dataSet, "Products")
categoriesAdapter.Fill(dataSet, "Categories")
Dim workBook As WorkBook = WorkBook.Create(ExcelFileFormat.XLSX)
WorkBook.LoadWorkSheetsFromDataSet(dataSet, workBook)
workBook.SaveAs("InventoryReport.xlsx")
End Using出力

TableNameプロパティを読み取り、一致するワークシートタブを作成します。 DataTableからの列名は各シートのヘッダー行になります。 この方法は、複数の結果セットを返すストアドプロシージャに特に有用です。SqlDataAdapter呼び出しで満たし、すべてを一度にエクスポートすることが可能だからです。
カスタムフォーマットでプログラム的にExcelファイルを作成する必要があるアプリケーションでは、LoadWorkSheetsFromDataSetを呼び出した後にも個々のワークシートにアクセスでき、保存前にスタイル、列幅、または数式を適用できます。
どのようにASP.NETエクスポートボタンを使用してデータをエクスポートできますか?
ウェブアプリケーションの場合、通常はユーザーがボタンをクリックしたときにエクスポート処理が実行されます。 以下のASP.NET Webフォームの例は、ボタンクリックイベントを処理し、SQLクエリからExcelワークブックを構築し、Response.AddHeaderを使用してファイルをダウンロードとしてブラウザに送る方法を示しています。
using IronXL;
using System;
using System.Data;
using System.Data.SqlClient;
using System.IO;
using System.Web.UI;
public partial class ExportPage : Page
{
private void ExportButton_Click(object sender, EventArgs e)
{
string connectionString = "Data Source=localhost;Initial Catalog=Sales;Integrated Security=True";
using SqlConnection connection = new SqlConnection(connectionString);
SqlDataAdapter adapter = new SqlDataAdapter("SELECT * FROM Orders", connection);
DataSet dataSet = new DataSet();
adapter.Fill(dataSet);
WorkBook workBook = WorkBook.Create(ExcelFileFormat.XLSX);
WorkBook.LoadWorkSheetsFromDataSet(dataSet, workBook);
byte[] fileBytes = workBook.ToByteArray();
string filename = "OrdersExport.xlsx";
Response.Clear();
Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
Response.AddHeader("content-disposition", "attachment;filename=" + filename);
Response.BinaryWrite(fileBytes);
Response.End();
}
}Imports IronXL
Imports System
Imports System.Data
Imports System.Data.SqlClient
Imports System.IO
Imports System.Web.UI
Public Partial Class ExportPage
Inherits Page
Private Sub ExportButton_Click(sender As Object, e As EventArgs)
Dim connectionString As String = "Data Source=localhost;Initial Catalog=Sales;Integrated Security=True"
Using connection As New SqlConnection(connectionString)
Dim adapter As New SqlDataAdapter("SELECT * FROM Orders", connection)
Dim dataSet As New DataSet()
adapter.Fill(dataSet)
Dim workBook As WorkBook = WorkBook.Create(ExcelFileFormat.XLSX)
WorkBook.LoadWorkSheetsFromDataSet(dataSet, workBook)
Dim fileBytes As Byte() = workBook.ToByteArray()
Dim filename As String = "OrdersExport.xlsx"
Response.Clear()
Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
Response.AddHeader("content-disposition", "attachment;filename=" & filename)
Response.BinaryWrite(fileBytes)
Response.End()
End Using
End Sub
End Classエクスポート ボタンの例

出力

ToByteArray()メソッドはワークブック全体をメモリ内のバイト配列に変換し、それをHTTPレスポンスストリームに直接書き込むことができます。 これにより、一時ファイルをディスクに書き込むことを回避できます。 Microsoft Interopとは異なり、object misValueプレースホルダーやサーバー上のインストールされたOfficeライセンスが必要ですが、IronXLは管理コードだけで動作し、外部依存関係はありません。
ASP.NET CoreおよびRazor Pagesプロジェクトの場合、コントローラーアクションからreturn File(fileBytes, contentType, filename)と置き換えます。 ASP.NET CoreExcel へのエクスポートパターンは、ワークブックをバイト配列に変換する同じアプローチに従います。
エクスポートしたExcelファイルに書式設定と列ヘッダーを追加するにはどうすればよいですか?
生のSQLエクスポートデータは、エンドユーザーと共有する前に、表示方法を改善する必要がある場合が多い。 IronXL、データがワークシートに書き込まれた後でも、セルスタイル、列幅、数値形式を制御できます。 次の例は、ヘッダー行を太字にし、列幅を自動調整する方法を示しています。
using IronXL;
using System.Data;
using System.Data.SqlClient;
string connectionString = "Data Source=localhost;Initial Catalog=Sales;Integrated Security=True";
using SqlConnection connection = new SqlConnection(connectionString);
connection.Open();
SqlDataAdapter adapter = new SqlDataAdapter("SELECT OrderID, CustomerID, OrderDate, Total FROM Orders", connection);
DataTable dt = new DataTable();
adapter.Fill(dt);
WorkBook workBook = WorkBook.Create(ExcelFileFormat.XLSX);
WorkSheet workSheet = workBook.CreateWorkSheet("Orders");
// Write and style header row
for (int col = 0; col < dt.Columns.Count; col++)
{
workSheet.SetCellValue(0, col, dt.Columns[col].ColumnName);
workSheet[0, col].Style.Font.Bold = true;
workSheet[0, col].Style.Font.Height = 12;
}
// Write data rows with type-aware value assignment
for (int row = 0; row < dt.Rows.Count; row++)
{
for (int col = 0; col < dt.Columns.Count; col++)
{
object value = dt.Rows[row][col];
if (value is DateTime date)
workSheet.SetCellValue(row + 1, col, date.ToString("yyyy-MM-dd"));
else if (value is decimal || value is double || value is int)
workSheet.SetCellValue(row + 1, col, Convert.ToDouble(value));
else
workSheet.SetCellValue(row + 1, col, value.ToString());
}
}
workBook.SaveAs("FormattedOrdersExport.xlsx");Imports IronXL
Imports System.Data
Imports System.Data.SqlClient
Dim connectionString As String = "Data Source=localhost;Initial Catalog=Sales;Integrated Security=True"
Using connection As New SqlConnection(connectionString)
connection.Open()
Dim adapter As New SqlDataAdapter("SELECT OrderID, CustomerID, OrderDate, Total FROM Orders", connection)
Dim dt As New DataTable()
adapter.Fill(dt)
Dim workBook As WorkBook = WorkBook.Create(ExcelFileFormat.XLSX)
Dim workSheet As WorkSheet = workBook.CreateWorkSheet("Orders")
' Write and style header row
For col As Integer = 0 To dt.Columns.Count - 1
workSheet.SetCellValue(0, col, dt.Columns(col).ColumnName)
workSheet(0, col).Style.Font.Bold = True
workSheet(0, col).Style.Font.Height = 12
Next
' Write data rows with type-aware value assignment
For row As Integer = 0 To dt.Rows.Count - 1
For col As Integer = 0 To dt.Columns.Count - 1
Dim value As Object = dt.Rows(row)(col)
If TypeOf value Is DateTime Then
Dim dateValue As DateTime = CType(value, DateTime)
workSheet.SetCellValue(row + 1, col, dateValue.ToString("yyyy-MM-dd"))
ElseIf TypeOf value Is Decimal OrElse TypeOf value Is Double OrElse TypeOf value Is Integer Then
workSheet.SetCellValue(row + 1, col, Convert.ToDouble(value))
Else
workSheet.SetCellValue(row + 1, col, value.ToString())
End If
Next
Next
workBook.SaveAs("FormattedOrdersExport.xlsx")
End Usingヘッダー行を太字と大きなフォントで装飾すると、Excelでエクスポートしたレポートが読みやすくなります。 合計や件数などの数値列に対しては、文字列ではなくdouble値を渡すことで、エクスポートされたデータに対してExcelのネイティブなソートや集計機能が正確に動作します。
セル境界線、背景色、数値形式マスクを含む全体の形式設定オプション範囲をIronXLセルのフォーマットドキュメントで探索することができます。
大規模なSQLデータセットを効率的に処理するにはどうすればよいでしょうか?
数万行ものデータを含むテーブルでは、メモリ管理が重要になります。 結果セット全体をExcelに書き込む前にSqlDataReaderを直接使用することができます。
大量輸出を行う際には、以下の戦略を検討してください。
- SQL OFFSET/FETCH を使用したページ分割: 大量のエクスポートを複数のワークシートに分割し、各ワークシートに結果の 1 ページ分を含めます。 これにより、Excelにおける個々のシートサイズを管理しやすい状態に保つことができます。
- ストリームをディスクへ: すべてをメモリに保持する
workBook.SaveAs(filePath)を呼び出します。 - 選択した列を制限: SQLサーバーから転送されるデータ量を減らすために
SELECT *を避けます。
C#でDataTableをExcelにエクスポートする最速の方法については、 IronXLブログにさまざまなアプローチとそのメモリプロファイルを比較した専用のベンチマーク記事があります。
DataSetオブジェクトに特に効率的です。 特にDataTableからExcelへのエクスポートシナリオにおいては、この方法は定型コードを削減し、一括書き込みに最適化されています。
ExcelからSQL Serverにデータをインポートするにはどうすればよいですか?
多くのレポート作成アプリケーションにとって、エクスポートワークフローは全体の半分に過ぎない。 ユーザーがテンプレートをダウンロードし、データを入力して、SQL Serverに再アップロードできるようにする必要がある場合もあります。 IronXLを使えば、この双方向ワークフローが簡単に実現できます。
Excelデータをデータベースにインポートするには、アップロードされたファイルをSqlCommandを使用して各行を挿入します。
using IronXL;
using System.Data.SqlClient;
WorkBook workBook = WorkBook.Load("UploadedData.xlsx");
WorkSheet sheet = workBook.DefaultWorkSheet;
string connectionString = "Data Source=localhost;Initial Catalog=Inventory;Integrated Security=True";
using SqlConnection connection = new SqlConnection(connectionString);
connection.Open();
// Skip header row, start at row index 1
for (int row = 1; row <= sheet.RowCount; row++)
{
string productName = sheet[row, 0].StringValue;
int quantity = (int)sheet[row, 1].DoubleValue;
decimal price = (decimal)sheet[row, 2].DoubleValue;
using SqlCommand cmd = new SqlCommand(
"INSERT INTO Products (Name, Quantity, Price) VALUES (@name, @qty, @price)",
connection);
cmd.Parameters.AddWithValue("@name", productName);
cmd.Parameters.AddWithValue("@qty", quantity);
cmd.Parameters.AddWithValue("@price", price);
cmd.ExecuteNonQuery();
}Imports IronXL
Imports System.Data.SqlClient
Dim workBook As WorkBook = WorkBook.Load("UploadedData.xlsx")
Dim sheet As WorkSheet = workBook.DefaultWorkSheet
Dim connectionString As String = "Data Source=localhost;Initial Catalog=Inventory;Integrated Security=True"
Using connection As New SqlConnection(connectionString)
connection.Open()
' Skip header row, start at row index 1
For row As Integer = 1 To sheet.RowCount
Dim productName As String = sheet(row, 0).StringValue
Dim quantity As Integer = CInt(sheet(row, 1).DoubleValue)
Dim price As Decimal = CDec(sheet(row, 2).DoubleValue)
Using cmd As New SqlCommand("INSERT INTO Products (Name, Quantity, Price) VALUES (@name, @qty, @price)", connection)
cmd.Parameters.AddWithValue("@name", productName)
cmd.Parameters.AddWithValue("@qty", quantity)
cmd.Parameters.AddWithValue("@price", price)
cmd.ExecuteNonQuery()
End Using
Next
End Usingパラメータ化クエリは、ユーザーが提供したExcelデータを読み取る際に、SQLインジェクション攻撃から保護します。 Microsoft Learn の SqlCommand ドキュメントには、利用可能なすべてのオーバーロードとパラメーターバインディングパターンが網羅されています。 挿入する前に必ずセル値を検証してください。空の文字列、範囲外の数値、予期しないデータ型など、SQL Serverテーブルの制約違反を引き起こす可能性のあるものがないか確認してください。
逆方向の場合、IronXLはデータソースが.xlsxファイルの代わりにカンマ区切り出力を生成するシナリオにおいてC#でCSVファイルを読むこともサポートしています。
IronXLを他のエクスポート手法と比較するとどうですか?
.NETでSQLデータをExcelにエクスポートするには、いくつかの方法があります。 以下の表は、主なトレードオフをまとめたものです。
| アプローチ | オフィス必須 | データセットのサポート | 書式設定 | サーバーセーフ |
|---|---|---|---|---|
| IronXL | なし | はい(内蔵) | フルスタイル、フォーミュラ | はい |
| Microsoft Interop | はい | 手動反復 | COM経由でフル | いいえ(COMサーバー) |
| EPPlus | なし | 手動反復 | 広範囲にわたる | はい |
| NPOI | なし | 手動反復 | 良い | はい |
| CSV出力 | なし | マニュアル | なしne | はい |
Microsoft Interopは、サーバーにOfficeがインストールされていることを前提としており、サーバー側のWebアプリケーションではサポートされていません。 IronXL、EPPlus、およびNPOIはすべてOfficeなしで動作します。IronXLの利点は、その一流のLoadWorkSheetsFromDataSetで、他のライブラリでは手動で行の反復が必要とされる場合と比べて、エクスポートコードを数行に減らします。
詳細な比較については、 Microsoft Office Interopの代替製品に関する記事を参照してください。
次のステップは何ですか?
C#を使用してSQLデータをExcelにエクスポートするのは、IronXLを使えば簡単です。 ライブラリは、複雑なInterop依存関係を排除し、@--CODE-638--@@、DataSet、および直接のデータベース統合を強力にサポートします。 コンソールアプリケーションの構築であれ、ファイルダウンロード機能を備えたWebベースのレポートシステムの構築であれ、 IronXLはあらゆる.NET 10プロジェクトタイプにおいて、信頼性の高いExcelファイル生成機能を提供します。
この基盤をさらに発展させるために、以下の関連リソースをご覧ください。
- C#でExcelファイルを作成する-- ワークブックの作成と書式設定に関する完全チュートリアル
- DataSetおよびDataTableをExcelにエクスポート --
LoadWorkSheetsFromDataSetメソッドの公式ハウツーガイド - ExcelからSQLへのデータインポート- 完全な往復ワークフロー
- DataTableからExcelへのエクスポート-- 単一テーブルシナリオに特化したガイド
- ASP.NETデータテーブルを Excel にエクスポート-- Web アプリケーションのエクスポートパターン
- データテーブルをExcelにエクスポートする最速の方法- パフォーマンスベンチマーク
本番環境への導入にはライセンスをご購入いただくか、無料トライアルでこのExcelライブラリの全機能を.NETプロジェクトでお試しください。

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



