跳至頁尾內容
USING IRONXL

using OleDb 或 IronXL 將資料表匯出到 Excel(C#)

在C#中匯出DataTable到Excel文件——不依賴於任何Office——使用正確的程式庫是非常簡單的。 您呼叫workbook.SaveAs("output.xlsx")保存。 結果是一個完全格式化的XLSX文件,能在任何平臺上運行,包括.NET 10、Linux容器和Azure無伺服器功能。

本指南比較了傳統的OleDb方法與現代的IronXL for .NET方法。 您將了解為什麼OleDb驅動程式會造成部署和相容性問題,以及如何用乾淨、可維護的程式程式碼替代它,這些程式程式碼無需SQL語法或僅限於Windows的驅動程式安裝即可以處理列標題、資料型別、單元格格式化和大資料集。


如何安裝IronXL以導出DataTable?

在撰寫任何匯出程式碼之前,請將IronXL新增到您的專案中。 在Visual Studio中打開Package Manager Console並運行:

Install-Package IronXL.Excel

IronXL無需依賴於Microsoft Office、Access Database Engine或任何COM互操作層。 一旦安裝了此套件,您可以在Windows、Linux、macOS、Docker、AzureAWS上運行相同的程式碼,而不需要更改一行程式碼。

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

傳統的OleDb方法將Excel文件視作一個資料庫。 您可以使用Microsoft.Jet.OLEDB.4.0)建立連線,然後對試算表執行SQL INSERT INTO命令。 這在開發者電腦上有效,當Microsoft Office或獨立的Access Database Engine可再發行套件已經安裝好。 然而,生產環境——特別是雲端功能、Docker容器和運行無頭.NET 10的伺服器農場——很少有該驅動程式可用,而且安裝需要提升的權限和在驅動程式和您的過程之間匹配的位元。

為什麼開發者依然使用OleDb進行Excel匯出?

由於OleDb已經是.NET Framework的一部分,所以它成為Excel自動化的預設選擇。 開發者已經瞭解ADO.NET,因此重用OleDbDataAdapter來寫入Excel感覺很自然。 不需要第三方套件,INSERT INTO的類似SQL語法使得熟悉資料庫程式設計的人意圖顯而易見。

這是使用OleDb導出DataTable的傳統模式:

using System.Data;
using System.Data.OleDb;

// 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);

// OleDb 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 OleDbConnection 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 OleDbCommand(create, connection))
    createCmd.ExecuteNonQuery();

