跳過到頁腳內容
使用 IRONXL

如何在C#中打開Excel檔案而不需要Microsoft Office。

IronXL 讓您在未安裝Microsoft Office的情況下,以C#開啟並讀取Excel檔案 — 只需安裝NuGet套件,使用WorkBook.Load("file.xlsx")載入工作簿,即可通過型別化值和自動格式檢測存取任何工作表、儲存格或範圍。

如果您曾經嘗試在未安裝Microsoft Office的情況下以程式方式開啟Excel檔案,您便會知道傳統Interop方法會有多麻煩。 Interop依賴於安裝Excel本身,需要複雜的COM參考,且常常導致版本衝突 — 尤其是在Office無法使用的伺服器或雲端環境中。

IronXL 是一個現代.NET 程式庫,可直接讀取XLSX、XLS、CSV和TSV檔案,無需依賴Office。 您可以寫下乾淨、可靠的C#程式碼,在Windows、Linux或雲端上處理Excel檔案,並跳過COM自動化的所有摩擦。 本指南涵蓋從安裝到生產準備模式的所有內容,以開啟和讀取Excel工作簿。

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

開始僅需幾秒鐘。 開啟您的專案並使用以下其中一個套件管理器:

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

或者,打開Visual Studio,右鍵點擊您的專案,選擇"管理NuGet套件",搜尋"IronXL",然後點擊安裝。 安裝指南涵蓋所有支援的環境,包括Docker和Azure。

Visual Studio NuGetPackage Manager 顯示IronXl.Excel套件,版本2025.9.1可供安裝

一旦安裝後,在檔案的頂部添加命名空間:

using IronXL;
using IronXL;
$vbLabelText   $csharpLabel

僅此一行即可。 沒有複雜的COM參考,沒有Office依賴,沒有版本特定的組件。 如需免費評估金鑰,請訪問IronXL 試用授權頁面

為什麼IronXL比傳統Interop更簡單?

傳統Excel Interop需要每台運行您程式碼的機器上安裝Microsoft Office。 這對於伺服器部署、AWS Lambda函數和容器化應用程式來說是不切實際的。 IronXL內部處理所有Excel檔案解析,提供一個無需任何外部依賴的乾淨API。

使用Interop時,您還需要仔細管理COM物件的生命週期以防止記憶體洩漏 — 每個Worksheet 物件都必須顯式釋放,否則Excel程序會在背景中累積。 IronXL使用標準的.NET垃圾回收,因此您永遠不需要考慮COM清理。

該程式庫支援.NET Framework 4.6.2及更高版本,還支援.NET 5、6、7、8和10。它可以在Windows、macOS和Linux上運行且不需修改。 如果您針對跨平台情況,僅此一項就使IronXL比僅支持Windows的Office Interop更合適。

如何驗證安裝是否成功?

安裝後,通過載入任何Excel檔案並列印一個儲存格值來創建一個簡單測試。 如果專案無錯誤地構建並且輸出匹配預期數據,則設置已完成。 IronXL 文檔包含一個快速啟動部分,詳細介紹此驗證步驟。

設置期間常見錯誤是忘記在生產環境中載入工作簿之前應用授權金鑰。 在試用模式下,程式庫會在任何生成的檔案上添加小水印。 在應用啟動時設置IronXl.License.LicenseKey,以便所有操作從一開始就在正確的授權之下運行。

如何開啟Excel工作簿並讀取儲存格值?

核心API是簡單的。 載入工作簿,選擇工作表,並通過地址或迭代訪問儲存格。

using IronXL;

// Load any Excel file -- XLSX, XLS, CSV, or TSV
WorkBook workbook = WorkBook.Load("example.xlsx");

// Access the second worksheet (zero-indexed)
WorkSheet worksheet = workbook.WorkSheets[1];

// Read a specific cell value
decimal revenue = worksheet["E2"].DecimalValue;
Console.WriteLine($"Order Total: {revenue}");

// Iterate over a range of cells
foreach (var cell in worksheet["C2:C6"])
{
    Console.WriteLine($"Product: {cell.Text}");
}
using IronXL;

// Load any Excel file -- XLSX, XLS, CSV, or TSV
WorkBook workbook = WorkBook.Load("example.xlsx");

// Access the second worksheet (zero-indexed)
WorkSheet worksheet = workbook.WorkSheets[1];

// Read a specific cell value
decimal revenue = worksheet["E2"].DecimalValue;
Console.WriteLine($"Order Total: {revenue}");

// Iterate over a range of cells
foreach (var cell in worksheet["C2:C6"])
{
    Console.WriteLine($"Product: {cell.Text}");
}
$vbLabelText   $csharpLabel

