跳過到頁腳內容
使用 IRONXL

C# 讀取 Excel 檔案的最佳方式 | IronXL 逐步指南

對於.NET開發人員來說,在 C# 中讀取 Excel 檔案是常見的挑戰。 無論您是建立資料匯入管道、報表工具還是批次系統,正確解析電子表格資料都至關重要。 IronXL是一個.NET庫,它無需伺服器上的 Microsoft Office 或 COM 互通 即可處理 XLSX、XLS 和 CSV 檔案。 本指南將帶您了解完整的流程—從安裝到進階查詢—以便您可以為您的專案選擇正確的方法。

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

第一步:
green arrow pointer

在 C# 中讀取 Excel 檔案的最佳方法是什麼?

最佳方法是使用專用的、獨立於 Office 的庫,例如IronXL。 像 Microsoft.Office.Interop.Excel 這樣的傳統方法在安裝了 Excel 的機器上可以正常工作,但在伺服器或容器環境中卻很脆弱,因為它們會在後台啟動一個 COM 進程。 OpenXML SDK 是免費的,並且對伺服器安全,但它公開了一個底層 XML 模型,日常任務需要大量的樣板程式碼。

IronXL 的表現介於這兩種極端情況之間。 此 API 反映了開發者對電子表格的固有認知-工作簿包含工作表,工作表包含儲存格,且儲存格包含輸入的值。 該庫內部處理格式檢測、公式計算和編碼,因此您可以將時間花在業務邏輯上,而不是解析細節。

C# 中 Excel 閱讀方法的比較
方法 需要 Office 嗎? 伺服器安全嗎? API 的簡潔性 格式支援
COM 互通 是的 低的 XLSX、XLS
OpenXML SDK 是的 低的 限 XLSX
IronXL 是的 高的 XLSX、XLS、CSV

IronXL Excel 讀取文件涵蓋了完整的 API 介面。 目前,以下各節展示了您在每個專案中都會用到的核心模式。

如何在.NET專案中安裝IronXL ?

使用NuGet套件管理器安裝只需不到一分鐘。 在專案目錄下開啟終端並運行:

dotnet add package IronXl.Excel
dotnet add package IronXl.Excel
SHELL

或者,使用 Visual Studio 套件管理器控制台:

Install-Package IronXl.Excel
Install-Package IronXl.Excel
SHELL

安裝完成後,將 using IronXL; 指令新增至任何需要存取電子表格的檔案。 該程式庫面向.NET 10、 .NET 8、 .NET 6、 .NET Framework 4.6.2 和.NET Standard 2.0,因此無需升級執行時間即可整合到現有專案中。有關特定平台的說明和NuGet套件詳細信息,請參閱IronXL安裝指南

無需額外的執行時間元件、登錄項目或 Office 授權。 NuGet套件包含了函式庫所需的一切。

驗證安裝

新增軟體包後,建置一次專案以確認引用解析正確。 如果您看到 CS0246 類型的錯誤,請檢查 IronXL 指令是否存在,以及您的 .csproj 中的目標框架是否為受支援的版本之一。 IronXL相容性矩陣列出了所有已確認的執行時間目標。

如何載入和讀取Excel工作簿?

載入工作簿只需要呼叫一個方法。 WorkBook.Load 接受一個檔案路徑,並傳回一個 WorkBook 對象,該物件表示記憶體中的整個檔案。

using IronXL;

// Load any supported format -- XLSX、XLS, or CSV
WorkBook workbook = WorkBook.Load("financial_report.xlsx");

// Access the first worksheet by position
WorkSheet worksheet = workbook.WorkSheets[0];

// Or retrieve a named worksheet
WorkSheet expenses = workbook.GetWorkSheet("Expenses");

Console.WriteLine($"Sheets loaded: {workbook.WorkSheets.Count}");
Console.WriteLine($"Default sheet rows: {worksheet.RowCount}");
using IronXL;

// Load any supported format -- XLSX、XLS, or CSV
WorkBook workbook = WorkBook.Load("financial_report.xlsx");

// Access the first worksheet by position
WorkSheet worksheet = workbook.WorkSheets[0];

// Or retrieve a named worksheet
WorkSheet expenses = workbook.GetWorkSheet("Expenses");

Console.WriteLine($"Sheets loaded: {workbook.WorkSheets.Count}");
Console.WriteLine($"Default sheet rows: {worksheet.RowCount}");
$vbLabelText   $csharpLabel

使用IronXL在 C# 中讀取 Excel 檔案的最佳方法:圖 1 - 用於確認工作簿已載入的控制台輸出

