IronXLを使用して C# で SQL データを Excel にエクスポートする
SQL ServerからMicrosoft Excelへのデータのエクスポートは、レポートシステム、データ分析ツール、およびビジネスアプリケーションを構築する.NET開発者にとって一般的な作業です。 このチュートリアルでは、Microsoft Officeのインストールを必要とせずに処理全体を処理する.NET ExcelライブラリであるIronXLを使用して、C#でSQLデータをExcelにエクスポートする方法を説明します。
無料トライアルを開始して、以下のコード例に従ってください。
SQLデータエクスポート用のIronXLはどのようにインストールするのですか?
コードを記述する前に、プロジェクトにIronXLを追加する必要があります。 最も簡単な方法は、Visual Studio のNuGetパッケージ マネージャー コンソールを使用することです。
Install-Package IronXL.Excel
Install-Package IronXL.Excel
または、 .NET CLI を使用してください。
dotnet add package IronXL.Excel
dotnet add package IronXL.Excel
インストールが完了したら、ファイルの先頭に必要な名前空間を追加します。.NET 10のトップレベルステートメントを使用した場合、設定は次のようになります。
using IronXL;
using System.Data;
using System.Data.SqlClient;
using IronXL;
using System.Data;
using System.Data.SqlClient;
Imports IronXL
Imports System.Data
Imports System.Data.SqlClient
IronXLは.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 以降、リレーショナル データベースからオブジェクトにデータを格納する標準的な方法となっています。
- 接続文字列を使用して
SqlConnectionを開きます。 SqlDataAdapterを使用して、DataTableまたはDataSetを埋めます。- IronXLのメソッドを呼び出してワークブックを作成し、ワークシートのセルにデータを入力します。
- ワークブックを
.xlsxまたは.xlsとして保存します。
この方法は、SQL Server 2012以降、Azure SQL Database、Amazon RDS for SQL Server、およびADO.NET互換のデータソースと互換性があります。 コンソールアプリケーションを使用する場合でも、Webベースのレポートツールを使用する場合でも、同じパターンが適用されます。
どのように SQL Server に接続し、データを取得しますか?
SQL データをエクスポートする前に、接続を確立し、SQL クエリを実行して DataTable を埋める必要があります。 接続文字列には、データへのアクセスに必要なSQL Serverデータベースの認証情報とサーバー情報が含まれています。
次の例では、Northwind Customers テーブルに対してクエリを実行し、 IronXL のセル書き込み APIを使用して各行を Excel ワークシートに書き込みます。
using IronXL;
using System.Data;
using System.Data.SqlClient;
string connectionString = "Data Source=localhost;Initial Catalog=Northwind;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");
using IronXL;
using System.Data;
using System.Data.SqlClient;
string connectionString = "Data Source=localhost;Initial Catalog=Northwind;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");
Imports IronXL
Imports System.Data
Imports System.Data.SqlClient
Dim connectionString As String = "Data Source=localhost;Initial Catalog=Northwind;Integrated Security=True"
Dim sql As String = "SELECT * FROM Customers"
Using connection As New SqlConnection(connectionString)
connection.Open()
Dim adapter As New SqlDataAdapter(sql, connection)
Dim dt As New DataTable()
adapter.Fill(dt)
Dim workBook As WorkBook = WorkBook.Create(ExcelFileFormat.XLSX)
Dim workSheet As WorkSheet = workBook.CreateWorkSheet("Customers")
' Write column headers
For col As Integer = 0 To dt.Columns.Count - 1
workSheet.SetCellValue(0, col, dt.Columns(col).ColumnName)
Next
' Write data rows
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("CustomerExport.xlsx")
End Using
出力