WorkBook.Load()自動檢測檔案格式 — 無需指定該檔案是XLS還是XLSX。 使用workbook.GetWorkSheet("Sheet1")通過索引或名稱訪問工作表。 每個儲存格都公開了類型屬性,如Text

欲了解打開文件的更多選項,請參閱打開工作簿指南

左邊顯示訂單數據的Excel表格和右邊顯示提取數據的Visual Studio調試控制台

如何按名稱訪問工作表?

使用工作表名稱比數字索引更易於維護,尤其是在工作簿由其他人編輯時。 以下示例展示了如何按名稱查找工作表並迭代所有工作表:

using IronXL;

WorkBook workbook = WorkBook.Load("inventory.xlsx");

// Access worksheet by exact name
WorkSheet salesSheet = workbook.GetWorkSheet("Sales Data");
Console.WriteLine($"Sales sheet rows: {salesSheet.RowCount}");

// Iterate all worksheets in the workbook
foreach (WorkSheet sheet in workbook.WorkSheets)
{
    if (sheet.Name.Contains("Inventory"))
    {
        Console.WriteLine($"Found inventory sheet: {sheet.Name}");
    }
}
using IronXL;

WorkBook workbook = WorkBook.Load("inventory.xlsx");

// Access worksheet by exact name
WorkSheet salesSheet = workbook.GetWorkSheet("Sales Data");
Console.WriteLine($"Sales sheet rows: {salesSheet.RowCount}");

// Iterate all worksheets in the workbook
foreach (WorkSheet sheet in workbook.WorkSheets)
{
    if (sheet.Name.Contains("Inventory"))
    {
        Console.WriteLine($"Found inventory sheet: {sheet.Name}");
    }
}
$vbLabelText   $csharpLabel

讀取Excel文件指南解釋了其他工作表訪問模式,包括處理具有動態生成工作表名稱的工作簿。

如何從Excel儲存格讀取不同的數據類型?

IronXL為每個常見Excel數據類型提供類型化存取器。 您可以讀取字符串、整數、小數、日期、布林值和公式結果,無需手動解析。

using IronXL;

WorkBook wb = WorkBook.Load(@"C:\Data\Inventory.xlsx");
WorkSheet ws = wb.GetWorkSheet("Products");

// Read different data types directly
string productName = ws["A2"].StringValue;
int quantity       = ws["B2"].IntValue;
decimal price      = ws["C2"].DecimalValue;
DateTime updated   = ws["D2"].DateTimeValue;

// Use aggregate functions on ranges for performance
decimal totalStock = ws["B2:B100"].Sum();
decimal maxPrice   = ws["C2:C100"].Max();

Console.WriteLine($"Product: {productName}, Qty: {quantity}, Price: {price:C}");
Console.WriteLine($"Total stock units: {totalStock}, Highest price: {maxPrice:C}");
using IronXL;

WorkBook wb = WorkBook.Load(@"C:\Data\Inventory.xlsx");
WorkSheet ws = wb.GetWorkSheet("Products");

// Read different data types directly
string productName = ws["A2"].StringValue;
int quantity       = ws["B2"].IntValue;
decimal price      = ws["C2"].DecimalValue;
DateTime updated   = ws["D2"].DateTimeValue;

// Use aggregate functions on ranges for performance
decimal totalStock = ws["B2:B100"].Sum();
decimal maxPrice   = ws["C2:C100"].Max();

Console.WriteLine($"Product: {productName}, Qty: {quantity}, Price: {price:C}");
Console.WriteLine($"Total stock units: {totalStock}, Highest price: {maxPrice:C}");
$vbLabelText   $csharpLabel

下表總結了可用的類型化存取器:

IronXL根據數據類型存取儲存格值
存取器 返回類型 備註
`StringValue` string 即使是數字儲存格也會始終返回一個字符串
`IntValue` int 截斷小數值
`DecimalValue` decimal 最適合財務數據
`DoubleValue` double 用於科學或浮點數值
`DateTimeValue` DateTime 自動解析Excel序列日期號碼
`BoolValue` bool 讀取TRUE/FALSE儲存格
`Formula` string 返回公式文本,例如`=SUM(A2:D2)`

有關讀取和寫入儲存格數據的詳細信息,請參閱儲存格格式指南導入數據指南

Excel表格顯示產品庫存數據,包含產品、數量、價格和上次更新的列,以及使用C#程式讀取的Visual Studio調試控制台

如何安全地處理空或Null儲存格?