WorkBook 物件可存取所有工作表資料。 每個 WorkSheet 實例都會對應到檔案中的一個製表符。透過索引 (WorkSheets[0]) 存取單頁檔案是可靠的; 當檔案包含多個名稱已知的標籤頁時,按名稱存取會更安全。

IronXL會在讀取儲存格時自動計算公式。 如果儲存格 B10 包含 =SUM(B2:B9),則讀取 sheet["B10"].DecimalValue 傳回計算出的總計,而不是公式字串。 有關工作簿加載選項的更多詳細信息,請參閱加載電子表格操作指南

同時處理多個工作表

當工作簿包含多個工作表時,可以使用 workbook.WorkSheets 列舉它們,並依序處理每個工作表。 這對於按月、部門或地區將資料拆分到不同標籤頁的文件非常有用。 WorkSheet.Name 屬性會將選項卡標籤作為字串提供給你,你可以將其用於條件處理或日誌記錄。

如何讀取工作表中的儲存格值?

IronXL為每個儲存格提供強型別屬性,因此您可以直接將值讀取到正確的.NET類型中,而無需手動解析。

using IronXL;

WorkBook workbook = WorkBook.Load("Products.xlsx");
WorkSheet sheet = workbook.DefaultWorkSheet;

// Address-based access with typed properties
string productName = sheet["A2"].StringValue;
int quantity       = sheet["B2"].IntValue;
decimal price      = sheet["C2"].DecimalValue;
bool inStock       = sheet["D2"].BoolValue;

// Check for empty cells before processing
var statusCell = sheet["E2"];
if (statusCell.Value != null && statusCell.StringValue.Length > 0)
{
    Console.WriteLine($"Status: {statusCell.StringValue}");
}

// Row/column index access (zero-based)
var firstDataCell = sheet.Rows[1].Columns[0];
Console.WriteLine($"Product: {productName}, Qty: {quantity}, Price: {price:C}");
using IronXL;

WorkBook workbook = WorkBook.Load("Products.xlsx");
WorkSheet sheet = workbook.DefaultWorkSheet;

// Address-based access with typed properties
string productName = sheet["A2"].StringValue;
int quantity       = sheet["B2"].IntValue;
decimal price      = sheet["C2"].DecimalValue;
bool inStock       = sheet["D2"].BoolValue;

// Check for empty cells before processing
var statusCell = sheet["E2"];
if (statusCell.Value != null && statusCell.StringValue.Length > 0)
{
    Console.WriteLine($"Status: {statusCell.StringValue}");
}

// Row/column index access (zero-based)
var firstDataCell = sheet.Rows[1].Columns[0];
Console.WriteLine($"Product: {productName}, Qty: {quantity}, Price: {price:C}");
$vbLabelText   $csharpLabel

使用IronXL在 C# 中讀取 Excel 檔案的最佳方法:圖 2 - 使用IronXL讀取 Excel 檔案輸出

sheet["A2"] 語法使用標準的 Excel 表示法。 列字母不區分大小寫,行號從 1 開始,與 Excel 標記儲存格的方式一致。 單元格值讀取文件顯示了其他類型存取器,包括 DateTimeValue,用於格式化為日期的儲存格。

當單元格包含以文本形式存儲的數字時(這是導出電子表格中常見的數據品質問題),StringValue 會按原樣返回文本,而 DecimalValue 會嘗試解析,並在解析失敗時返回 0。 在生產代碼中將意外資料作為類型化值處理之前,請務必先對其進行驗證。

處理日期和布爾單元格

Excel 中的日期儲存格在內部以序號的形式儲存。 IronXL公開 DateTimeValue,以便將它們轉換為.NET DateTime 對象,而無需手動計算。 對於包含 TRUEFALSE 的儲存格,BoolValue 傳回正確的布林值,無需進行字串比較。 這些類型化存取器消除了一類在透過通用文字解析器讀取電子表格時經常出現的資料類型錯誤。

如何遍歷行和單元格?

遍歷資料集需要一個範圍或行集合。 IronXL支援這兩種方法,您可以將它們結合起來以匹配數據的形狀。

using IronXL;

WorkBook workbook = WorkBook.Load("financial_report.xlsx");
WorkSheet sheet = workbook.WorkSheets[0];

// Iterate a cell range -- skips header row
foreach (var cell in sheet["A2:D100"])
{
    Console.WriteLine($"{cell.AddressString}: {cell.Text}");
}

