跳過到頁腳內容
使用 IRONXL

如何使用 IronXL 在 C# 中讀取 Excel 檔案

在 C# 應用程式中讀取 Excel 檔案是業務軟體、資料處理管道和報表系統的常見需求。 使用 Microsoft Office Interop 的傳統方法需要在每台伺服器或工作站上安裝 Excel,這會造成脆弱的依賴關係,使部署和授權變得複雜。 IronXL完全消除了這種依賴性——您的應用程式無需在環境中任何地方安裝 Office 即可讀取 XLSX、XLS、CSV 和其他電子表格格式。

本教學將引導您完成所需的每項技術:安裝庫、載入工作簿、提取鍵入的儲存格值、遍歷行和列、運行聚合計算以及建立完整的員工資料讀取器。 所有範例均使用 C#,頂級語句面向.NET 10。


如何安裝IronXL進行 Excel 處理?

在 Visual Studio 中開啟NuGet套件管理器控制台,並執行以下命令將IronXL新增至您的專案。 或者,如果您喜歡在終端機中操作,請使用第二行所示的.NET CLI 命令:

Install-Package IronXl.Excel
dotnet add package IronXl.Excel
Install-Package IronXl.Excel
dotnet add package IronXl.Excel
SHELL

該軟體包只需幾秒鐘即可安裝,並為您的專案添加託管程序集引用。 無需進行 COM 註冊,無需進行 Office 主互通組件管理,也無需管理特定版本的 Excel 相依性。

安裝完成後,在每個處理電子表格資料的檔案頂部新增 using 指令:

using IronXL;
using IronXL;
$vbLabelText   $csharpLabel

單一命名空間可讓您存取 WorkSheet、儲存格區域、類型化值屬性、聚合函數以及IronXL 的所有其他類型。 IronXL .Excel 的NuGet Gallery 頁面列出了所有可用的版本及其完整的依賴關係樹。


IronXL支援哪些 Excel 檔案格式?

了解應用程式必須處理的格式,既能影響您發出的 API 調用,也能影響您的專案採用的儲存決策。

XLSX (自 Excel 2007 起成為預設格式)是 XML 檔案的 ZIP 壓縮包。 它支援超過一百萬行資料、豐富的格式設定、透視表和命名範圍。 大多數現代資料管道都會產生 XLSX 輸出,因此這是您最常遇到的格式。

XLS是 Excel 2003 及更早版本所使用的傳統二進位格式。 有些企業系統仍然會匯出 XLS 格式,因此在與舊基礎設施整合時,對這種格式的可靠支援至關重要。 IronXL無需任何特殊配置即可讀取 XLS 檔案。

XLSM為 XLSX 新增了巨集支援功能。 即使IronXL不執行嵌入的 VBA 程式碼,它也會從 XLSM 檔案中讀取電子表格數據,這是伺服器端資料提取的正確行為。

CSV 和 TSV是純文字表格格式,廣泛用於系統間的資料交換。 WorkBook.LoadCSV 處理逗號分隔的文件, IronXL返回相同的 WorkBook 對象,您的程式碼已經知道如何存取該對象,從而保持您的資料讀取邏輯與來源格式無關。

IronXL會在您呼叫 WorkBook.Load 時自動從檔案副檔名偵測檔案格式。 大多數情況下,您無需明確指定格式,這簡化了必須處理來自多個來源的輸入的程式碼。

IronXL支援的 Excel 檔案格式
格式 擴大 載入方法 筆記
開啟 XML 工作簿 .xlsx WorkBook.Load 預設現代格式
傳統二進位文件 .xls WorkBook.Load Excel 2003 及更早版本
啟用巨集 .xlsm WorkBook.Load 資料已讀取;宏未執行
逗號分隔 .csv WorkBook.LoadCSV 最佳化的 CSV 解析器
製表符分隔 .tsv WorkBook.Load 製表符分隔符號變體

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

WorkBook.Load 方法是所有基於檔案的操作的入口點。 傳入檔案路徑, IronXL將返回一個完整的工作簿對象,您可以立即對其進行查詢:

using IronXL;

// Load the workbook; format is detected automatically
WorkBook workbook = WorkBook.Load("Employees.xlsx");

// Access the first worksheet
WorkSheet sheet = workbook.DefaultWorkSheet;

