跳過到頁腳內容
使用 IRONXL

使用OleDb vs IronXL將DataTable匯出到Excel C#

使用合適的庫,在 C# 中將 DataTable 匯出到 Excel 檔案非常簡單,而且無需任何 Office 相依性。 你呼叫 WorkBook.Create(),從 dataTable.Columns 寫入標題,循環遍歷 dataTable.Rows 填充單元格,然後使用 workbook.SaveAs("output.xlsx") 儲存。 最終產生一個格式完整的 XLSX 文件,可在任何平台上運行,包括.NET 10、Linux 容器和 Azure 無伺服器函數。

本指南將傳統的 奧勒岡資料庫 方法與現代的IronXL for .NET方法進行了比較。 您將了解為什麼 奧勒岡資料庫 驅動程式會造成部署和相容性問題,以及如何用簡潔、可維護的程式碼取代它,該程式碼可以處理列標題、資料類型、單元格格式和大型資料集,而無需 SQL 語法或僅限 Windows 的驅動程式安裝。


如何安裝IronXL以匯出資料表?

在編寫任何匯出程式碼之前,請將IronXL新增到您的專案中。 在 Visual Studio 中開啟程式包管理器控制台並執行:

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

IronXL不依賴 Microsoft Office、Access 資料庫引擎或任何 COM 互通層。 安裝好軟體包後,您無需更改任何一行程式碼即可在 Windows、Linux、macOS、Docker、 AzureAWS上執行相同的程式碼。

為什麼 OLEDB 需要安裝驅動程式

傳統的 奧勒岡資料庫 方法將 Excel 檔案視為資料庫。 您使用 Microsoft.ACE.OLEDB.12.0 提供者(或較舊的 Microsoft.Jet.OLEDB.4.0 用於 .xls 檔案)建立 奧勒岡資料庫Connection,然後針對電子表格執行 SQL CREATE TABLE 和 @@CO-76767-- 命令。 這適用於已安裝 Microsoft Office 或獨立 Access 資料庫引擎可再發行元件的開發人員機器。 然而,生產環境(尤其是雲端函數、Docker 容器和運行無頭.NET 10 的伺服器叢集)很少提供該驅動程序,而且安裝該驅動程式需要提升的權限,並且驅動程式和進程的位數必須匹配。

為什麼開發人員仍然使用 奧勒岡資料庫 進行 Excel 匯出?

由於 奧勒岡資料庫 已經是.NET Framework的一部分,因此它成為了 Excel 自動化的預設選擇。 開發人員已經了解.NET,因此重複使用 奧勒岡資料庫Command奧勒岡資料庫DataAdapter 來寫入 Excel 感覺很自然。 不需要第三方軟體包,而 CREATE TABLEINSERT INTO 的 SQL 式語法,對於熟悉資料庫程式設計的人來說,其意圖顯而易見。

以下是使用 奧勒岡資料庫 匯出 DataTable 的傳統模式:

using System.Data;
using System.Data.奧勒岡資料庫;

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

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

using 奧勒岡資料庫Connection connection = new(connectionString);
connection.Open();

// Create the sheet structure with SQL DDL
string create = "CREATE TABLE [Sheet1$] (ProductID INT, ProductName CHAR(255), Price DOUBLE)";
using (var createCmd = new 奧勒岡資料庫Command(create, connection))
    createCmd.Execute不nQuery();

// Insert rows one at a time
string insert = "INSERT INTO [Sheet1$] (ProductID, ProductName, Price) VALUES (?, ?, ?)";
using 奧勒岡資料庫Command insertCmd = new(insert, connection);
insertCmd.Parameters.Add(new 奧勒岡資料庫Parameter("ProductID", 奧勒岡資料庫Type.Integer));
insertCmd.Parameters.Add(new 奧勒岡資料庫Parameter("ProductName", 奧勒岡資料庫Type.VarChar, 255));
insertCmd.Parameters.Add(new 奧勒岡資料庫Parameter("Price", 奧勒岡資料庫Type.Double));

foreach (DataRow row in dataTable.Rows)
{
    insertCmd.Parameters[0].Value = row["ProductID"];
    insertCmd.Parameters[1].Value = row["ProductName"];
    insertCmd.Parameters[2].Value = row["Price"];
    insertCmd.Execute不nQuery();
}
using System.Data;
using System.Data.奧勒岡資料庫;

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

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

using 奧勒岡資料庫Connection connection = new(connectionString);
connection.Open();

// Create the sheet structure with SQL DDL
string create = "CREATE TABLE [Sheet1$] (ProductID INT, ProductName CHAR(255), Price DOUBLE)";
using (var createCmd = new 奧勒岡資料庫Command(create, connection))
    createCmd.Execute不nQuery();

