跳過到頁腳內容
使用 IRONXL

在C#中將Excel匯出為DataTable | 轉換Excel數據

將 Excel 資料匯出至 DataTable 讓您以結構化的方式在記憶體中存取電子表格內容,從而自然地與資料庫、UI 控制項和 LINQ 查詢搭配使用。 反向操作-將 DataTable 寫回 Excel 檔案-對於報表產生和資料儲存工作流程同樣重要。 IronXL在純.NET環境下處理雙向通信,無需 Microsoft Office 依賴,也無需 COM 互通設定。

請先安裝IronXL ,然後再執行以下任何範例:

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

安裝完成後,WorkBookWorkSheet 類型會公開 ToDataTableToDataSet 方法,這些方法可以直接對應到 System.Data 結構。 您也可以將 DataRow 值寫回工作表並將檔案儲存為 XLSX 或 XLS 格式來逆轉此過程。

如何將整個工作表轉換為資料表?

ToDataTable 方法將整個工作表或命名區域轉換為 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();
}
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();
}
$vbLabelText   $csharpLabel

代碼的作用

WorkBook.Load 無需任何 Office 自動化即可讀取 XLSX 檔案。 worksheet.ToDataTable(true) 遍歷工作表中的每個單元格,並將其對應到 DataRow,使用第一行作為 DataColumn 名稱。 產生的 DataTable 是標準的 System.Data 物件—您可以將其綁定到 DataGridView,將其傳遞給 SqlBulkCopy,或立即對其執行 LINQ 查詢。

ToDataTable 呼叫同時支援 XLS 和 XLSX 格式,因此相同的程式碼無需修改即可用於舊版電子表格。 有關完整的 API 參考,請參閱IronXL DataTable 和 DataSet 文件

如何將特定單元格區域匯出到資料表?

當工作表包含多個資料區域,或只需要部分行和列時,您可以匯出特定的儲存格區域,而不是整個工作表。 對於大型文件,這種方法效率更高,因為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();
}
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();
}
$vbLabelText   $csharpLabel

為什麼選擇合適的射程很重要

方括號語法 worksheet["A1:D20"] 傳回一個 IronXl.Range 物件。 對該範圍呼叫 ToDataTable 可將處理限制在這些儲存格內,這表示當來源檔案有數萬行時,執行速度更快,記憶體佔用更小。

您還可以指定命名範圍,或在運行時動態建立範圍字串——例如,$"A1:D{lastRow}"——使該方法能夠靈活地匯出可變長度的資料。 Range 類別 API 參考文件記錄了所有可用的選擇和查詢方法。

如何將多重工作表工作簿轉換為資料集?

具有多個工作表的日記本自然地映射到 System.Data.DataSet,其中每個工作表都成為一個單獨的 DataTableToDataSet 方法只需一次呼叫即可完成此轉換。

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();
}
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();
}
$vbLabelText   $csharpLabel

按名稱存取工作表

傳回的每個 DataTable 都使用原始工作表名稱作為其 TableName 屬性,因此您可以使用 dataSet.Tables["Summary"] 檢索特定工作表,而無需遍歷集合。 這樣就可以輕鬆建立多工作表報表邏輯,或是在將結果寫入資料庫之前合併多個工作表中的資料。

有關使用多個工作表和瀏覽工作簿結構的更多方法,請參閱如何開啟和管理 Excel 工作表

如何將資料表匯出回 Excel 檔案?

將資料匯入到資料表只是問題的一半。 當您需要將結構化資料寫回電子表格時(用於報表、下載或存檔),您可以建立新的工作簿,從 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.");
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.");
$vbLabelText   $csharpLabel

細胞寫入循環的工作原理

SetCellValue(rowIndex, columnIndex, value) 接受 object 值,因此您可以傳遞標題行的列名和資料行的原始儲存格值,而無需進行任何類型轉換。 row + 1 的行偏移量為第 0 行保留標題。 產生的 XLSX 檔案是一個完全有效的電子表格——沒有佔位符,也沒有臨時檔案。

