跳過到頁腳內容
使用 IRONXL

使用 IronXL 在 C# 中將資料集匯出到 Excel | 無需 Office

在 C# 中將 DataSet 或 DataTable 匯出至 Excel,能為您提供一種可靠的方法,將結構化的記憶體內資料轉為 Professional 試算表檔案——無需依賴目標電腦上是否安裝了 Microsoft Office。無論您是從 SQL 資料庫擷取記錄、透過程式碼建立 DataSet,還是處理現有的 DataGrid,IronXL 都能透過簡潔的"程式碼優先"API 處理整個流程。 本指南將透過頂層 C# 語句和 .NET 10,逐步引導您完成所有主要情境——從單一資料表匯出、多工作表工作簿,到即時資料庫查詢結果。

只需安裝一次 IronXL,撰寫幾行程式碼,您的資料便會以 XLSX 檔案形式輸出,且完全不依賴 Office 軟體。 以下各節涵蓋安裝、核心模式、進階格式設定及資料庫整合等內容,您可直接將其複製貼上至您的專案中。

如何安裝 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

安裝完成後,請新增一個頂層 using 語句以匯入 IronXL 命名空間:

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

IronXL 支援 .NET 8、.NET 9 及 .NET 10,同時也相容於較舊的 .NET Framework 版本(4.6.2 以上)。 無論是伺服器、桌面電腦或雲端環境,任何裝置均無需安裝 Office。 安裝套件後,您即可完全透過受管程式碼來建立、讀取及寫入 XLSX、XLS 和 CSV 檔案。

有關詳細的安裝選項,請參閱 IronXL 安裝指南;版本歷史記錄請參閱 NuGet 套件頁面

如何將單一 DataTable 匯出至 Excel 檔案?

最常見的應用情境是將一個 DataTable 匯出至單一工作表。 IronXL 的 WorkBookWorkSheet 類別可以自然地對應到 Excel 物件模型。 您建立工作簿、新增工作表,然後遍歷 DataTable 的欄位與列。

以下範例建立一個記憶體中的 Employees 資料表,並將其寫入 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# 教學指南除涵蓋此匯出模式外,亦完整介紹各類檔案操作。

如何將 DataSet 匯出至多個 Excel 工作表?

當 DataSet 包含多個相關資料表(例如 Products 和 Orders)時,您可以將每個 DataTable 映射至同一工作簿中的獨立工作表。 這讓使用者能在單一檔案中查看所有相關資料,無需開啟多個文件。

下面的循環遍歷 ds.Tables,並為每個表格建立一個工作表:

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 文件,其中匯出的資料集以單獨的工作表形式呈現

每個工作表皆以原始 DataTable 命名,使在 Excel 中的導覽更加直觀。 因為 WorkBook.Create 在記憶體中分配工作簿,所以您可以在循環中不斷添加工作表而無需重新開啟檔案 -- IronXL 在寫入磁碟之前建立整個 XLSX 結構。

IronXL WorkBook 文件列出了 WorkBook 物件的所有可用方法,包括工作表重新排序、密碼保護,以及儲存為 XLSX 以外的格式。

如何在 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("無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")
$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

資料庫匯出的重點

空值檢查(cellValue == DBNull.Value ? "" : cellValue.ToString()) prevents exceptions when the database returns NULL 值 -- 可選列中常見的情況。 標題列的粗體格式可讓報告收件者立即區分標題與資料。

若需更多關於將 Excel 資料讀取回 C# 物件的範例,請參閱 IronXL DataTable 匯出教學,其中說明了如何反向執行此工作流程。

IronXL 與其他 Excel 匯出方案相比如何?

在選擇函式庫之前,了解主要選項在 DataSet 匯出情境中最關鍵的領域中如何相互比較,將有助於決策。

針對 .NET DataSet 情境的 Excel 匯出函式庫比較
方法 辦公室要求 XLSX 支援 樣式 API 多頁 效能(大數據)
IronXL 完整 高的
Microsoft Office Interop 完整 低的
EPPlus 部分 高的
ClosedXML 部分 中等的
CSV (手動) 非常高

Microsoft Office Interop 僅適用於已安裝 Office 的 Windows 電腦,因此不適用於伺服器部署及雲端功能。 IronXL、EPPlus 和 ClosedXML 均支援伺服器端生成——其關鍵差異在於樣式設定 API 的廣度與授權模式。 IronXL 的授權涵蓋商業用途,並透過單一套件支援所有 .NET Framework 目標框架。

關於第三方效能測試與比較,Microsoft 針對 Excel 檔案格式的文件以及 EPPlus 專案頁面,可提供更多背景資訊,協助您為專案做出正確的選擇。

如何在不引發記憶體問題的情況下處理大型資料集?

在匯出包含數萬行的 DataTables 時,確保記憶體使用量可預測至關重要。 以下模式直接從 IDataReader 串流數據,而不是先將整個結果集載入到 DataTable 中。這樣可以避免同時保存讀取緩衝區和 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