在現實世界中的Excel文件中,空儲存格很常見。 在讀取類型化存取器之前使用Value是否為null:

using IronXL;

WorkBook workbook = WorkBook.Load("data.xlsx");
WorkSheet ws = workbook.DefaultWorkSheet;

// Check if a cell is empty before reading
if (!ws["A1"].IsEmpty)
{
    Console.WriteLine(ws["A1"].StringValue);
}

// Provide a fallback value using a null-coalescing pattern
string cellText = ws["A1"].StringValue ?? "Default Value";

// Iterate a range and skip empty cells
foreach (var cell in ws["A1:A20"])
{
    if (!cell.IsEmpty)
    {
        Console.WriteLine(cell.Text);
    }
}
using IronXL;

WorkBook workbook = WorkBook.Load("data.xlsx");
WorkSheet ws = workbook.DefaultWorkSheet;

// Check if a cell is empty before reading
if (!ws["A1"].IsEmpty)
{
    Console.WriteLine(ws["A1"].StringValue);
}

// Provide a fallback value using a null-coalescing pattern
string cellText = ws["A1"].StringValue ?? "Default Value";

// Iterate a range and skip empty cells
foreach (var cell in ws["A1:A20"])
{
    if (!cell.IsEmpty)
    {
        Console.WriteLine(cell.Text);
    }
}
$vbLabelText   $csharpLabel

讀取Excel文件文檔涵蓋了處理稀疏數據的附加模式,包括如何檢測工作表中最後使用的行和列。

處理空儲存格時另一個需要考慮的是真正的空白儲存格和持有空字符串的儲存格之間的區別。 ""的儲存格都返回空字符串。 如果您的數據中有格式為文本且顯示為空的儲存格,請同時檢查string.IsNullOrWhiteSpace(cell.StringValue)以獲得最準確的結果。

如何構建生產就緒的Excel讀取器?

現實世界的Excel讀取器需要文件驗證、錯誤處理、多工作表支援和可選的輸出生成。 以下示例演示了這些模式在單個類中的應用:

using IronXL;
using System.IO;