對於較大的資料表,建議在寫入資料後套用列自動調整大小功能,以便內容能夠清晰顯示,無需手動格式化。

如何將 DataTable 綁定到 DataGridView?

將 Excel 表格匯出到 DataTable 的最常見原因之一是將其顯示在 Windows 窗體 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;
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;
$vbLabelText   $csharpLabel

綁定時會發生什麼

設定 DataSource 會觸發 DataGridViewDataTable 讀取列名和行資料。 每個 DataColumn 都變成一個網格列,每個 DataRow 都變成一個可見行。 您可以透過網格的內建控制來套用排序、篩選和選擇行為,而無需任何額外的程式碼。

此模式同樣適用於 WPF DataGrid、 ASP.NET GridView 和任何其他.NET資料綁定基礎架構。 有關逐步指南,請參閱如何將 DataGridView 匯出到 Excel以了解反向操作。

如何在匯出的資料表上使用 LINQ 查詢?

將工作表轉換為 DataTable 後,您可以使用 AsEnumerable() 擴充方法來執行 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}");
}
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}");
}
$vbLabelText   $csharpLabel

為什麼 LINQ on DataTable 很有用

LINQ 查詢提供了一種可讀性強、類型明確的方式來篩選、排序、分組和投影轉換後的工作表中的資料。 row.Field<t>(columnName) 能夠乾淨利落地處理類型強制轉換,如果值無法轉換,則會拋出 InvalidCastException 異常,而不是傳回靜默的 null 值。 這樣更容易及早發現資料品質問題。

將此方法與前面章節中的基於範圍的匯出相結合,以查詢特定的工作表區域而不是整個工作表,從而降低大檔案的記憶體使用量。

匯出過程中如何處理空白單元格?

Excel電子表格中常會出現空白區域-空白儲存格、合併區域或占位符文字。 IronXL將空白儲存格對應到匯出的 DataTable 中的 DBNull.Value,與標準的 ADO .NET行為相匹配,因此您現有的空處理程式碼無需修改即可運作。

IronXL如何將 Excel 儲存格狀態對應到資料表值
Excel 儲存格狀態 數據表值 筆記
文字值 細繩 按原樣退回
數值 雙精度或十進制 取決於單元格格式
日期值 日期時間 從序號解析
布林值 布林值 Excel 中的 TRUE/FALSE
空白單元格 DBNull.Value 標準.NET null
公式單元格 計算結果 IronXL首先評估該配方。

當將 DataTable 寫回 Excel 時,DBNull.Value 欄位會產生空白儲存格,從而保持往返的準確性。 如果您需要為空字段設定預設字串,請在呼叫 SetCellValue 之前,將 DBNull.Value 替換為您的佔位符。

有關資料準備的更多指導,請參閱 Microsoft 的DataTable 類文檔,其中詳細介紹了空值處理、限制管理和行狀態。

匯出大型工作表時如何節省記憶體?

對於包含數千行的工作表,一次性匯出整個工作表會將所有資料同時分配到記憶體中。 IronXL 的兩種模式可降低峰值記憶體使用率:

-範圍匯出:使用 worksheet["A1:D5000"].ToDataTable(true) 處理有界區域而不是整個工作表。 -批次處理:使用 worksheet.RowCount 計算最後一個使用的行,然後循環處理固定大小的範圍(例如一次 1,000 行),並在處理完每個批次後再進行下一個批次。

worksheet.RowCountworksheet.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}");
}
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}");
}
$vbLabelText   $csharpLabel

這種模式對於在 C# 中讀取大型 Excel 檔案尤其適用,因為此時記憶體會受到限制。

如何將資料表寫入資料庫?

一旦你有了 DataTable,透過 SqlBulkCopy 將其插入 SQL Server 是處理大型資料集的最快途徑。 SqlBulkCopy 直接接受 DataTable 並批次處理行,而無需建立單獨的 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.");
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.");
$vbLabelText   $csharpLabel

列映射注意事項