// Row-by-row with column access
for (int rowIndex = 1; rowIndex < sheet.RowCount; rowIndex++)
{
    var row = sheet.Rows[rowIndex];
    var values = new System.Text.StringBuilder();

    foreach (var cell in row)
    {
        if (cell.Value != null)
            values.Append($"{cell.StringValue}\t");
    }

    Console.WriteLine(values.ToString().TrimEnd());
}
using IronXL;

WorkBook workbook = WorkBook.Load("financial_report.xlsx");
WorkSheet sheet = workbook.WorkSheets[0];

// Iterate a cell range -- skips header row
foreach (var cell in sheet["A2:D100"])
{
    Console.WriteLine($"{cell.AddressString}: {cell.Text}");
}

// Row-by-row with column access
for (int rowIndex = 1; rowIndex < sheet.RowCount; rowIndex++)
{
    var row = sheet.Rows[rowIndex];
    var values = new System.Text.StringBuilder();

    foreach (var cell in row)
    {
        if (cell.Value != null)
            values.Append($"{cell.StringValue}\t");
    }

    Console.WriteLine(values.ToString().TrimEnd());
}
$vbLabelText   $csharpLabel

使用IronXL在 C# 中讀取 Excel 檔案的最佳方法:圖 3 - 遍歷行的輸出

範圍字串 "A2:D100" 建立一個扁平單元格集合。 此範圍內的行以從上到下、從左到右的順序處理。 這種模式非常適合匯出到 DataTable 或資料庫。

sheet.RowCount 屬性反映工作表中最後使用的行,因此當資料結束時循環會自動終止。 迭代 Excel 範圍指南涵蓋了其他迭代模式,包括列優先遍歷。

跳過標題行

大多數電子表格都有一個標題行,用於描述列名稱,而不是包含資料。 從第 2 行開始範圍迭代(例如,"A2:D100"),或從 rowIndex = 1 開始索引循環以跳過標題。 如果您使用 ToDataTable(true), IronXL會自動處理標題偵測並對應第一行的列名。

如何處理多種Excel格式?

IronXL會自動根據檔案副檔名和檔案頭偵測檔案格式。 XLSX、XLS 和 CSV 檔案的 API 完全相同,這意味著相同的解析程式碼無需條件邏輯即可應用於所有三種格式。

using IronXL;

// Load different formats with identical API
WorkBook xlsxBook = WorkBook.Load("Modern.xlsx");
WorkBook xlsBook  = WorkBook.Load("Legacy.xls");
WorkBook csvBook  = WorkBook.Load("Export.csv");

// Access worksheets identically across formats
WorkSheet sheet1 = xlsxBook.DefaultWorkSheet;
WorkSheet sheet2 = xlsBook.DefaultWorkSheet;
WorkSheet sheet3 = csvBook.DefaultWorkSheet;

// Cross-format conversion -- save XLSX as CSV, or CSV as XLSX
xlsxBook.SaveAs("converted_output.csv");
csvBook.SaveAs("structured_output.xlsx");

Console.WriteLine($"XLSX rows: {sheet1.RowCount}");
Console.WriteLine($"XLS rows:  {sheet2.RowCount}");
Console.WriteLine($"CSV rows:  {sheet3.RowCount}");
using IronXL;

// Load different formats with identical API
WorkBook xlsxBook = WorkBook.Load("Modern.xlsx");
WorkBook xlsBook  = WorkBook.Load("Legacy.xls");
WorkBook csvBook  = WorkBook.Load("Export.csv");

// Access worksheets identically across formats
WorkSheet sheet1 = xlsxBook.DefaultWorkSheet;
WorkSheet sheet2 = xlsBook.DefaultWorkSheet;
WorkSheet sheet3 = csvBook.DefaultWorkSheet;

// Cross-format conversion -- save XLSX as CSV, or CSV as XLSX
xlsxBook.SaveAs("converted_output.csv");
csvBook.SaveAs("structured_output.xlsx");

Console.WriteLine($"XLSX rows: {sheet1.RowCount}");
Console.WriteLine($"XLS rows:  {sheet2.RowCount}");
Console.WriteLine($"CSV rows:  {sheet3.RowCount}");
$vbLabelText   $csharpLabel

對於 CSV 文件, IronXL遵循 RFC 4180 約定,包括包含逗號的帶引號字段、帶引號的值中的換行符以及轉義的雙引號。 CSV 轉 XLSX 轉換指南涵蓋了非標準 CSV 匯出的分隔符​​號自訂。

當您的應用程式必須從外部系統接收檔案時,最佳實踐是在載入之前檢查檔案副檔名並驗證檔案內容。 如果檔案損壞或格式不受支持, IronXL會拋出描述性異常,您可以捕獲該異常並將其顯示給使用者。