// Validate and load the file
static List<string> CheckLowStock(string filePath)
{
    var lowStockItems = new List<string>();

    if (!File.Exists(filePath))
    {
        Console.WriteLine($"File not found: {filePath}");
        return lowStockItems;
    }

    string ext = Path.GetExtension(filePath).ToLower();
    if (ext is not (".xlsx" or ".xls" or ".csv"))
    {
        Console.WriteLine($"Unsupported file type: {ext}");
        return lowStockItems;
    }

    try
    {
        WorkBook workbook = WorkBook.Load(filePath);

        foreach (WorkSheet sheet in workbook.WorkSheets)
        {
            Console.WriteLine($"Checking sheet: {sheet.Name}");

            for (int row = 2; row <= sheet.RowCount; row++)
            {
                string itemName  = sheet[$"A{row}"].StringValue;
                int stockLevel   = sheet[$"B{row}"].IntValue;

                if (stockLevel < 10 && !string.IsNullOrEmpty(itemName))
                {
                    lowStockItems.Add($"{itemName} -- {stockLevel} units ({sheet.Name})");
                }
            }
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine($"Error reading Excel file: {ex.Message}");
    }

    return lowStockItems;
}

// Export results to a new workbook
static void ExportReport(List<string> items, string outputPath)
{
    WorkBook report     = WorkBook.Create();
    WorkSheet sheet     = report.CreateWorkSheet("Low Stock Report");

    sheet["A1"].Value   = "Item Description";
    sheet["B1"].Value   = "Source Sheet";

    sheet["A1:B1"].Style.Font.Bold        = true;
    sheet["A1:B1"].Style.BackgroundColor  = "#4472C4";
    sheet["A1:B1"].Style.Font.Color       = "#FFFFFF";

    int rowIndex = 2;
    foreach (string item in items)
    {
        sheet[$"A{rowIndex}"].Value = item;
        rowIndex++;
    }

    report.SaveAs(outputPath);
    Console.WriteLine($"Report saved to: {outputPath}");
}

// Run
var lowStockItems = CheckLowStock("inventory.xlsx");
ExportReport(lowStockItems, "low-stock-report.xlsx");
using IronXL;
using System.IO;

// Validate and load the file
static List<string> CheckLowStock(string filePath)
{
    var lowStockItems = new List<string>();

    if (!File.Exists(filePath))
    {
        Console.WriteLine($"File not found: {filePath}");
        return lowStockItems;
    }

    string ext = Path.GetExtension(filePath).ToLower();
    if (ext is not (".xlsx" or ".xls" or ".csv"))
    {
        Console.WriteLine($"Unsupported file type: {ext}");
        return lowStockItems;
    }

    try
    {
        WorkBook workbook = WorkBook.Load(filePath);

        foreach (WorkSheet sheet in workbook.WorkSheets)
        {
            Console.WriteLine($"Checking sheet: {sheet.Name}");

            for (int row = 2; row <= sheet.RowCount; row++)
            {
                string itemName  = sheet[$"A{row}"].StringValue;
                int stockLevel   = sheet[$"B{row}"].IntValue;

                if (stockLevel < 10 && !string.IsNullOrEmpty(itemName))
                {
                    lowStockItems.Add($"{itemName} -- {stockLevel} units ({sheet.Name})");
                }
            }
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine($"Error reading Excel file: {ex.Message}");
    }

    return lowStockItems;
}

// Export results to a new workbook
static void ExportReport(List<string> items, string outputPath)
{
    WorkBook report     = WorkBook.Create();
    WorkSheet sheet     = report.CreateWorkSheet("Low Stock Report");

    sheet["A1"].Value   = "Item Description";
    sheet["B1"].Value   = "Source Sheet";

    sheet["A1:B1"].Style.Font.Bold        = true;
    sheet["A1:B1"].Style.BackgroundColor  = "#4472C4";
    sheet["A1:B1"].Style.Font.Color       = "#FFFFFF";

    int rowIndex = 2;
    foreach (string item in items)
    {
        sheet[$"A{rowIndex}"].Value = item;
        rowIndex++;
    }

    report.SaveAs(outputPath);
    Console.WriteLine($"Report saved to: {outputPath}");
}

// Run
var lowStockItems = CheckLowStock("inventory.xlsx");
ExportReport(lowStockItems, "low-stock-report.xlsx");
$vbLabelText   $csharpLabel

此示例使用頂級語句並涵蓋完整工作流程:驗證文件路徑和擴展名,載入工作簿,迭代所有工作表,應用業務邏輯,並將結果寫入新文件。欲了解寫入和保存工作簿的更多信息,請參閱寫入Excel文件指南導出Excel指南

注意,WorkBook.Create()創建新工作簿,而不是修改源文件。將源文件與輸出文件分開是良好的做法,以便審計追蹤,並避免意外覆蓋其他進程所依賴的數據。 如果您需要將數據附加到現有工作簿中,可以使用SaveAs()保存到新路徑或就地覆蓋。

如何有效地處理大型Excel文件?

對於有上千行的文件,聚合函數比手動迴圈更具優勢,因為它們內部操作而不需將每個儲存格具體化為單個物件:

using IronXL;

WorkBook workbook = WorkBook.Load("large-dataset.xlsx");
WorkSheet ws      = workbook.DefaultWorkSheet;

// Fast: aggregate functions operate on the range directly
decimal total   = ws["B2:B5000"].Sum();
decimal average = ws["B2:B5000"].Avg();
int count       = ws["B2:B5000"].Count();

Console.WriteLine($"Total: {total:C}, Average: {average:C}, Rows: {count}");

// Export the worksheet to a DataSet for LINQ or database operations
var dataSet = workbook.ToDataSet();
Console.WriteLine($"DataSet tables: {dataSet.Tables.Count}");
using IronXL;

WorkBook workbook = WorkBook.Load("large-dataset.xlsx");
WorkSheet ws      = workbook.DefaultWorkSheet;

// Fast: aggregate functions operate on the range directly
decimal total   = ws["B2:B5000"].Sum();
decimal average = ws["B2:B5000"].Avg();
int count       = ws["B2:B5000"].Count();

Console.WriteLine($"Total: {total:C}, Average: {average:C}, Rows: {count}");

// Export the worksheet to a DataSet for LINQ or database operations
var dataSet = workbook.ToDataSet();
Console.WriteLine($"DataSet tables: {dataSet.Tables.Count}");
$vbLabelText   $csharpLabel

轉換為DataSet特別有效,當您需要對多個工作表運行LINQ查詢或將數據載入關係數據庫時。 每個工作表在DataTable,使得與現有數據訪問代碼的配合更加簡單。 完整詳細信息請參閱Excel轉DataSet指南

如何獲得授權並部署到生產環境?

IronXL是一個商業程式庫,提供全功能的免費試用,供開發和測試使用。 對於生產部署,您將需要一個有效的授權金鑰。 授權層級的詳細信息,包括開發者、團隊和企業選項,請參閱IronXL許可頁面

要申請授權金鑰,在任何IronXL調用之前設置它:

IronXl.License.LicenseKey = "YOUR-LICENSE-KEY-HERE";
IronXl.License.LicenseKey = "YOUR-LICENSE-KEY-HERE";
$vbLabelText   $csharpLabel

IronXL功能概覽總結了所有功能,從讀取和寫入文件到创建图表,应用条件格式和处理命名范围。 創建Excel文件指南合併儲存格指南是撰寫新工作簿的有用起點。

針對有關C# Excel自動化的社區討論和問題,Microsoft Q&A 論壇Stack Overflow是良好的資源。 官方NuGet套件頁面提供版本歷史和下載統計。

在C#中開啟Excel文件的關鍵要點是什麼?

IronXL 完全移除了對Microsoft Office的依賴,這使得在伺服器、容器和雲功能中處理Excel文件成為可能。 API遵循一個簡單的模式:載入工作簿,按名稱或索引訪問工作表,使用類型化存取器讀取儲存格。 像Max()這樣的聚合函數在不需手動迭代的情況下處理大量數據集。

該程式庫支援XLSX、XLS、CSV和TSV格式,運行在.NET 10和所有最近的.NET版本上,並且跨平台運行。 因為IronXL會拋出您可以熟悉地使用try/catch模式捕捉的標準.NET例外,所以錯誤處理變得相對簡單 — 不需解碼COM互操作錯誤碼。 欲探索所有可用選項,請從IronXL文檔首頁開始,或嘗試打開工作簿指南以獲得逐步參考。

開始免費的IronXL試用,在自己的專案中評估此程式庫,無需任何承諾。

現在開始使用 IronXL。
green arrow pointer

常見問題解答

如何在 VB.NET 中開啟不需要 Microsoft Office 的 Excel 檔案?

您可以使用 IronXL 庫在 VB.NET 中開啟和讀取 Excel 檔案,而無需 Microsoft Office。IronXL 提供了一種簡單的方式來處理 Excel 檔案,無需 Microsoft Office 或複雜的 Interop 方法。

在 VB.NET 中使用 IronXL 進行 Excel 處理的好處是什麼?

IronXL 通過消除對 Microsoft Office 的需求以及避免複雜的 COM 參考,簡化了 VB.NET 中的 Excel 處理。它確保了不同環境(如伺服器和雲平台)中的兼容性,並有助於防止版本衝突。

可以使用 IronXL 處理 XLSX 和 XLS 檔案嗎?

可以,IronXL 支援處理 XLSX 和 XLS 檔案格式,允許您在 VB.NET 應用中開啟、讀取和操作這些 Excel 檔案。

使用 IronXL 是否需要安裝任何其他軟體?

不用,使用 IronXL 進行 VB.NET 中的 Excel 檔案處理不需要任何其他軟體。IronXL 是一個獨立的庫,直接整合到您的 VB.NET 專案中。

IronXL 能在雲端環境中使用嗎?

可以,IronXL 被設計為無縫運行於雲端環境,避免了傳統 Excel Interop 方法在伺服器或雲平台中常遇到的版本衝突問題。

IronXL 如何處理 Excel 檔案兼容性?

IronXL 通過支援多種 Excel 檔案格式如 XLSX 和 XLS 來確保兼容性,並提供強大的功能來操作和處理這些檔案,而無需依賴 Microsoft Office。

IronXL 與不同版本的 VB.NET 兼容嗎?

IronXL 與各版本的 VB.NET 兼容,這使其成為開發者在不同的 .NET Framework版本中使用的多功能解決方案。

使用傳統 Interop 方法處理 VB.NET 中的 Excel 時的常見挑戰是什麼?

傳統的 Interop 方法通常需要 Microsoft Office,涉及複雜的 COM 參考,並且在伺服器或雲端環境中特別容易發生版本衝突。IronXL 透過提供一種更可靠和簡單的方法來解決這些挑戰。

IronXL 可以用來操作 Excel 檔案,例如編輯或匯出數據嗎?

可以,IronXL 不僅提供讀取 Excel 文件的功能,還提供編輯和匯出數據的功能,使其成為 VB.NET 中 Excel 檔案操作的綜合工具。

在哪裡可以找到使用 IronXL 的 VB.NET 工作程式碼範例?

您可以在 IronXL 文檔和教程中找到使用 IronXL 的 VB.NET 工作程式碼範例,這些文檔和教程提供了處理不需要 Microsoft Office 的 Excel 檔案的逐步指導。

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

鋼鐵支援團隊

我們每週 5 天,每天 24 小時在線上。
聊天
電子郵件
打電話給我