IRONSOFTWAREHOME
USING IRONXL

using C# 匯出 Excel 資料表 | 轉換 Excel 資料

Curtis Chau
Curtis Chau
Updated: 2026年6月28日

匯出Excel資料到DataTable使您能夠結構化地、記憶體中存取電子表格內容,自然地與資料庫、UI控件和LINQ查詢一起工作。 將DataTable寫回Excel文件對於報告生成和資料儲存工作流同樣重要。 IronXL以純.NET處理雙向,不需要Microsoft Office依賴,也不需要COM互操作設置。

在運行以下任何範例之前,請安裝IronXL:

PM > Install-Package IronXL.Excel

安裝後,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();
}

程式碼做了什麼

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

為何範圍選擇很重要

括號語法IronXL.Range物件。 在該範圍上調用ToDataTable將處理限制為正好那些單元格,這意味著當源文件有成千上萬行時,更快的執行和更小的記憶體佔用。

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

如何將多工作表工作簿轉換為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();
}

按名稱存取工作表

返回的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.");

單元格寫入迴圈運作方式

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;

綁定時會發生什麼

設置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}");
}

為何在DataTable上使用LINQ有用

LINQ查詢為您提供了一種可讀的、強型別的方法,用於篩選、排序、分組和投影來自轉換工作表的資料。 InvalidCastException,而不是返回靜默的null。 這使得更容易在早期發現資料質量問題。

將這種方法與前一節中的基於範圍的匯出相結合,以查詢特定的工作表區域,而不是整個工作表,在處理大文件時保持記憶體佔用低。

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

Excel電子表格通常有間隙——空白單元格、合併區域或佔位符文字。 IronXL將空單元格映射為DataTable中,匹配標準ADO.NET行為,因此您的現有空值處理程式碼可不加修改地運行。

IronXL如何將Excel單元格狀態映射到DataTable值
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}");
}

這種模式特別適用於在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.");
C#

列映射考慮

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技能,探索這些相關主題:

開始使用免費IronXL試用授權來在自己的項目中運行這些範例。 準備展示時,購買生產許可或與團隊對話以獲取授權建議。

第一步:
arrow pointer
Curtis Chau
技術作家

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

...
閱讀更多

相關文章

Key in blue circle

立即免費取得 30 天試用金鑰

Your trial license will be sent to your email address

無任何限制。100% 解鎖。無需信用卡。

bullet_checked無需信用卡或建立帳號無任何限制。100% 解鎖。無需信用卡。
  • Logo Aetna
  • Logo NASA
  • Logo GE
  • Logo Porsche
  • Logo USDA
  • Logo Qatar
Join Millions of Engineers who’ve tried IronPDF
預約您的免費即時演示
Booking Badge

全球數百萬工程師的信賴

Iron Software的客戶標誌
獲得無義務諮詢
填寫以下表格或電郵sales@ironsoftware.com
您的資料將始終保密。
全球數百萬工程師的信賴
Iron Software的客戶標誌
立即獲取您的30天試用金鑰
無需信用卡或帳戶建立