// Insert rows one at a time
string insert = "INSERT INTO [Sheet1$] (ProductID, ProductName, Price) VALUES (?, ?, ?)";
using 奧勒岡資料庫Command insertCmd = new(insert, connection);
insertCmd.Parameters.Add(new 奧勒岡資料庫Parameter("ProductID", 奧勒岡資料庫Type.Integer));
insertCmd.Parameters.Add(new 奧勒岡資料庫Parameter("ProductName", 奧勒岡資料庫Type.VarChar, 255));
insertCmd.Parameters.Add(new 奧勒岡資料庫Parameter("Price", 奧勒岡資料庫Type.Double));

foreach (DataRow row in dataTable.Rows)
{
    insertCmd.Parameters[0].Value = row["ProductID"];
    insertCmd.Parameters[1].Value = row["ProductName"];
    insertCmd.Parameters[2].Value = row["Price"];
    insertCmd.Execute不nQuery();
}
Imports System.Data
Imports System.Data.奧勒岡資料庫

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

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

Using connection As New 奧勒岡資料庫Connection(connectionString)
    connection.Open()

    ' Create the sheet structure with SQL DDL
    Dim create As String = "CREATE TABLE [Sheet1$] (ProductID INT, ProductName CHAR(255), Price DOUBLE)"
    Using createCmd As New 奧勒岡資料庫Command(create, connection)
        createCmd.Execute不nQuery()
    End Using

    ' Insert rows one at a time
    Dim insert As String = "INSERT INTO [Sheet1$] (ProductID, ProductName, Price) VALUES (?, ?, ?)"
    Using insertCmd As New 奧勒岡資料庫Command(insert, connection)
        insertCmd.Parameters.Add(New 奧勒岡資料庫Parameter("ProductID", 奧勒岡資料庫Type.Integer))
        insertCmd.Parameters.Add(New 奧勒岡資料庫Parameter("ProductName", 奧勒岡資料庫Type.VarChar, 255))
        insertCmd.Parameters.Add(New 奧勒岡資料庫Parameter("Price", 奧勒岡資料庫Type.Double))

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

這段程式碼每次插入 DataRow 都需要單獨進行一次資料庫往返。對於大型資料集,由於 奧勒岡資料庫 沒有提供批量插入機制,因此這種循環會成為效能瓶頸。 每一行資料在進入下一行之前,都會觸發完整的 SQL 解析、參數綁定和寫入週期。

使用 奧勒岡資料庫 匯出 Excel 資料的主要限制是什麼?

了解 奧勒岡資料庫 的不足之處,有助於向團隊證明遷移的合理性,並選擇合適的替代方案。

驅動程式依賴關係和位數衝突

必須在執行您的應用程式的每台機器上單獨安裝 Microsoft.ACE.OLEDB.12.0 提供者。 如果您的進程是 64 位元的,但只有 32 位元 Access 資料庫引擎可用(當 Microsoft Office 32 位元版本與 64 位元.NET執行時間環境同時安裝時,這種情況很常見),則連線會在執行時拋出例外狀況。 Microsoft 已記錄了這些位數限制,並建議驅動程式和呼叫程序使用匹配的位數,但這在共用主機或容器化環境中通常難以實現。

不支援跨平台

奧勒岡資料庫 是一項僅適用於 Windows 的技術。 .NET 10 原生支援 Linux 和 macOS,現代架構越來越多地在 Linux 節點上的 Docker 容器中執行應用程式工作負載。 因為 System.Data.奧勒岡資料庫 命名空間在非 Windows 作業系統上會引發 Platform不tSupportedException 錯誤,所以任何使用 奧勒岡資料庫 的程式碼路徑都會完全阻止在這些平台上執行。

不具備單元格格式化功能

奧勒岡資料庫 將電子表格視為一個扁平的資料庫表。 您可以插入原始值,但您沒有辦法套用儲存格字體、背景顏色、邊框、數字格式或列寬。 如果您的匯出需要外觀專業的報表,例如帶有標題行樣式、貨幣格式或條件著色,奧勒岡資料庫 無法滿足您的需求。 您需要使用不同的程式庫或 Excel Interop COM 物件進行第二次測試,但這會新增它自己的 Office 相依性。

Excel 檔案必須已存在

奧勒岡資料庫 無法從頭開始建立新的 Excel 工作簿。 在建立連線之前,目標路徑下的檔案必須已經存在。 這需要預先填入範本文件,或者需要單獨一步使用另一個庫建立工作簿,從而為部署包增加不必要的複雜性。

不支援刪除操作

