
using C# 匯出 Excel 資料表 | 轉換 Excel 資料
匯出Excel資料到DataTable使您能夠結構化地、記憶體中存取電子表格內容,自然地與資料庫、UI控件和LINQ查詢一起工作。 將DataTable寫回Excel文件對於報告生成和資料儲存工作流同樣重要。 IronXL以純.NET處理雙向,不需要Microsoft Office依賴,也不需要COM互操作設置。
在運行以下任何範例之前,請安裝IronXL:
安裝後,System.Data結構。 您還可以通過將DataRow值寫回工作表並將文件保存為XLSX或XLS格式來反轉過程。
如何將整個工作表轉換為DataTable?
System.Data.DataTable。 傳遞true以將第一行視為列標題,以便最終表的列名與您的電子表格標題完全匹配。
using IronXL;
using System.Data;
// Load the workbook from disk
WorkBook workbook = WorkBook.Load("customers.xlsx");
// Grab the default (first) worksheet
WorkSheet worksheet = workbook.DefaultWorkSheet;
// Convert the entire sheet; first row becomes column headers
DataTable dataTable = worksheet.ToDataTable(true);
// Iterate every row and print each cell value
foreach (DataRow row in dataTable.Rows)
{
for (int i = 0; i < dataTable.Columns.Count; i++)
{
Console.Write(row[i] + "\t");
}
Console.WriteLine();
}Imports IronXL
Imports System.Data
' Load the workbook from disk
Dim workbook As WorkBook = WorkBook.Load("customers.xlsx")
' Grab the default (first) worksheet
Dim worksheet As WorkSheet = workbook.DefaultWorkSheet
' Convert the entire sheet; first row becomes column headers
Dim dataTable As DataTable = worksheet.ToDataTable(True)
' Iterate every row and print each cell value
For Each row As DataRow In dataTable.Rows
For i As Integer = 0 To dataTable.Columns.Count - 1
Console.Write(row(i) & vbTab)
Next
Console.WriteLine()
Next程式碼做了什麼
WorkBook.Load無需任何Office自動化即可讀取XLSX文件。 DataRow。 結果SqlBulkCopy,或者立即對其運行LINQ查詢。
ToDataTable調用支持XLS和XLSX格式,因此相同的程式碼可在不修改的情況下用於舊版電子表格。 查看IronXL DataTable和DataSet文件以獲取完整的API參考。
如何將特定單元格範圍匯出到DataTable?
當工作表包含多個資料區域,或者當您只需要部分行和列時,您可以匯出特定的單元格範圍,而不是整個工作表。 對於大型文件,這種方法效率更高,因為IronXL僅處理所選的單元格。
using IronXL;
using System.Data;
WorkBook workbook = WorkBook.Load("financial_report.xlsx");
// Access a named worksheet
WorkSheet worksheet = workbook.GetWorkSheet("Summary");
// Select only the region A1:D20 and convert it
DataTable dt = worksheet["A1:D20"].ToDataTable(true);
Console.WriteLine($"Rows: {dt.Rows.Count}, Columns: {dt.Columns.Count}");
foreach (DataRow row in dt.Rows)
{
foreach (var item in row.ItemArray)
{
Console.Write(item + "\t");
}
Console.WriteLine();
}Imports IronXL
Imports System.Data
Dim workbook As WorkBook = WorkBook.Load("financial_report.xlsx")
' Access a named worksheet
Dim worksheet As WorkSheet = workbook.GetWorkSheet("Summary")
' Select only the region A1:D20 and convert it
Dim dt As DataTable = worksheet("A1:D20").ToDataTable(True)
Console.WriteLine($"Rows: {dt.Rows.Count}, Columns: {dt.Columns.Count}")
For Each row As DataRow In dt.Rows
For Each item In row.ItemArray
Console.Write(item & vbTab)
Next
Console.WriteLine()
Next為何範圍選擇很重要
括號語法IronXL.Range物件。 在該範圍上調用ToDataTable將處理限制為正好那些單元格,這意味著當源文件有成千上萬行時,更快的執行和更小的記憶體佔用。
您還可以指定命名範圍,或在運行時動態構建範圍字串——例如,$"A1:D{lastRow}"——使這種方法對於可變長度的資料匯出來說靈活。 Range類API參考記錄了所有可用的選擇和查詢方法。
如何將多工作表工作簿轉換為DataSet?
包含多個工作表的工作簿自然映射到DataTable。 ToDataSet方法在一個調用中執行此轉換。
using IronXL;
using System.Data;
WorkBook workbook = WorkBook.Load("multi_sheet.xlsx");
// Each worksheet becomes a DataTable inside the DataSet
DataSet dataSet = workbook.ToDataSet();
foreach (DataTable table in dataSet.Tables)
{
Console.WriteLine($"Sheet: {table.TableName}");
Console.WriteLine($"Rows: {table.Rows.Count}");
Console.WriteLine();
}Imports IronXL
Imports System.Data
Dim workbook As WorkBook = WorkBook.Load("multi_sheet.xlsx")
' Each worksheet becomes a DataTable inside the DataSet
Dim dataSet As DataSet = workbook.ToDataSet()
For Each table As DataTable In dataSet.Tables
Console.WriteLine($"Sheet: {table.TableName}")
Console.WriteLine($"Rows: {table.Rows.Count}")
Console.WriteLine()
Next按名稱存取工作表
返回的dataSet.Tables["Summary"]檢索特定工作表,而不是迭代集合。 這使得構建多工作表報告邏輯或在將結果寫入到資料庫之前合併多個工作表中的資料變得簡單。
想了解更多關於使用多工作表和導航工作簿結構的方法,請參見如何打開和管理Excel工作表。
如何將DataTable寫回到Excel文件?
匯入到DataTable方向只是故事的一半。 當您需要將結構化資料寫回為電子表格時——用於報告、下載或歸檔——您可以建立一個新的工作簿,從DataTable填入單元格並保存。
using IronXL;
using System.Data;
// Build a sample DataTable
DataTable dt = new DataTable();
dt.Columns.Add(new DataColumn("ProductID", typeof(int)));
dt.Columns.Add(new DataColumn("ProductName", typeof(string)));
dt.Columns.Add(new DataColumn("UnitPrice", typeof(decimal)));
dt.Rows.Add(1, "Widget Pro", 29.99m);
dt.Rows.Add(2, "Gadget Max", 49.99m);
dt.Rows.Add(3, "Sensor Kit", 14.50m);
// Create a new workbook and worksheet
WorkBook workbook = WorkBook.Create();
WorkSheet worksheet = workbook.CreateWorkSheet("Products");
// Write column headers from DataTable.Columns
for (int col = 0; col < dt.Columns.Count; col++)
{
worksheet.SetCellValue(0, col, dt.Columns[col].ColumnName);
}
// Write data rows
for (int row = 0; row < dt.Rows.Count; row++)
{
for (int col = 0; col < dt.Columns.Count; col++)
{
worksheet.SetCellValue(row + 1, col, dt.Rows[row][col]);
}
}
// Save as XLSX
workbook.SaveAs("products_export.xlsx");
Console.WriteLine("Export complete.");Imports IronXL
Imports System.Data
' Build a sample DataTable
Dim dt As New DataTable()
dt.Columns.Add(New DataColumn("ProductID", GetType(Integer)))
dt.Columns.Add(New DataColumn("ProductName", GetType(String)))
dt.Columns.Add(New DataColumn("UnitPrice", GetType(Decimal)))
dt.Rows.Add(1, "Widget Pro", 29.99D)
dt.Rows.Add(2, "Gadget Max", 49.99D)
dt.Rows.Add(3, "Sensor Kit", 14.50D)
' Create a new workbook and worksheet
Dim workbook As WorkBook = WorkBook.Create()
Dim worksheet As WorkSheet = workbook.CreateWorkSheet("Products")
' Write column headers from DataTable.Columns
For col As Integer = 0 To dt.Columns.Count - 1
worksheet.SetCellValue(0, col, dt.Columns(col).ColumnName)
Next
' Write data rows
For row As Integer = 0 To dt.Rows.Count - 1
For col As Integer = 0 To dt.Columns.Count - 1
worksheet.SetCellValue(row + 1, col, dt.Rows(row)(col))
Next
Next
' Save as XLSX
workbook.SaveAs("products_export.xlsx")
Console.WriteLine("Export complete.")單元格寫入迴圈運作方式
object值,因此您可以傳遞列名作為標題行和原始單元格值作為資料行,而不需要任何型別轉換。 row + 1的行偏移量保留第0行作為標題。 結果XLSX文件是一個完全有效的電子表格——沒有佔位符,沒有臨時文件。
對於較大的DataTable,考慮在寫入資料後應用列自動調整大小以便內容能夠整潔顯示,而無需人工格式化。
如何將DataTable綁定到DataGridView?
將Excel工作表匯出到DataTable的最常見原因之一是顯示它在Windows Form的DataGridView中。 一旦您有一個DataTable,綁定只需一行程式碼。
using IronXL;
using System.Data;
using System.Windows.Forms;
WorkBook workbook = WorkBook.Load("inventory.xlsx");
WorkSheet worksheet = workbook.DefaultWorkSheet;
DataTable dataTable = worksheet.ToDataTable(true);
// Bind directly to a DataGridView
dataGridViewInventory.DataSource = dataTable;Imports IronXL
Imports System.Data
Imports System.Windows.Forms
Dim workbook As WorkBook = WorkBook.Load("inventory.xlsx")
Dim worksheet As WorkSheet = workbook.DefaultWorkSheet
Dim dataTable As DataTable = worksheet.ToDataTable(True)
' Bind directly to a DataGridView
dataGridViewInventory.DataSource = dataTable綁定時會發生什麼
設置DataTable讀取列名稱和行資料。 每個DataRow變為可見行。 您可以通過網格的內建控件應用排序、篩選和選擇行為,而不需要額外程式碼。
這種模式同樣適用於WPF DataGrid、ASP.NET GridView和任何其他.NET資料綁定基礎結構。 有關逐步指南,請參見如何將DataGridView匯出到Excel以了解相反方向的操作。
如何在匯出的DataTable上使用LINQ查詢?
在將工作表轉換為DataRow轉換為可查詢元素。
using IronXL;
using System.Data;
using System.Linq;
WorkBook workbook = WorkBook.Load("sales.xlsx");
DataTable dt = workbook.DefaultWorkSheet.ToDataTable(true);
// Filter rows where the "Revenue" column exceeds 10000
var highRevenue = dt.AsEnumerable()
.Where(row => row.Field<double>("Revenue") > 10000)
.OrderByDescending(row => row.Field<double>("Revenue"))
.ToList();
Console.WriteLine($"High-revenue records: {highRevenue.Count}");
foreach (var row in highRevenue)
{
Console.WriteLine($"{row["Product"]}: {row["Revenue"]:C}");
}Imports IronXL
Imports System.Data
Imports System.Linq
Dim workbook As WorkBook = WorkBook.Load("sales.xlsx")
Dim dt As DataTable = workbook.DefaultWorkSheet.ToDataTable(True)
' Filter rows where the "Revenue" column exceeds 10000
Dim highRevenue = dt.AsEnumerable() _
.Where(Function(row) row.Field(Of Double)("Revenue") > 10000) _
.OrderByDescending(Function(row) row.Field(Of Double)("Revenue")) _
.ToList()
Console.WriteLine($"High-revenue records: {highRevenue.Count}")
For Each row In highRevenue
Console.WriteLine($"{row("Product")}: {row("Revenue"):C}")
Next為何在DataTable上使用LINQ有用
LINQ查詢為您提供了一種可讀的、強型別的方法,用於篩選、排序、分組和投影來自轉換工作表的資料。 InvalidCastException,而不是返回靜默的null。 這使得更容易在早期發現資料質量問題。
將這種方法與前一節中的基於範圍的匯出相結合,以查詢特定的工作表區域,而不是整個工作表,在處理大文件時保持記憶體佔用低。
如何在匯出過程中處理空或空白單元格?
Excel電子表格通常有間隙——空白單元格、合併區域或佔位符文字。 IronXL將空單元格映射為DataTable中,匹配標準ADO.NET行為,因此您的現有空值處理程式碼可不加修改地運行。
| Excel單元格狀態 | DataTable值 | 註釋 |
|---|---|---|
| 文字值 | 字串 | 原樣返回 |
| 數字值 | 雙精度或十進位 | 取決於單元格格式 |
| 日期值 | 日期時間 | 從序列號解析 |
| 布林值 | 布林 | 在Excel中為TRUE/FALSE |
| 空單元格 | DBNull.Value | 標準ADO.NET空值 |
| 公式單元格 | 計算結果 | IronXL首先評估公式 |
將DBNull.Value字段產生空單元格,保留來回運輸的忠實度。 如果您需要null字段的預設字串,請在調用DBNull.Value。
有關進一步的資料準備指導,Microsoft的DataTable類文件深入介紹空值處理、約束管理和行狀態。
如何在匯出大型工作表時節省記憶體?
對於有數以千計行的工作表,同步匯出整個工作表會同時在記憶體中分配所有資料。 兩個IronXL模式降低記憶體峯值使用量:
- 範圍匯出:使用
worksheet["A1:D5000"].ToDataTable(true)處理有界區域,而不是整個工作表。 - 批處理:通過
worksheet.RowCount計算最後使用的行,然後迴圈固定大小的範圍——例如,每次1000行——並在移動到下一批之前處理每批。
worksheet.ColumnCount屬性讓您能夠構建動態範圍字串,而不需要硬編碼維度:
using IronXL;
using System.Data;
WorkBook workbook = WorkBook.Load("large_dataset.xlsx");
WorkSheet worksheet = workbook.DefaultWorkSheet;
int batchSize = 1000;
int totalRows = worksheet.RowCount;
for (int startRow = 1; startRow <= totalRows; startRow += batchSize)
{
int endRow = Math.Min(startRow + batchSize - 1, totalRows);
string rangeAddress = $"A{startRow}:Z{endRow}";
DataTable batch = worksheet[rangeAddress].ToDataTable(false);
// Process each batch -- write to database, transform, etc.
Console.WriteLine($"Processed rows {startRow} to {endRow}");
}Imports IronXL
Imports System.Data
Dim workbook As WorkBook = WorkBook.Load("large_dataset.xlsx")
Dim worksheet As WorkSheet = workbook.DefaultWorkSheet
Dim batchSize As Integer = 1000
Dim totalRows As Integer = worksheet.RowCount
For startRow As Integer = 1 To totalRows Step batchSize
Dim endRow As Integer = Math.Min(startRow + batchSize - 1, totalRows)
Dim rangeAddress As String = $"A{startRow}:Z{endRow}"
Dim batch As DataTable = worksheet(rangeAddress).ToDataTable(False)
' Process each batch -- write to database, transform, etc.
Console.WriteLine($"Processed rows {startRow} to {endRow}")
Next這種模式特別適用於在C#中讀取大型Excel文件,因為存在記憶體限制。
如何將DataTable寫入到資料庫?
一旦您有一個SqlBulkCopy插入到SQL Server是大型資料集的最快路徑。 INSERT語句的情況下批量傳輸行。
using IronXL;
using System.Data;
using Microsoft.Data.SqlClient;
WorkBook workbook = WorkBook.Load("orders.xlsx");
DataTable dataTable = workbook.DefaultWorkSheet.ToDataTable(true);
string connection字串 = "Server=.;Database=OrdersDB;Trusted_Connection=True;";
using SqlConnection connection = new(connection字串);
connection.Open();
using SqlBulkCopy bulkCopy = new(connection);
bulkCopy.DestinationTableName = "dbo.Orders";
bulkCopy.BatchSize = 500;
bulkCopy.BulkCopyTimeout = 60;
// Map DataTable columns to database columns
bulkCopy.ColumnMappings.Add("OrderID", "OrderID");
bulkCopy.ColumnMappings.Add("CustomerName", "CustomerName");
bulkCopy.ColumnMappings.Add("TotalAmount", "TotalAmount");
bulkCopy.WriteToServer(dataTable);
Console.WriteLine("Bulk insert complete.");
列映射考慮
DataTable列名匹配到資料庫列名。 如果兩者名稱相同,您可以省略單獨的映射,SqlBulkCopy會自動按名稱匹配。 當電子表格列順序與資料庫架構不同時,顯式映射更安全。
有關如何將IronXL與資料庫工作流程相結合的更多資訊,C# Excel匯入指南涵蓋其他匯入場景,包括插入前驗證。
對於基於Entity Framework的項目,先將您的DataTable行轉換為型別化模型物件,然後使用像EFCore.BulkExtensions這樣的庫中的DbContext.BulkInsert進行ORM感知的批量插入。 Microsoft的SqlBulkCopy文件詳細解釋了批量選項和事務支持。
您接下來的步驟是什麼?
您現在有一套完整的工具包,用於在Excel和DataTable之間進行雙向的資料移動,使用IronXL:
- 使用
worksheet.ToDataTable(true)轉換整個工作表以進行標題感知的匯出 - 使用
worksheet["A1:D20"].ToDataTable(true)語法匯出特定的單元格範圍 - 使用
DataSet存取 - 通
DataRow值 - 將
DataSource分配 - 直接從
SqlBulkCopy,以實現高吞吐量的資料庫插入
為了加深您的IronXL技能,探索這些相關主題:
- 匯出DataSet和DataTable——完整API參考
- 在C#中將Excel轉換為DataTable,而不使用OleDb
- C# DataTable to Excel export tutorial
- Export DataTable to Excel from ASP.NET
- 最快速的方法將DataTable匯出至Excel
- 在C#中載入和讀取Excel文件
- 匯出帶格式的Excel文件
- 在C#中閱讀Excel文件——最佳實踐
- C# Excel範圍選擇和操作
- 匯入Excel資料到C#應用程式
開始使用免費IronXL試用授權來在自己的項目中運行這些範例。 準備展示時,購買生產許可或與團隊對話以獲取授權建議。

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