// Read a single cell by A1 address
string companyName = sheet["A1"].StringValue;
Console.WriteLine($"Company: {companyName}");

// Access sheets by name or by zero-based index
WorkSheet byName  = workbook.GetWorkSheet("Sales");
WorkSheet byIndex = workbook.WorkSheets[1];

// Load a password-protected file
WorkBook secured = WorkBook.Load("Confidential.xlsx", "p@ssw0rd");
using IronXL;

// Load the workbook; format is detected automatically
WorkBook workbook = WorkBook.Load("Employees.xlsx");

// Access the first worksheet
WorkSheet sheet = workbook.DefaultWorkSheet;

// Read a single cell by A1 address
string companyName = sheet["A1"].StringValue;
Console.WriteLine($"Company: {companyName}");

// Access sheets by name or by zero-based index
WorkSheet byName  = workbook.GetWorkSheet("Sales");
WorkSheet byIndex = workbook.WorkSheets[1];

// Load a password-protected file
WorkBook secured = WorkBook.Load("Confidential.xlsx", "p@ssw0rd");
$vbLabelText   $csharpLabel

DefaultWorkSheet 屬性傳回第一張工作表,涵蓋了大多數單頁檔案。 當您的檔案包含多個工作表時,GetWorkSheet 按名稱檢索,而 WorkSheets[n] 按從零開始的索引檢索。 WorkBook API 參考文件記錄了工作簿物件的每個重載和屬性。

使用IronXL讀取 Excel 檔案:無需 Microsoft Office 的逐步指南:圖 1 -安裝

輸入

使用IronXL讀取 Excel 檔案: .NET的逐步指南(無需 Microsoft Office):圖 2 - Excel 輸入範例

輸出

使用IronXL讀取 Excel 檔案:無需 Microsoft Office 的逐步指南:圖 3 -控制台輸出


如何從Excel中讀取已輸入的儲存格值?

IronXL中的每個儲存格都公開了類型化屬性,這些屬性會傳回您需要的確切資料類型的值——無需手動解析或轉換。 類型化屬性會自動處理來自底層儲存格表示的強制轉換:

using IronXL;

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

// Extract typed values from row 2
int      employeeId = sheet["A2"].IntValue;
string   name       = sheet["B2"].StringValue;
string   department = sheet["C2"].StringValue;
decimal  salary     = sheet["D2"].DecimalValue;
DateTime hireDate   = sheet["E2"].DateTimeValue;

Console.WriteLine($"ID:         {employeeId}");
Console.WriteLine($"Name:       {name}");
Console.WriteLine($"Department: {department}");
Console.WriteLine($"Salary:     {salary:C}");
Console.WriteLine($"Hired:      {hireDate:d}");

// Use the Text property for the formatted display value
string formattedSalary = sheet["D2"].Text;   // "$75,000.00"
string formattedDate   = sheet["E2"].Text;   // "28/02/2026"

// Guard against empty cells before reading
if (!sheet["B3"].IsEmpty)
{
    string value = sheet["B3"].StringValue;
}
using IronXL;

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

// Extract typed values from row 2
int      employeeId = sheet["A2"].IntValue;
string   name       = sheet["B2"].StringValue;
string   department = sheet["C2"].StringValue;
decimal  salary     = sheet["D2"].DecimalValue;
DateTime hireDate   = sheet["E2"].DateTimeValue;

Console.WriteLine($"ID:         {employeeId}");
Console.WriteLine($"Name:       {name}");
Console.WriteLine($"Department: {department}");
Console.WriteLine($"Salary:     {salary:C}");
Console.WriteLine($"Hired:      {hireDate:d}");

// Use the Text property for the formatted display value
string formattedSalary = sheet["D2"].Text;   // "$75,000.00"
string formattedDate   = sheet["E2"].Text;   // "28/02/2026"

// Guard against empty cells before reading
if (!sheet["B3"].IsEmpty)
{
    string value = sheet["B3"].StringValue;
}
$vbLabelText   $csharpLabel

Text 屬性傳回 Excel 中格式化的顯示值-當您需要格式化的數字字串而不是原始數值時非常有用。 對於包含Excel 公式的儲存格, IronXL會計算表達式並透過相同的類型屬性傳回計算結果。 附加價值屬性 -- BoolValue, DoubleValue, FloatValue -- 出現在儲存格值參考中。