Excel 的 奧勒岡資料庫 驅動程式支援 INSERT 和有限的 UPDATE 操作,但不支援使用 DELETE FROM 刪除行。 任何需要在匯出後刪除行的資料操作工作流程都必須訴諸手動文件操作或完全重新建立文件,而這兩種操作都無法透過 奧勒岡資料庫 介面直接完成。

如何使用IronXL將資料表匯出到 Excel?

IronXL使用直接物件模型替換了整個 奧勒岡資料庫 管道。 無需連接字串、無需 SQL 命令、也無需驅動程式。 您建立了 WorkBook,新增了 WorkSheet,並為每個儲存格呼叫了 SetCellValue()

using IronXL;
using System.Data;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

WorkBook.Create(ExcelFileFormat.XLSX) 在記憶體中建立新的工作簿-無需事先存在任何檔案。 CreateWorkSheet("Products") 新增一個命名製表符。 巢狀循環與 DataTable 的行數和列數完全一致,每個單元格寫入一個值。 SaveAs() 將工作簿刷新到磁碟,產生一個完全有效的 XLSX 檔案。

輸出

如何使用 奧勒岡資料庫 或IronXL將資料表匯出至 Excel C#:圖 1 - Excel 輸出

若要深入了解可用選項,匯出資料集和資料表的操作指南涵蓋了其他重載和批次匯出模式。

匯出資料表時如何新增儲存格格式?

基本匯出後最常見的需求之一是設定標題行的樣式,使其與資料行區分開來。 IronXL提供了 奧勒岡資料庫 無法比擬的完整樣式 API:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

這將產生一個文件,其中包含藍色標題行、白色標題文本,以及用美元符號和兩位小數顯示的價格值。 單元格字體大小指南以及邊框和對齊方式參考說明了所有可用的樣式選項。

處理大型資料表匯出

對於包含數千行的資料集,效能至關重要。 IronXL在每次磁碟寫入之前,都會將所有單元格值寫入內存,寫入位置為 SaveAs(),這比 奧勒岡資料庫 每行寫入一個 Execute不nQuery() 的模式效率要高得多。 如果您需要匯出非常大的表格, 匯出 DataTable 到 Excel 的最快方法指南涵蓋了記憶體高效的串流技術。

您也可以將匯出邏輯與公式、範圍和命名表進行分組。 《建立電子表格操作指南》《.NET Excel 程式設計指南》提供了使用 DataTables 建立多工作表工作簿的完整模式。

如何在ASP.NET中將 DataTable 匯出到 Excel?

在 Web 應用程式中,通常會將工作簿直接傳輸到瀏覽器,而不是將其儲存到磁碟。 IronXL支援此功能,它使用 workbook.ToByteArray(),傳回可寫入 HTTP 回應的二進位內容:

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

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

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

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

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

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

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

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

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

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

ASP.NET將資料表匯出到 Excel 教學課程詳細介紹了ASP.NET應用程式的完整控制器和視圖連接。 《 DataTable to Excel C# 指南》涵蓋了更多場景,包括多工作表匯出和資料集支援。

奧勒岡資料庫 與IronXL 的簡單比較

C# 中 奧勒岡資料庫 與IronXL在 DataTable 到 Excel 匯出的功能比較
能力 奧勒岡資料庫 IronXL
需要安裝驅動程式 是的(ACE.OLEDB 或 Jet)
跨平台(.NET 10 / Linux) 是的
從頭開始建立新的工作簿 是的
儲存格格式和樣式 是的
配方支持 是的
批量插入效能 一行一行(慢速) 記憶體式(快速)
刪除行支持 是的
Docker/容器支持 是的

匯出過程中如何處理列資料類型?

當資料表列包含數值或日期值時,如果將它們寫入字串,Excel 會將儲存格視為文本,從而停用排序、篩選和公式引用。 IronXL在您直接傳遞值而不是呼叫 .ToString(): 時會保留原生類型。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Excel現在可以按數值對"金額"欄位進行排序,並使用日期選擇器篩選"日期"欄位。 如需其他資料格式模式,請參閱設定儲存格資料格式指南。 如果您需要在匯出後讀取數據, Excel 轉 DataTable 教學涵蓋了反向操作。

遷移現有 OleDB 匯出程式碼

從 奧勒岡資料庫 遷移到IronXL通常所需的時間比一個迭代週期還要短。 結構性變化如下:

  1. 刪除所有 using System.Data.奧勒岡資料庫 引用和對任何 ACE 驅動程式包裝包的NuGet引用。
  2. 奧勒岡資料庫Connection 初始化區塊替換為 WorkBook.Create(ExcelFileFormat.XLSX)
  3. CREATE TABLE 指令替換為 workbook.CreateWorkSheet("SheetName")
  4. INSERT INTO 循環替換為嵌套的 SetCellValue() 調用,每個單元格一個調用。
  5. connection.Close() 替換為 workbook.SaveAs("output.xlsx")