如何在 Excel 資料上執行進階查詢?

除了逐個單元格讀取之外, IronXL還提供了聚合函數和 LINQ 相容性,可以將工作表範圍轉換為可查詢的集合。

using IronXL;
using System.Linq;

WorkBook workbook = WorkBook.Load("Financials.xlsx");
WorkSheet sheet = workbook.DefaultWorkSheet;

// Built-in aggregates -- no manual looping needed
decimal totalSales = sheet["B2:B50"].Sum();
decimal maxRevenue = sheet["C2:C50"].Max(c => c.DecimalValue);
decimal avgMargin  = sheet["D2:D50"].Avg();

// LINQ filtering directly on a range
var highValueRows = sheet["C2:C50"]
    .Where(c => c.DecimalValue > 1000)
    .Select(c => new { c.AddressString, c.DecimalValue });

foreach (var row in highValueRows)
    Console.WriteLine($"高的 value at {row.AddressString}: {row.DecimalValue:C}");

// Write a calculated result back to the sheet
sheet["E2"].Value = totalSales;
workbook.SaveAs("Financials_Updated.xlsx");

Console.WriteLine($"Total: {totalSales:C}, Max: {maxRevenue:C}, Avg: {avgMargin:C}");
using IronXL;
using System.Linq;

WorkBook workbook = WorkBook.Load("Financials.xlsx");
WorkSheet sheet = workbook.DefaultWorkSheet;

// Built-in aggregates -- no manual looping needed
decimal totalSales = sheet["B2:B50"].Sum();
decimal maxRevenue = sheet["C2:C50"].Max(c => c.DecimalValue);
decimal avgMargin  = sheet["D2:D50"].Avg();

// LINQ filtering directly on a range
var highValueRows = sheet["C2:C50"]
    .Where(c => c.DecimalValue > 1000)
    .Select(c => new { c.AddressString, c.DecimalValue });

foreach (var row in highValueRows)
    Console.WriteLine($"高的 value at {row.AddressString}: {row.DecimalValue:C}");

// Write a calculated result back to the sheet
sheet["E2"].Value = totalSales;
workbook.SaveAs("Financials_Updated.xlsx");

Console.WriteLine($"Total: {totalSales:C}, Max: {maxRevenue:C}, Avg: {avgMargin:C}");
$vbLabelText   $csharpLabel

使用IronXL在 C# 中讀取 Excel 檔案的最佳方法:圖 4 - 進階讀取操作控制台輸出

當您需要在將行匯入資料庫之前對其進行篩選,或者驗證列中的所有值是否都滿足閾值時,LINQ 相容性非常有用。 該程式庫在 LINQ 運行之前會評估公式,因此聚合查詢始終對最終計算值進行操作,而不是對公式字串進行操作。

IronXL的 LINQ 教學涵蓋了連接工作表、按列分組以及將結果投影到強類型物件——這些模式可以消除資料管道程式碼中的大量樣板程式碼。

如何將Excel資料匯出到DataTable?

許多.NET應用程式將電子表格資料載入到 ADO.NET DataTable 中,以便進行進一步處理或插入資料庫。 IronXL提供了一種直接轉換方法,無需手動進行列對應。

using IronXL;
using System.Data;

WorkBook workbook = WorkBook.Load("SalesData.xlsx");
WorkSheet sheet = workbook.DefaultWorkSheet;

// Convert worksheet to DataTable -- first row becomes column headers
DataTable dataTable = sheet.ToDataTable(true);

Console.WriteLine($"Columns: {dataTable.Columns.Count}");
Console.WriteLine($"Rows:    {dataTable.Rows.Count}");

// Iterate the DataTable normally
foreach (DataRow row in dataTable.Rows)
{
    Console.WriteLine($"{row["ProductName"]} -- {row["Quantity"]} -- {row["Price"]}");
}
using IronXL;
using System.Data;

WorkBook workbook = WorkBook.Load("SalesData.xlsx");
WorkSheet sheet = workbook.DefaultWorkSheet;

// Convert worksheet to DataTable -- first row becomes column headers
DataTable dataTable = sheet.ToDataTable(true);

Console.WriteLine($"Columns: {dataTable.Columns.Count}");
Console.WriteLine($"Rows:    {dataTable.Rows.Count}");

// Iterate the DataTable normally
foreach (DataRow row in dataTable.Rows)
{
    Console.WriteLine($"{row["ProductName"]} -- {row["Quantity"]} -- {row["Price"]}");
}
$vbLabelText   $csharpLabel