若匯出資料超過 500,000 行且記憶體極度緊缺,請考慮將輸出拆分為多個工作簿,或改為匯出為 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 支援儲存到檔案路徑,MemoryStreambyte[] -- 這對於傳回 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

此驗證模式特別適用於整合測試Suite,在將檔案傳送至外部系統前,必須確認匯出內容的正確性。 IronXL 讀取教學範例展示了載入檔案後可用的完整讀取操作集。

若需進一步了解 .NET 中的 DataSet 和 DataTable 模式,請參閱 Microsoft DataSet 文件,其中深入探討了 ADO.NET 物件模型。

下一步計劃是什麼?

現在,您已擁有適用於 C# 中所有主要 DataSet 轉 Excel 匯出情境的實用範例——從單一 DataTable 到多工作表工作簿、資料庫驅動的匯出、格式化標題,以及大量資料串流。 根據您的目標,以下是後續操作步驟:

  • 免費試用 IronXL -- 先取得免費試用授權,並將上述範例套用至您的實際資料上進行測試,確認無誤後再投入正式環境。
  • 閱讀完整的 API 參考文件 -- IronXL 物件參考文件涵蓋了 WorkBook、WorkSheet 及儲存格範圍的所有方法。
  • 探索相關匯出教學 -- 《C# DataTable 匯出至 Excel 指南》涵蓋了反向工作流程 -- 將 Excel 資料讀回 DataTable 物件。
  • 檢視格式設定選項 -- IronXL 儲存格格式設定文件中說明了數字格式、邊框、背景顏色及對齊方式等選項。
  • 確認授權條款 -- 若需進行生產環境部署,請參閱 IronXL 授權頁面,選擇開發者版、組織版或免版稅版。
  • 與其他 Iron Software 工具比較 -- 若您的專案同時需要 PDF 生成或 OCR 功能,Iron Software 產品 Suite 可讓您以優惠價格捆綁多項函式庫。

基於本文所述的模式,您可以完全透過受管 C# 實作排程任務自動化、ASP.NET Core 下載端點以及多格式輸出管道——無需 Office、無需 COM,除了 NuGet 套件之外,亦無其他執行階段依賴項。

常見問題解答

如何使用 C# 將資料集匯出到 Excel?

您可以使用 IronXL 庫在 C# 中將資料集匯出到 Excel,該庫提供了一個程式碼優先的 API,用於建立、編輯和操作 Excel 文件,而無需 Microsoft Office。

我需要安裝 Microsoft Office 才能使用 IronXL 嗎?

不,IronXL 不需要在電腦上安裝 Microsoft Office 即可匯出或處理 Excel 檔案。

我可以使用 IronXL 匯出哪些類型的資料?

IronXL 可讓您將結構化資料(例如 DataTables 和 DataSets)匯出到 Excel 文件,並從 SqlDataReader 和其他 ADO.NET 來源匯出資料。

IronXL 能否處理 Excel 檔案的建立和編輯?

是的,IronXL 提供了使用 C# 以程式設計方式建立、編輯和操作 Excel 檔案的功能。

IronXL 是否適用於伺服器端和雲端應用程式?

是的,IronXL 非常適合需要在不安裝任何 Office 的情況下產生 Excel 檔案的伺服器端應用程式和雲端函數。

使用 IronXL 匯出資料集有哪些好處?

IronXL 無需 Microsoft Office 等外部依賴項即可處理 Excel 檔案的建立和操作,支援 XLSX、XLS 和 CSV 格式,並且可以在所有 .NET 目標框架上運行。

IronXL 能否在 ASP.NET Core 中使用以返回 Excel 下載檔案?

是的,IronXL 可以將工作簿儲存到 MemoryStream 中,產生的位元組陣列可以從 ASP.NET Core 控制器操作作為檔案下載返回。

IronXL是否支援大型資料集?

是的,IronXL 可以直接從 SqlDataReader 串流傳輸數據,而無需緩衝整個 DataTable,從而保持大型結果集的記憶體使用量可預測。

IronXL 支援儲存哪些 Excel 格式?

IronXL 支援儲存為 XLSX、XLS、CSV、TSV 和 JSON 格式,無需任何額外依賴項。

匯出到 Excel 時,我可以套用粗體標題等格式嗎?

是的,IronXL 為單元格區域提供了樣式 API,用於設定粗體字體、背景顏色、邊框、數字格式和對齊方式。

Jordi Bardia
軟體工程師
Jordi 在 Python、C# 和 C++ 上最得心應手,當他不在 Iron Software 展現技術時,便在做遊戲編程。在分担產品测测试,產品開發和研究的责任時,Jordi 為持续的產品改進增值。他说这种多样化的经验使他受到挑战并保持参与, 而这也是他与 Iron Software 中工作一大乐趣。Jordi 在佛罗里达州迈阿密长大,曾在佛罗里达大学学习计算机科学和统计学。

鋼鐵支援團隊

我們每週 5 天,每天 24 小時在線上。
聊天
電子郵件
打電話給我