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並運行:
IronXL無需依賴於Microsoft Office、Access Database Engine或任何COM互操作層。 一旦安裝了此套件,您可以在Windows、Linux、macOS、Docker、Azure和AWS上運行相同的程式碼,而不需要更改一行程式碼。
為什麼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();
}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 UsingImports 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此程式碼將每個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")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")WorkBook.Create(ExcelFileFormat.XLSX)在記憶體中構建一個全新的工作簿——不需要事先存在文件。 CreateWorkSheet("Products")附加了一個命名標籤。 巢狀的迴圈精確地鏡像DataTable的行和列計數,並為每個單元格寫入一個值。 SaveAs()將工作簿以完全有效的XLSX文件形式刷新到磁碟。
輸出

欲深入了解可用的選項,導出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")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")這會生成一個具有藍色標題行、白色標題文字以及顯示有美元符號和兩位小數的價格值的文件。 單元格字體大小指南和邊框和對齊參考解釋了可用的完整樣式選項。
處理大量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")' 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")ASP.NET 導出 DataTable 到 Excel 教程介紹了完整的控制器和視圖接線方式,適用於ASP.NET應用程式。 DataTable 到 Excel C#指南涵蓋了包括多表導出和DataSet支持在內的其他場景。
OleDb與IronXL一目了然對比
| 功能 | 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")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")Excel現在可以按數字排序金額列,並使用日期選擇器篩選日期列。 欲了解其他資料格式模式,請參閱設置單元格資料格式指南。 如果您需要在匯出後讀取資料,Excel到DataTable教程涵蓋了反向操作。
遷移現有的OleDb匯出程式碼
從OleDb遷移到IronXL通常比一個運行週期所需的時間更短。 結構性變更如下:
- 移除所有
using System.Data.OleDb引用和NuGet對任何ACE驅動程式包裝器的引用。 - 用
OleDbConnection初始化區塊。 - 用
CREATE TABLE命令。 - 用巢狀的
INSERT INTO迴圈,每個單元格各一次。 - 用
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"Imports IronXL
IronXL.License.LicenseKey = "YOUR-LICENSE-KEY-HERE"許可密鑰應用指南介紹了所有的放置選項,包括配置文件和環境變數。 對於雲端部署,Docker和Linux入門頁涵蓋了平臺特定的設置步驟。
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物件生成逗號分隔的輸出。
Curtis Chau擁有Carleton大學的電腦科學學士學位,專精於前端開發,擁有Node.js、TypeScript、JavaScript和React的專業知識。Curtis熱衷於建立直觀且美觀的使用者介面,喜愛使用現代框架並建立結構良好、視覺吸引力的手冊。