// Insert rows one at a time
string insert = "INSERT INTO [Sheet1$] (ProductID, ProductName, Price) VALUES (?, ?, ?)";
using OleDbCommand insertCmd = new(insert, connection);
insertCmd.Parameters.Add(new OleDbParameter("ProductID", OleDbType.Integer));
insertCmd.Parameters.Add(new OleDbParameter("ProductName", OleDbType.VarChar, 255));
insertCmd.Parameters.Add(new OleDbParameter("Price", OleDbType.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.ExecuteNonQuery();
}
using System.Data;
using System.Data.OleDb;

// 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);

// OleDb 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 OleDbConnection 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 OleDbCommand(create, connection))
    createCmd.ExecuteNonQuery();

// Insert rows one at a time
string insert = "INSERT INTO [Sheet1$] (ProductID, ProductName, Price) VALUES (?, ?, ?)";
using OleDbCommand insertCmd = new(insert, connection);
insertCmd.Parameters.Add(new OleDbParameter("ProductID", OleDbType.Integer));
insertCmd.Parameters.Add(new OleDbParameter("ProductName", OleDbType.VarChar, 255));
insertCmd.Parameters.Add(new OleDbParameter("Price", OleDbType.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.ExecuteNonQuery();
}
Imports System.Data
Imports System.Data.OleDb

' 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)

' OleDb 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 OleDbConnection(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 OleDbCommand(create, connection)
        createCmd.ExecuteNonQuery()
    End Using

    ' Insert rows one at a time
    Dim insert As String = "INSERT INTO [Sheet1$] (ProductID, ProductName, Price) VALUES (?, ?, ?)"
    Using insertCmd As New OleDbCommand(insert, connection)
        insertCmd.Parameters.Add(New OleDbParameter("ProductID", OleDbType.Integer))
        insertCmd.Parameters.Add(New OleDbParameter("ProductName", OleDbType.VarChar, 255))
        insertCmd.Parameters.Add(New OleDbParameter("Price", OleDbType.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.ExecuteNonQuery()
        Next
    End Using
End Using
$vbLabelText   $csharpLabel

此程式碼將每個DataRow作為單獨的資料庫往返。對於大量資料集,該迴圈成為瓶頸,因為OleDb無法提供批量插入機制。 每行在移動到下一個之前都會觸發完整的SQL解析、參數綁定和寫入週期。

OleDb在Excel匯出方面的主要限制是什麼?

了解為什麼OleDb不足有助於您向團隊展示遷移的理由並選擇合適的替代方案。

驅動程式依賴性與位元衝突

必須在運行您的應用程式的每台計算機上單獨安裝Microsoft.ACE.OLEDB.12.0提供程式。 如果您的過程是64位但只有32位的Access Database Engine可用——當Microsoft Office 32位與64位.NET運行時併用時這是常見的配置——則連線在運行時會拋出異常。Microsoft 記錄了這些位元限制,並建議在驅動程式和調用過程之間使用匹配的位元,但這在共享主機或者容器化的環境中通常不可行。

不支持跨平台

OleDb是一種僅限Windows的技術。 .NET 10天然支持Linux和macOS,現代架構越來越多地在Linux節點上的Docker容器中運行應用程式工作負載。 由於PlatformNotSupportedException,所以任何使用OleDb的程式碼路徑在這些平臺上完全被阻止。

沒有單元格格式設置功能

OleDb將試算表視作平面資料庫表。 您可以插入原始值,但沒有機制可以應用單元格字體、背景顏色、邊框、數字格式或列寬。 如果您的匯出需要具有標題行樣式、貨幣格式或條件著色的專業報表,OleDb無法提供。 您將需要使用不同的庫或Excel 互操作COM物件進行第二次處理,這會新增其自己的Office依賴性。

Excel文件必須已存在

OleDb無法從頭建立新的Excel工作簿。 在打開連線之前,文件必須已經存在於目標路徑。 這需要預先設置的模板文件或使用其他庫建立工作簿的單獨步驟,這為部署包增加了不必要的複雜性。

不支持DELETE操作

OleDb驅動程式支持Excel的DELETE FROM的行刪除。 任何需要在匯出後刪除行的資料操作工作流都必須訴諸於手動文件操作或完整的文件重建,而這兩者在OleDb介面中都不是簡單的方法。

如何使用IronXL將DataTable匯出到Excel?

IronXL用直接的物件模型取代了整個OleDb管道。 沒有連接字串、沒有SQL命令,也沒有驅動程式需求。 您建立一個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文件形式刷新到磁碟。

輸出

如何使用OleDb與IronXL將DataTable匯出到Excel C#:圖片1 - Excel輸出

欲深入了解可用的選項,導出DataSet和DataTable怎麼做的指南涵蓋了其他超載和批量導出模式。

如何在導出DataTable時新增單元格格式?

基本匯出後最常見的要求之一是樣式標題行,以將其與資料行區分開來。 IronXL提供了一個完整的樣式API,OleDb無法匹敵:

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

這會生成一個具有藍色標題行、白色標題文字以及顯示有美元符號和兩位小數的價格值的文件。 單元格字體大小指南邊框和對齊參考解釋了可用的完整樣式選項。

處理大量DataTable匯出

對於有數千行的資料集,性能是非常重要的。 IronXL在ExecuteNonQuery()要高效得多。 如果您需要導出非常大的表,最快的將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 導出 DataTable 到 Excel 教程介紹了完整的控制器和視圖接線方式,適用於ASP.NET應用程式。 DataTable 到 Excel C#指南涵蓋了包括多表導出和DataSet支持在內的其他場景。

OleDb與IronXL一目了然對比

OleDb與IronXL在C#中DataTable到Excel匯出功能的比較
功能 OleDb IronXL
需要驅動程式安裝 是的(ACE.OLEDB或Jet)
跨平臺(.NET 10 / Linux)
從頭建立新的工作簿
單元格格式和樣式
公式支持
批量插入性能 行依行(慢) 記憶體中(快)
DELETE行支持
Docker / 容器支持

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

當DataTable列持有數字或日期值時,將它們以字串形式寫入會導致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匯出程式碼

從OleDb遷移到IronXL通常比一個運行週期所需的時間更短。 結構性變更如下:

  1. 移除所有using System.Data.OleDb引用和NuGet對任何ACE驅動程式包裝器的引用。
  2. OleDbConnection初始化區塊。
  3. CREATE TABLE命令。
  4. 用巢狀的INSERT INTO迴圈,每個單元格各一次。
  5. connection.Close()

如果下游消費者尚未升級到Excel 2007或更高版本,您還可以使用workbook.SaveAs()來生成遺留格式文件。 轉換試算表文件型別指南列出了所有支持的輸出格式。

如何測試和許可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記錄了為OleDb場景的已知的Access Database Engine限制,而NuGet.org為IronXL軟體提供了套件,包括完整的版本歷史和下載統計。 官方Open XML SDK文件解釋了IronXL實現的基礎XLSX規範。

您接下來的步驟是什麼?

您現在有一個工作模式,無需OleDb驅動程式、無需SQL語法,和無需平臺限制的將DataTable匯出到XLSX文件。 核心工作流程——SaveAs()——從三行樣本擴展到具有數十萬行的資料集。

最開始用上面顯示的基本IronXL模式替換您現有的OleDb匯出,然後在資料匯出驗證後使用樣式API層進行格式化。 IronXL入門指南功能概述是了解該程式庫支持的完整範圍的良好下一步閱讀材料。 如果您在同一管道中與CSV文件一起工作,C# DataTable到CSV指南顯示了如何從相同的DataTable物件生成逗號分隔的輸出。

常見問題

使用OleDb將DataTable匯出至Excel C#的限制是什麼?

使用OleDb將DataTable匯出至Excel C#可能令人沮喪,因為它具有傳統性質。開發者經常遇到相容性問題、性能較慢和更複雜的錯誤處理,使現代替代方案如IronXL更具吸引力。

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

IronXL提供了一種現代方法來匯出DataTable至Excel,提供更好的性能、更廣泛的相容性和簡化的程式碼。它消除了常見的OleDb挫折,使.NET開發者更容易管理Excel匯出。

為什麼我應該考慮從OleDb切換到IronXL進行DataTable匯出?

切換到IronXL進行DataTable匯出具有多個優勢,包括提高效能、更簡便的實施及增強與現代.NET應用程式的相容性,減少開發所需的時間和精力。

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

是的,IronXL專為有效處理大型DataTable匯出而設計,提供更快的處理時間並減少記憶體使用,相較於OleDb,這使其成為處理大資料集的應用程式的理想選擇。

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

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

像IronXL這樣的現代替代方案比傳統的OleDb有什麼好處?

像IronXL這樣的現代替代方案提供的優勢包括改善的效能、更簡單的錯誤處理、更好的相容性與各種Excel格式,以及簡化的程式碼,這能大幅提高開發者的生產力。

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

IronXL提供簡化的錯誤管理,具有清晰的例外處理,減少了OleDb相關的複雜性和潛在問題,使開發者更容易進行除錯和維護應用程式。

在基於UI的.NET應用程式中,將DataTable匯出至Excel的常見用例是什麼?

在基於UI的.NET應用程式中,將DataTable匯出至Excel常用於生成報告、資料分析和使用者友好的資料處理,通常由使用物件發送者模式的事件處理器觸發。

Curtis Chau
技術作家

Curtis Chau擁有Carleton大學的電腦科學學士學位,專精於前端開發,擁有Node.js、TypeScript、JavaScript和React的專業知識。Curtis熱衷於建立直觀且美觀的使用者介面,喜愛使用現代框架並建立結構良好、視覺吸引力的手冊。

除了開發,Curtis對物聯網(IoT)有濃厚的興趣,探索創新的方法來整合硬體和軟體。在空閒時間,他喜歡玩遊戲和建立Discord機器人,結合他對技術的熱愛與創造力。

Iron 支援團隊

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