如何遍歷 Excel 中的行和列?

處理資料集中的每一筆記錄都需要遍歷行和列。 IronXL 的範圍語法直接對應於 Excel 的 A1 表示法,因此對於任何編寫過電子表格公式的人來說,選擇單元格區域的操作都很熟悉:

using IronXL;

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

// Iterate a single column range
Console.WriteLine("Employee List:");
foreach (var cell in sheet["B2:B100"])
{
    if (!string.IsNullOrEmpty(cell.Text))
        Console.WriteLine($"  - {cell.Text}");
}

// Iterate all rows and all columns using the Rows property
foreach (var row in sheet.Rows)
{
    foreach (var cell in row)
        Console.Write(cell.Text.PadRight(15));
    Console.WriteLine();
}
using IronXL;

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

// Iterate a single column range
Console.WriteLine("Employee List:");
foreach (var cell in sheet["B2:B100"])
{
    if (!string.IsNullOrEmpty(cell.Text))
        Console.WriteLine($"  - {cell.Text}");
}

// Iterate all rows and all columns using the Rows property
foreach (var row in sheet.Rows)
{
    foreach (var cell in row)
        Console.Write(cell.Text.PadRight(15));
    Console.WriteLine();
}
$vbLabelText   $csharpLabel

範圍 sheet["B2:B100"] 傳回單元格物件的可枚舉集合。 檢查 string.IsNullOrEmpty 會優雅地跳過空白行。 Rows 屬性(在工作表資料範圍指南中有詳細說明)一次遍歷工作表一行,並顯示每一行的儲存格,而無需事先知道列數。

輸出

使用IronXL讀取 Excel 檔案:無需 Microsoft Office 的逐步指南:圖 4 - Excel 行輸出


如何在Excel資料上運行聚合計算?

IronXL包含內建的聚合函數,可直接在儲存格區域上計算結果-無需手動累積循環:

using IronXL;

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

// Built-in aggregate methods work on any named range
decimal total   = sheet["D2:D200"].Sum();
decimal highest = sheet["D2:D200"].Max();
decimal lowest  = sheet["D2:D200"].Min();
decimal average = sheet["D2:D200"].Avg();

Console.WriteLine($"Total Payroll:  {total:C}");
Console.WriteLine($"Highest Salary: {highest:C}");
Console.WriteLine($"Lowest Salary:  {lowest:C}");
Console.WriteLine($"Average Salary: {average:C}");

// Combine with LINQ for filtered aggregation
decimal itTotal = sheet["D2:D200"]
    .Where(c => sheet[$"C{c.RowIndex}"].StringValue == "IT")
    .Sum(c => c.DecimalValue);
Console.WriteLine($"IT Department Total: {itTotal:C}");
using IronXL;

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

// Built-in aggregate methods work on any named range
decimal total   = sheet["D2:D200"].Sum();
decimal highest = sheet["D2:D200"].Max();
decimal lowest  = sheet["D2:D200"].Min();
decimal average = sheet["D2:D200"].Avg();

Console.WriteLine($"Total Payroll:  {total:C}");
Console.WriteLine($"Highest Salary: {highest:C}");
Console.WriteLine($"Lowest Salary:  {lowest:C}");
Console.WriteLine($"Average Salary: {average:C}");

// Combine with LINQ for filtered aggregation
decimal itTotal = sheet["D2:D200"]
    .Where(c => sheet[$"C{c.RowIndex}"].StringValue == "IT")
    .Sum(c => c.DecimalValue);
Console.WriteLine($"IT Department Total: {itTotal:C}");
$vbLabelText   $csharpLabel

MaxAvg 會自動跳過空白儲存格,並在背景處理數值轉換。 將 LINQ 查詢連結到該範圍,即可獲得篩選後的聚合結果——部門小計、日期範圍總和以及條件計數——所有這些都無需離開IronXL API。


如何建立一個完整的員工資料讀取器?

以下範例將目前為止介紹的所有內容整合到一個可用於生產的控制台應用程式中,該應用程式會載入員工電子表格、格式化每筆記錄、累加薪資總額、處理回寫並優雅地擷取錯誤:

using IronXL;