true 傳遞給 ToDataTable 會將工作表的第一行視為列標題。 產生的 DataTable 使用與標題文字相符的字串列名,使後續的 LINQ to DataSet 查詢更易讀。 DataTable 匯出文件涵蓋了空值處理和類型推斷選項。

當下游程式碼已經期望 DataTable 時,這種模式特別有用—例如,當呼叫 SqlBulkCopy 將行插入 SQL Server 時。 您可以載入 XLSX 文件,將其轉換為 DataTable,然後進行批次插入,而無需編寫任何列映射樣板程式碼。

IronXL核心讀取 API 參考
手術 API 返回
載入文件 `WorkBook.Load(path)` `WorkBook`
依索引取得工作表 `workbook.WorkSheets[0]` `WorkSheet`
按名稱取得工作表 `workbook.GetWorkSheet("name")` `WorkSheet`
讀取字串單元格 `sheet["A1"].StringValue` `string`
讀取十進位單元格 `sheet["B1"].DecimalValue` `decimal`
迭代範圍 `foreach cell in sheet["A2:D100"]` `IEnumerable`
對一定範圍求和 `sheet["B2:B50"].Sum()` `decimal`
匯出到資料表 `sheet.ToDataTable(true)` `DataTable`

有關完整的 API 列表,請參閱IronXL API 參考。 此參考文件涵蓋了每個屬性和方法,包括參數描述和傳回類型詳情。

下一步計劃是什麼?

只要有了合適的函式庫,用 C# 讀取 Excel 檔案就非常簡單。 IronXL消除了對 Office 的依賴,簡化了 API 接口,並使用相同的程式碼路徑處理 XLSX、XLS 和 CSV 格式。 這裡涵蓋的模式——載入工作簿、讀取鍵入的儲存格值、迭代範圍、運行聚合以及導出到 DataTable——涵蓋了大多數現實世界的電子表格讀取需求。

為了繼續沿用這些模式:

對於正在評估IronXL與其他庫的團隊來說, IronXL與 EPPlus 的比較以及IronXL與 NPOI 的比較涵蓋了效能基準和 API 差異。 兩個比較都包含了每個庫中等效操作的程式碼範例。

如果您遇到來自舊系統的不尋常的電子表格結構,微軟自己的Excel 文件格式規範是一個有用的參考。 ECMA-376 標準定義了 XLSX 檔案所遵循的 OOXML 格式。

在購買正式版許可證之前,您可以先申請IronXL免費試用許可證,在您自己的專案中測試完整的 API。

常見問題解答

在 C# 中讀取 Excel 檔案的最佳方式是什麼?

在 C# 中讀取 Excel 檔案的最佳方式,是使用專用的、獨立於 Office 之外的程式庫,例如 IronXL。它能處理 XLSX、XLS 和 CSV 格式,無需 Microsoft Excel 或 COM 互通,因此適用於伺服器及容器環境。

使用 IronXL 是否需要安裝 Microsoft Office?

不。IronXL 是一個獨立的 .NET 程式庫,以 NuGet 套件形式發行。它不需要電腦上安裝 Microsoft Office、Excel 或任何 COM 元件。

IronXL 支援哪些 Excel 檔案格式?

IronXL 可讀取及寫入 XLSX、XLS 和 CSV 檔案。系統會根據檔案副檔名和內容標頭自動偵測檔案格式。

如何在 .NET 專案中安裝 IronXL?

請在終端機中執行 'dotnet add package IronXl.Excel',或在 Visual Studio 套件管理員控制台中執行 'Install-Package IronXl.Excel'。

IronXL 能否將 Excel 資料匯出至 DataTable?

是的。WorkSheet.ToDataTable(true) 方法可將任何工作表轉換為 ADO.NET DataTable,當傳入 true 時,第一行將用作欄位標題。

IronXL 是否支援對 Excel 資料執行 LINQ 查詢?

是的。IronXL 的儲存格範圍實作了 IEnumerable 介面,因此您可以直接在工作表範圍上使用 Where、Select、Sum、Max 和 Avg 等 LINQ 方法。

IronXL 如何處理 Excel 公式?

當您讀取儲存格值時,IronXL 會自動評估公式。在公式儲存格中讀取 sheet["B10"].DecimalValue 會返回計算結果,而非公式字串。

IronXL 支援哪些 .NET 版本?

IronXL 支援 .NET 10、.NET 8、.NET 6、.NET Framework 4.6.2 以及 .NET Standard 2.0。

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