このコードは、SQL Serverのテーブル構造から適切な形式の列ヘッダーを持つExcelファイルを作成します。 DataTable dt はクエリ結果を格納し、その後、0 から始まる行および列インデックスを使用して、各セルに体系的に書き込まれます。 IronXLは、Microsoft Officeアプリケーションとの幅広い互換性を実現するために、.xlsxの両方の形式をサポートしています。
SQL テーブルに DateTime または数値列が含まれている場合は、SetCellValue を呼び出す前にセル値を適切にキャストしてください。 数値型を直接渡すことで、Excelのデータ型が保持され、エクスポートされた列に対して並べ替えや数式計算が可能になります。
LoadWorkSheetsFromDataSet を使用して複数のテーブルをエクスポートするにはどうすればよいですか?
レポートで複数の SQL テーブル (たとえば、製品とカテゴリ) のデータが必要な場合、それらを DataSet にロードして、 IronXL にテーブルごとに 1 つのワークシートを自動的に作成させることができます。 これは、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");
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
出力

LoadWorkSheetsFromDataSet は、DataSet 内の各 DataTable の TableName プロパティを読み取り、一致するワークシート タブを作成します。 DataTable の列名が各シートのヘッダー行になります。 この方法は、複数の結果セットを返すストアドプロシージャに特に役立ちます。なぜなら、複数の呼び出しを使用して DataSet にデータを格納し、すべてを 1 つのステップでエクスポートできるからです。
カスタム書式設定を使用してプログラムで Excel ファイルを作成する必要があるアプリケーションでは、LoadWorkSheetsFromDataSet を呼び出した後でも個々のワークシートにアクセスし、保存する前にスタイル、列幅、または数式を適用できます。
どのようにASP.NETエクスポートボタンを使用してデータをエクスポートできますか?
ウェブアプリケーションの場合、通常はユーザーがボタンをクリックしたときにエクスポート処理が実行されます。 次のASP.NET Web Forms の例では、ボタンのクリック イベントを処理し、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();
}
}
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 プロジェクトの場合、コントローラー アクション内の Response.BinaryWrite を 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");
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 に書き込む前に結果セット全体を DataTable に読み込む方法は、ほとんどのレポートでうまく機能しますが、非常に大きなエクスポートの場合は、行をバッチで処理するか、SqlDataReader を直接使用できます。
大量輸出を行う際には、以下の戦略を検討してください。
- SQL OFFSET/FETCH を使用したページ分割: 大量のエクスポートを複数のワークシートに分割し、各ワークシートに結果の 1 ページ分を含めます。 これにより、Excelにおける個々のシートサイズを管理しやすい状態に保つことができます。
-ディスクへのストリーム:
ToByteArray()を使用してすべてをメモリに保持するのではなく、各バッチの後にworkBook.SaveAs(filePath)を呼び出します。 -選択する列を制限する: SQL Server から転送されるデータ量を減らすために、SELECT *ではなく、SELECTステートメントで明示的な列リストを使用します。
C#でDataTableをExcelにエクスポートする最速の方法については、 IronXLブログにさまざまなアプローチとそのメモリプロファイルを比較した専用のベンチマーク記事があります。
WorkBook.LoadWorkSheetsFromDataSet メソッドは、行の反復処理を内部的に行うため、中規模の DataSet オブジェクトに対して特に効率的です。 特にDataTableからExcelへのエクスポートシナリオにおいては、この方法は定型コードを削減し、一括書き込みに最適化されています。
ExcelからSQL Serverにデータをインポートするにはどうすればよいですか?
多くのレポート作成アプリケーションにとって、エクスポートワークフローは全体の半分に過ぎない。 ユーザーがテンプレートをダウンロードし、データを入力して、SQL Serverに再アップロードできるようにする必要がある場合もあります。 IronXLを使えば、この双方向ワークフローが簡単に実現できます。
Excel データをデータベースにインポートするには、アップロードされたファイルを WorkBook.Load(filePath) を使用して読み込み、ワークシートの行を反復処理し、パラメーター化された 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();
}
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出力 | なし | マニュアル | 該当なし | はい |
Microsoft Interopは、サーバーにOfficeがインストールされていることを前提としており、サーバー側のWebアプリケーションではサポートされていません。 IronXL、 EPPlus 、およびNPOIはすべてOfficeなしで動作します。IronXLの利点は、LoadWorkSheetsFromDataSetまで一流のサポートを提供していることです。これにより、他のライブラリでの手動による行反復処理と比較して、エクスポートコードを数行に削減できます。
詳細な比較については、 Microsoft Office Interopの代替製品に関する記事を参照してください。
次のステップは何ですか?
C#を使用してSQLデータをExcelにエクスポートするのは、IronXLを使えば簡単です。 このライブラリは、DataSet、および直接データベース統合を強力にサポートしながら、複雑な相互運用依存関係を排除します。 コンソールアプリケーションの構築であれ、ファイルダウンロード機能を備えたWebベースのレポートシステムの構築であれ、 IronXLはあらゆる.NET 10プロジェクトタイプにおいて、信頼性の高いExcelファイル生成機能を提供します。
この基盤をさらに発展させるために、以下の関連リソースをご覧ください。
- C#でExcelファイルを作成する-- ワークブックの作成と書式設定に関する完全チュートリアル
- DataSet と DataTable を Excel にエクスポートする--
LoadWorkSheetsFromDataSetメソッドの公式ハウツーガイド - ExcelからSQLへのデータインポート- 完全な往復ワークフロー
- DataTableからExcelへのエクスポート-- 単一テーブルシナリオに特化したガイド
- ASP.NETデータテーブルを Excel にエクスポート-- Web アプリケーションのエクスポートパターン
- データテーブルをExcelにエクスポートする最速の方法- パフォーマンスベンチマーク
本番環境への導入にはライセンスをご購入いただくか、無料トライアルでこのExcelライブラリの全機能を.NETプロジェクトでお試しください。
よくある質問
C#を使用してSQLデータをExcelにエクスポートするにはどうすればよいですか?
IronXLを使えば、C# を使って SQL データを Excel にエクスポートできます。SqlConnection と SqlDataAdapter を使って SQL Server に接続し、DataTable にデータを入力します。その後、 IronXLを使ってワークブックを作成し、データ行を書き込みます。IronXLを使用するには Microsoft Office のインストールは必要ありません。
IronXLを使ってSQLデータをエクスポートするための前提条件は何ですか?
SQL データのエクスポートにIronXLを使用するには、 .NETプロジェクト (Framework、Core、または.NET 10+)、SQL Server データベースへのアクセス、およびInstall-Package IronXL .Excel を介してインストールされたIronXL NuGetパッケージが必要です。
IronXLでSQLデータをExcelにエクスポートするにはMicrosoft Officeがインストールされている必要がありますか?
いいえ、 IronXL を使用すると、システムまたはサーバーに Microsoft Office をインストールしなくても、SQL データを Excel にエクスポートできます。
SQLデータをExcelにエクスポートする際、IronXLは大きなデータセットを扱えますか?
はい、 IronXLは大規模なデータセットを効率的に処理します。非常に大きなエクスポートの場合は、SQL OFFSET/FETCHでページ区切りを行い、ToByteArrayではなくSaveAsを使用してディスクに書き込み、SQLクエリで選択した列を制限してください。
複数の SQL テーブルを別々の Excel シートにエクスポートするにはどうすればよいですか?
WorkBook.LoadWorkSheetsFromDataSet は、複数の SqlDataAdapter 呼び出しによって生成された DataSet で使用します。IronXLはDataTable ごとに 1 つのワークシートを作成し、各タブに DataTable.TableName プロパティから名前を付けます。
ASP.NETで Excel ファイルのダウンロードをトリガーするにはどうすればよいですか?
workBook.ToByteArray() を呼び出してファイルをバイト列として取得し、正しい Content-Type ヘッダーと content-disposition ヘッダーを付与して HTTP レスポンスに書き込みます。ASP.NET ASP.NET Coreでは、コントローラーから File(fileBytes, contentType, filename) を返します。
IronXLを使用して Excel データを SQL Server にインポートできますか?
はい。WorkBook.Load を使用して Excel ファイルを読み込み、IronXL のインデクサーを使用してワークシートの行を反復処理し、パラメータ化された SqlCommand を使用して各行を挿入することで、SQL インジェクションから保護します。
SQL データのエクスポートに関してIronXLと Microsoft Interop を比較するとどうなりますか?
IronXL はサーバーに Office をインストールする必要がなく、マネージドコードで実行され、LoadWorkSheetsFromDataSet によるネイティブな DataSet エクスポートをサポートします。Microsoft Interop は COM サーバーを必要とするため、Web サーバー環境では確実に実行できません。