ColumnMappings 集合將 DataTable 列名與資料庫列名相符。 如果兩個名稱相同,則可以省略個別映射,SqlBulkCopy 將按名稱自動匹配。 當電子表格列順序與資料庫架構不同時,明確映射更安全。

有關如何將IronXL與資料庫工作流程結合使用的更多信息,請參閱 C# Excel 導入指南,其中涵蓋了其他導入場景,包括插入前的驗證。

對於基於 Entity Framework 的項目,請先將 DataTable 行轉換為類型化模型對象,然後使用EFCore.BulkExtensions等庫中的 DbContext.BulkInsert 進行 ORM 感知的批次插入。 微軟的SqlBulkCopy 文件詳細解釋了批次選項和事務支援。

下一步計劃是什麼?

現在,您可以使用IronXL在 Excel 和 DataTable 之間雙向傳輸數據,擁有一套完整的工具包:

  • 使用 worksheet.ToDataTable(true) 轉換整個工作表,以便匯出包含表頭的信息 使用 worksheet["A1:D20"].ToDataTable(true) 語法匯出特定儲存格區域
  • 轉換多工作表工作簿,以獲得完整的存取權限
  • 透過迭代 DataRow 的值,將 SetCellValue 的內容寫回 XLSX
  • 使用單一 DataTable 賦值將 DataGridView 綁定到 UI 控件,例如 DataSource
  • 直接從 DataTable 取得 SqlBulkCopy,以實現高吞吐量的資料庫插入

為了加深您的IronXL技能,請探索以下相關主題:

-匯出資料集和資料表 -- 完整 API 參考

首先取得IronXL免費試用許可證,即可在您自己的專案中執行這些範例。 準備部署時,請購買生產許可證與團隊聯繫以獲取許可指導。

立即開始在您的項目中使用 IronXL 並免費試用。

第一步:
green arrow pointer

常見問題解答

如何使用 IronXL 在 C# 中將 Excel 資料匯出至 DataTable?

您可以在 C# 中使用 IronXL 將 Excel 資料匯出至 DataTable:首先將 Excel 檔案載入 IronXL,選取工作表或範圍,然後使用 ExportToDataTable 方法將資料轉換為 DataTable 物件。

將 Excel 資料轉換為 DataTable 有什麼好處?

將 Excel 資料轉換為 DataTable 可提供結構化資料,非常適合用於資料庫操作、與 UI 控制項進行資料綁定,以及與 .NET 無縫整合。這也便於在 C# 應用程式中輕鬆操作和處理資料。

IronXL 能否同時處理 Excel 與 DataTable 之間的資料匯入與匯出?

是的,IronXL 能高效處理將資料從 Excel 匯入 DataTable,以及將資料從 DataTable 匯出至 Excel 的作業,使其成為管理 C# 應用程式中資料交換的萬用工具。

是否可以使用 IronXL 將 Excel 工作表中的特定範圍轉換為 DataTable?

是的,IronXL 允許您選取 Excel 試算表中的特定範圍,並將其轉換為 DataTable,讓您在資料處理與擷取方面擁有更大的靈活性。

使用 IronXL 進行 Excel 資料轉換時,是否需要安裝 Microsoft Office?

不,您無需在電腦上安裝 Microsoft Office 即可使用 IronXL 將 Excel 資料轉換為 DataTable,或反之亦然。IronXL 的運作與 Microsoft Office 完全獨立。

使用 IronXL 可以將哪些類型的資料從 Excel 轉換為 DataTable?

IronXL 能將 Excel 中的各類資料(包括數字、文字、日期及公式)轉換為 DataTable 格式,同時保留資料的完整性與結構。

IronXL 能否將 DataTable 匯出回 Excel 檔案?

是的,IronXL 能夠將 DataTable 匯出回 Excel 檔案,讓您能直接從 C# 應用程式生成報表或建立資料儲存解決方案。

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

Iron Support Team

We're online 24 hours, 5 days a week.
Chat
Email
Call Me