try
{
    WorkBook workbook = WorkBook.Load("Employees.xlsx");
    WorkSheet sheet   = workbook.DefaultWorkSheet;

    Console.WriteLine("=== Employee Data Report ===\n");

    int     rowNumber     = 2;
    decimal totalSalary   = 0m;
    int     employeeCount = 0;

    while (!string.IsNullOrEmpty(sheet[$"A{rowNumber}"].StringValue))
    {
        int      id         = sheet[$"A{rowNumber}"].IntValue;
        string   name       = sheet[$"B{rowNumber}"].StringValue;
        string   department = sheet[$"C{rowNumber}"].StringValue;
        decimal  salary     = sheet[$"D{rowNumber}"].DecimalValue;

        Console.WriteLine($"{id,4}  {name,-20}  {department,-15}  {salary,10:C}");

        totalSalary   += salary;
        employeeCount += 1;
        rowNumber     += 1;
    }

    Console.WriteLine($"\nTotal Employees: {employeeCount}");
    Console.WriteLine($"Total Payroll:   {totalSalary:C}");

    // Write a new record back to the sheet and save
    sheet["A10"].Value = 1010;
    sheet["B10"].Value = "Jane Doe";
    sheet["C10"].Value = "Finance";
    sheet["D10"].Value = 75000;
    workbook.SaveAs("Employees-Updated.xlsx");
}
catch (Exception ex)
{
    Console.WriteLine($"Error reading Excel file: {ex.Message}");
}
using IronXL;

try
{
    WorkBook workbook = WorkBook.Load("Employees.xlsx");
    WorkSheet sheet   = workbook.DefaultWorkSheet;

    Console.WriteLine("=== Employee Data Report ===\n");

    int     rowNumber     = 2;
    decimal totalSalary   = 0m;
    int     employeeCount = 0;

    while (!string.IsNullOrEmpty(sheet[$"A{rowNumber}"].StringValue))
    {
        int      id         = sheet[$"A{rowNumber}"].IntValue;
        string   name       = sheet[$"B{rowNumber}"].StringValue;
        string   department = sheet[$"C{rowNumber}"].StringValue;
        decimal  salary     = sheet[$"D{rowNumber}"].DecimalValue;

        Console.WriteLine($"{id,4}  {name,-20}  {department,-15}  {salary,10:C}");

        totalSalary   += salary;
        employeeCount += 1;
        rowNumber     += 1;
    }

    Console.WriteLine($"\nTotal Employees: {employeeCount}");
    Console.WriteLine($"Total Payroll:   {totalSalary:C}");

    // Write a new record back to the sheet and save
    sheet["A10"].Value = 1010;
    sheet["B10"].Value = "Jane Doe";
    sheet["C10"].Value = "Finance";
    sheet["D10"].Value = 75000;
    workbook.SaveAs("Employees-Updated.xlsx");
}
catch (Exception ex)
{
    Console.WriteLine($"Error reading Excel file: {ex.Message}");
}
$vbLabelText   $csharpLabel

當 A 列為空時,循環終止,這使得讀取器能夠適應任何長度的電子表格,而無需硬編碼行數。 寫回值遵循與讀取相同的儲存格位址語法,並且 SaveAs 將變更持久化到新檔案中,因此原始檔案保持不變。 try/catch 程式碼區塊處理遺失的檔案、鎖定的工作簿和損壞的資料—所有這些情況都會在生產環境中發生,因為輸入檔案來自外部來源。

輸出

使用IronXL讀取 Excel 檔案:無需 Microsoft Office 的逐步指南:圖 5 -員工資料輸出

建立電子表格的操作指南將 XLSX 轉換為 CSV 的指南展示如何在端到端工作流程中結合讀取和寫入操作。 單元格樣式指南涵蓋了格式化輸出時的字體大小、顏色和邊框。

使用IronXL讀取 Excel 檔案: .NET的逐步指南(無需 Microsoft Office):圖 6 - Windows 表單輸出


您如何應對高階閱讀場景?

在實際專案中,會出現一些不太常見但很重要的情況。 命名範圍、工作表發現和 CSV 載入均有專門的 API 支援。

命名範圍可讓您透過邏輯標籤而不是儲存格位址來引用資料。 如果工作簿作者定義了一個名為 SalaryTable 的命名範圍,則可以透過 GetRangeByName 直接存取它:

var range = workbook.GetRangeByName("SalaryTable");
decimal total = range.Sum();
Console.WriteLine($"Named range total: {total:C}");
var range = workbook.GetRangeByName("SalaryTable");
decimal total = range.Sum();
Console.WriteLine($"Named range total: {total:C}");
$vbLabelText   $csharpLabel

工作表發現功能會列出工作簿中的每個工作表,這在處理包含數量不固定的工作表的文件時非常有用:

foreach (WorkSheet ws in workbook.WorkSheets)
    Console.WriteLine($"Sheet: {ws.Name}, Rows: {ws.RowCount}");
foreach (WorkSheet ws in workbook.WorkSheets)
    Console.WriteLine($"Sheet: {ws.Name}, Rows: {ws.RowCount}");
$vbLabelText   $csharpLabel

CSV 載入使用專門針對純文字檔案最佳化的方法,返回 WorkSheet,您可以使用相同的範圍 API 進行導覽:

WorkBook csv    = WorkBook.LoadCSV("data.csv");
WorkSheet first = csv.DefaultWorkSheet;
Console.WriteLine(first["A1"].StringValue);
WorkBook csv    = WorkBook.LoadCSV("data.csv");
WorkSheet first = csv.DefaultWorkSheet;
Console.WriteLine(first["A1"].StringValue);
$vbLabelText   $csharpLabel

這些模式涵蓋了資料遷移項目、ETL 管道和自動化報告系統中出現的高階讀取場景。 有關完整的 API 接口,請參閱IronXL物件參考

其他權威參考資料:

IronXL文件主頁 如何編輯Excel公式 -如何使用數學函數 如何選擇範圍 ECMA-376 Open XML 規格-定義 XLSX 格式的權威標準


下一步計劃是什麼?

IronXL將依賴性很強的 Interop 挑戰中的 Excel 檔案讀取操作簡化為幾行簡單的 C# 程式碼。 載入工作簿、提取鍵入的值、逐行迭代、運行聚合計算以及處理邊界情況,所有這些都遵循相同的一致 API 模式——無需在部署環境中安裝 Microsoft Office。

從教學過渡到生產環境:

1.開始免費試用,解鎖IronXL 的全部功能,並在購買許可證之前使用您自己的 Excel 檔案進行驗證。

  1. 瀏覽IronXL 的完整文檔,以取得有關編寫、格式化、樣式設定和轉換電子表格的指南。
  2. 瀏覽物件參考和完整 API ,發現庫中可用的每個類別、方法和屬性。
  3. 當您的工作流程需要產生輸出檔案以及讀取輸入檔案時,請查看建立電子表格的操作指南
  4. 查看IronXL部落格文章索引,以了解更多涵蓋實際情境(例如報告產生、資料驗證和多重工作表合併)的教學課程。

常見問題解答

IronXL 是什麼?

IronXL 是一個 .NET 函式庫,可讓開發人員閱讀、編輯和建立各種格式的 Excel 檔案,例如 XLSX 和 XLS,而無需安裝 Microsoft Office。

如何使用IronXL在C#中讀取Excel文件?

調用WorkBook.Load並使用文件路徑來打開活頁簿,然後使用A1標記法和類型化屬性如StringValue、IntValue和DecimalValue來訪問單元格。

為何選擇 IronXL 而非 Microsoft Office Interop 來閱讀 Excel 檔案?

IronXL不需要安裝Microsoft Office,消除了COM依賴,簡化了伺服器端部署。

IronXL可以讀取哪些Excel文件格式?

IronXL可以讀取XLSX、XLS、XLSM、CSV和TSV格式。格式檢測是根據文件擴展名自動執行的。

IronXL 能有效處理大型 Excel 文件嗎?

是的,IronXL經過性能優化,可以處理大型Excel文件,非常適合數據密集型應用程序。

IronXL可以與.NET 10一起使用嗎?

是的,IronXL支援現代的.NET版本,包括.NET 10,以及.NET Framework專案。

如何使用IronXL執行聚合計算?

在任何單元格範圍上使用內建的方法Sum、Min、Max和Avg。這些方法會自動跳過空單元格。

IronXL可以讀取受密碼保護的Excel文件嗎?

是的,將密碼作為第二個參數傳遞給WorkBook.Load:WorkBook.Load("file.xlsx", "password")。

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