如果下游使用者尚未升級至 Excel 2007 或更高版本,您也可以使用 workbook.SaveAs().xls 副檔名來產生舊格式檔案。 轉換電子表格文件類型指南列出了所有支援的輸出格式。

如何測試和取得IronXL 的授權?

IronXL可透過試用許可證免費用於開發。 在第一次呼叫IronXL之前,您需要在程式碼中套用該金鑰:

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

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

許可證金鑰應用指南詳細介紹了所有放置選項,包括設定檔和環境變數。 對於雲端部署, DockerLinux入門頁面涵蓋了特定於平台的設定步驟。

Microsoft 記錄了Access 資料庫引擎在 奧勒岡資料庫 場景下的已知局限性,而NuGet則託管了IronXL軟體包,並提供了完整的版本歷史記錄和下載統計資料。 官方的Open XML SDK 文件解釋了IronXL實現的底層 XLSX 規格。

下一步計劃是什麼?

現在,您已經掌握了一種無需 奧勒岡資料庫 驅動程式、無需 SQL 語法、也無平台限制即可將 DataTable 匯出到 XLSX 檔案的有效方法。 核心工作流程 -- WorkBook.Create(), CreateWorkSheet(), SetCellValue() 循環,然後 SaveAs() -- 可以從三行樣本擴展到數十萬行的資料集擴展到數十萬行的資料集。

首先將現有的 奧勒岡資料庫 匯出替換為上面所示的基本IronXL模式,然後在驗證資料匯出後,使用樣式 API 新增格式。 要了解 IronXL 庫支援的全部功能,建議閱讀IronXL入門指南功能概述。 如果您在同一管道中使用 CSV 文件,則 C# DataTable 到 CSV 指南將展示如何從同一個 DataTable 物件產生逗號分隔的輸出。

常見問題解答

在 C# 中使用 OleDb 將 DataTable 匯出至 Excel 時有哪些限制?

由於 OleDb 屬於舊式技術,在 C# 中使用它將 DataTable 匯出至 Excel 可能會令人感到沮喪。開發人員經常遇到相容性問題、效能較慢以及錯誤處理更為複雜等限制,這使得 IronXL 等現代替代方案更具吸引力。

IronXL 如何改善將 DataTable 匯出至 Excel 的流程?

IronXL 提供了一種將 DataTable 匯出至 Excel 的現代化解決方案,具備更佳的效能、更廣泛的相容性,以及更簡化的程式碼。它消除了常見的 OleDb 操作困擾,讓 .NET 開發人員能更輕鬆地管理 Excel 匯出作業。

為何應考慮將 DataTable 匯出功能從 OleDb 切換至 IronXL?

改用 IronXL for .NET 進行 DataTable 匯出具有多項優勢,包括提升效能、簡化實作流程,以及增強與現代 .NET 應用程式的相容性,從而減少開發所需的時間與精力。

IronXL 能否比 OleDb 更有效地處理大型 DataTable 匯出作業?

是的,IronXL 專為高效處理大型 DataTable 匯出而設計,相較於 OleDb,它能提供更快的處理速度並降低記憶體使用量,因此非常適合處理龐大資料集的應用程式。

IronXL 是否與最新版本的 C# 和 .NET 相容?

IronXL 完全相容於最新版本的 C# 和 .NET,確保能與現代應用程式無縫整合,同時提供持續更新以支援新功能與改進。

像 IronXL 這樣的現代替代方案,相較於傳統的 OleDb 有哪些優勢?

像 IronXL 這樣的現代替代方案具備多項優勢,例如提升效能、更簡易的錯誤處理、與各種 Excel 格式更好的相容性,以及簡化的程式碼,這些都能大幅提升開發者的生產力。

相較於 OleDb,IronXL 是如何處理錯誤管理的?

IronXL 透過清晰的例外處理機制,提供簡化的錯誤管理功能,從而降低與 OleDb 相關的複雜性及潛在問題,使開發人員能更輕鬆地進行應用程式除錯與維護。

在基於 UI 的 .NET 應用程式中,將 DataTable 匯出至 Excel 的常見使用情境有哪些?

在基於使用者介面的 .NET 應用程式中,將 DataTable 匯出至 Excel 常用於生成報表、資料分析及使用者友善的資料處理,此操作通常透過事件處理常式並採用物件發送者模式來觸發。

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

鋼鐵支援團隊

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