IRONSOFTWAREHOME
USING IRONXL

如何使用 IronXL 在 C# 中關閉 Excel 進程

Curtis Chau
Curtis Chau
Updated: 2026年7月19日

在 C# 中以程式方式處理 Excel 文件可能會導致令人沮喪的問題——尤其是 Excel 進程無法終止並在任務管理員中滯留。 這種常見的頭痛影響各種專案中的開發人員,從簡單的自動化腳本到企業級應用程式。 無論您是在構建控制台應用程式、具有物件發送者(object obj)事件處理程式的 WinForms 應用程式還是企業系統,管理 Excel 應用程式生命週期至關重要。

IronXL 提供了一種清晰、高效的方法來進行 .NET 中的 Excel 文件管理,而不用傳統方法的複雜性。 本教程探討如何在 C# 中正確打開、保存和關閉 Excel 文件,同時保持系統資源清潔和程式碼可維護性。

為什麼 Excel 進程會在背景/任務管理員中掛起?

當開發人員使用傳統方法(如 Microsoft Office Interop)處理 Excel 文件時,應用程式會建立背景 Excel.exe 進程。 這些進程通常會在程式碼執行完成後仍保留在記憶體中,導致多個問題:

  • 隨時間累積的 記憶體洩漏 並降低系統性能
  • 文件鎖定問題 阻止對同一文件的後續操作
  • 在伺服器環境或批處理場景中的 資源耗盡
  • 當多個實例堆積時 不可預測的應用程式行為

問題根源在於如何管理 COM 物件。 每個 Excel 物件(包括工作簿、工作表、範圍和單元格)都需要顯式清理。未能釋放即使是一次引用也會導致進程無限期運行。 微軟的文件也認識到在 Office 自動化場景中的這一複雜性。

傳統方法:為什麼它失敗

using Microsoft Excel Interop 的經典模式看起來具有欺騙性的簡單,但隱藏了顯著的複雜性。 考慮這段嘗試正確關閉 Excel 的程式碼片段:

using Excel = Microsoft.Office.Interop.Excel;
class Program
{
    static void Main(string[] args)
    {
        Excel.Application excelApp = null;
        Excel.Workbook book = null;
        Excel.Worksheet sheet = null;
        try
        {
            excelApp = new Excel.Application();
            book = excelApp.Workbooks.Open(@"C:\data\report.xlsx");
            sheet = (Worksheet?)book.Worksheets[1];
            // Perform operations
            string data = (sheet.Cells[1, 1] as Range)?.Value2?.ToString();
            book.Save();
            book.Close(false);
            excelApp.Quit();
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Error: {ex.Message}");
        }
        finally
        {
            // The "correct way" according to traditional guidance, c# close excel process
            if (sheet != null) Marshal.ReleaseComObject(sheet);
            if (book != null) Marshal.ReleaseComObject(book);
            if (excelApp != null) Marshal.ReleaseComObject(excelApp);
            sheet = null;
            book = null;
            excelApp = null;
            GC.Collect();
            GC.WaitForPendingFinalizers();
        }
    }
}

建議在釋放 COM 物件後調用 GC.Collect()GC.WaitForPendingFinalizers() 以確保它們被完全清理,因為這會強制垃圾收集器收集任何剩餘的未使用記憶體。

即使遵循上述程式碼的最佳實踐,呼叫每個物件的 ReleaseComObject,將引用設置為 null,並強制垃圾收集,問題仍然存在。 為什麼會這樣呢? 因為在操作過程中建立的隱式物件——例如當 excelApp.Workbooks 返回一個臨時 Workbooks 集合時——不會被釋放。 這些隱藏的 COM 物件的引用計數器從未達到零,這使得 Excel 進程運行。

核選擇:終止 Excel 進程

當所有其他方法失敗時,開發人員通常會訴諸更積極的解決方案來終止 Excel 進程:

using System.Diagnostics;
class Program
{
    static void Main(string[] args)
    {
        // Store process IDs before opening Excel
        var existingProcessIds = Process.GetProcessesByName("EXCEL")
            .Select(p => p.Id)
            .ToHashSet();
        Excel.Application excelApp = new Excel.Application();
        try
        {
            // Perform Excel operations
            // ...
        }
        finally
        {
            excelApp.Quit();
            // Find and kill all new Excel processes
            foreach (Process proc in Process.GetProcessesByName("EXCEL"))
            {
                if (!existingProcessIds.Contains(proc.Id))
                {
                    try
                    {
                        proc.Kill();
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine($"Unable to kill process: {ex.Message}");
                    }
                }
            }
        }
    }
}

using Process.GetProcessesByName("EXCEL") 的這種方法可以有效,但很危險。 您可能會意外終止屬於使用者的 Excel 進程。 最可靠的 Excel 進程終止方法是按其進程 ID(PID)終止,這需要仔細跟踪應用程式建立的 Excel 進程 ID。 您可以在建立時捕獲 PID,以確保僅終止由您的 C# 程式啟動的特定實例。 強制終止 Excel 進程通常會關閉所有正在運行的實例,除非實施了附加邏輯。 函式 TerminateProcess 無條件地強制進程退出,如果文件未保存可能會導致資料丟失。

甚至有些開發人員使用後期綁定來通過運行時型別系統與 Excel 應用程式交互,希望避免 COM 引用問題。 其他人在主執行緒中加上 [STAThread] 屬性,確保單執行緒組件模式,這可能有幫助,但無法解決根本問題。

IronXL:更好的解決方案

IronXL 採取了根本不同的方法。 作為一個純淨的 .NET 程式庫,它完全不會生成外部 Excel 進程。 文件通過託管程式碼直接讀取和寫入,這意味著 .NET 垃圾收集器會自動處理資源清理。 沒有拖後腿的進程,沒有複雜的銷毀模式,也沒有沮喪。

如何安裝 IronXL 來管理 Excel 文件?

開始使用 IronXL 只需幾秒鐘。 該程式庫可通過 NuGet 獲得,使得在任何 .NET 專案中的安裝變得簡單。

打開 Visual Studio 中的包管理器控制台並運行:

PM > Install-Package IronXL.Excel

或者,使用 NuGet Package Manager UI,搜尋 "IronXL" 並點擊安裝。

安裝後,將 IronXL 命名空間新增到您的程式碼文件中:

using IronXL;

該程式庫支持 .NET Framework 4.6.2+、.NET Core、.NET 5、6、7、8、9 和 10,以及在 Windows、Linux、macOS、Docker 和 Azure 環境中的部署。 無需額外的依賴或 Office 安裝——即使您的系統中沒有安裝 Microsoft Excel,也可以執行所有 Excel 操作。 查看完整安裝指南以獲取詳細的安裝說明。

如何使用 IronXL 打開、保存和關閉 Excel 文件?

Excel 文件管理的基本工作流程涉及三個操作:打開文件、執行工作並正確關閉。 IronXL 使這一過程直觀而清晰。 以下程式碼演示了標準工作流程:

using IronXL;

WorkBook workBook = WorkBook.Load("output.xlsx");
// Access the first worksheet
WorkSheet workSheet = workBook.DefaultWorkSheet;
// Read and modify cell values
string currentValue = workSheet["A1"].StringValue;
workSheet["A1"].Value = "Updated Value";
workSheet["B2"].Value = 12500.75;
// Save changes to the original file
workBook.Save();
// Close the workbook and release resources
workBook.Close();

讓我們分解程式碼的每個部分完成的功能:

WorkBook.Load() 方法從指定路徑打開現有 Excel 文件。 IronXL 自動檢測文件格式(XLS、XLSX、CSV 或 TSV)並將其載入到記憶體中。 與傳統方法不同,此操作不會啟動任何外部進程——文件內容被直接解析為 .NET 物件。

單元格存取使用熟悉的 Excel 符號。 語法 workSheet["A1"] 返回一個單元格物件,該物件暴露 DecimalValueDateTimeValue 等屬性,以讀取型別化資料。 設置 Value 屬性將資料寫回單元格。

最後,Close() 釋放與工作簿相關的所有資源。 調用此方法後,不應在工作簿物件上執行其他操作。 WorkBook 類文件 提供了有關可用方法和屬性的完整詳細資訊。

如果您需要更高層次的 IronXL 與 Microsoft Office Interop 的比較,IronXL 與 Interop 的概述展示了記憶體管理、部署和跨平台支持的實際差異。

輸入

C# 使用 IronXL 關閉 Excel 進程:圖像 1 - 範例 Excel 輸入

輸出

C# 使用 IronXL 關閉 Excel 進程:圖像 2 - IronXL 輸出

如何以不同格式保存 Excel 文件?

IronXL 支持以多種格式保存工作簿,這使得在 Excel 格式之間轉換或導出資料以便在其他系統中使用變得容易。

using IronXL;

// Create a new workbook
WorkBook workBook = WorkBook.Create(ExcelFileFormat.XLSX);
WorkSheet workSheet = workBook.CreateWorkSheet("SalesData");
// Populate with sample data
workSheet["A1"].Value = "Product";
workSheet["B1"].Value = "Revenue";
workSheet["A2"].Value = "Widget Pro";
workSheet["B2"].Value = 45000;
// Save as different formats
workBook.SaveAs("sales_report.xlsx");    // Modern Excel format
workBook.SaveAs("sales_report.xls");     // Legacy Excel format
workBook.SaveAs("sales_report.csv");     // Comma-separated values
workBook.SaveAs("sales_report.json");    // JSON format
workBook.Close();

SaveAs() 方法根據您提供的文件擴展名確定輸出格式。此自動檢測支持:

  • XLSX - 現代 Excel 格式,推薦用於大多數使用情況
  • XLS - 與 Excel 2003 及更早版本相容的遺留格式
  • CSV - 理想的資料交換純文字格式
  • TSV - 適用於某些資料處理工作流的製表符分隔格式
  • JSON - 用於 Web 應用程式和 API 的結構化資料格式
  • XML - 用於系統整合的標記格式

輸出

C# 使用 IronXL 關閉 Excel 進程:圖像 3 - 現代 Excel 格式輸出

C# 使用 IronXL 關閉 Excel 進程:圖像 4 - JSON 輸出

從頭建立 Excel 試算表時,方法 WorkBook.Create() 接受可選的 ExcelFileFormat 參數來指定預設格式。 建議使用 ExcelFileFormat.XLSX 除非您有特定的舊版相容要求。

對於需要密碼保護的場景,方法 SaveAs() 接受第二個參數:

// Save with password encryption
workBook.SaveAs("confidential_data.xlsx", "SecurePassword123");

這會加密文件,使其只能用正確的密碼打開。 文件保護功能文件介紹了有關安全選項的其他資訊,包括工作表級保護。

在處理 Excel 文件時如何正確釋放資源?

雖然 IronXL 沒有建立需要手動終止的外部進程,但正確的資源管理仍然是一種最佳實踐。最優雅的方法是使用 C# 的 using 語句,這可以保證即使發生異常也會進行清理。 這是處理現代 .NET 應用程式中 Excel 文件操作的正確方法。

對於您需要更明確控制的場景,使用 finally 塊的標準模式同樣適用:

using IronXL;

WorkBook workBook = null;
try
{
    workBook = WorkBook.Load("quarterly_figures.xlsx");
    WorkSheet workSheet = workBook.DefaultWorkSheet;
    // Process the spreadsheet using a loop
    foreach (var cell in workSheet["A2:A50"])
    {
        Console.WriteLine($"Cell {cell.AddressString}: {cell.Text}");
    }
    workBook.Save();
}
catch (Exception ex)
{
    Console.WriteLine($"Error processing file: {ex.Message}");
    // You might throw a new exception or handle it appropriately
}
finally
{
    // Ensure cleanup happens regardless of success or failure
    workBook?.Close();
}

try-finally 塊可保證即使在處理過程中出現異常,Close() 也會執行。 null 條件運算符(?.)可以防止在最初載入工作簿失敗時出錯。

輸入

C# 使用 IronXL 關閉 Excel 進程:圖像 5 - 季度數字輸入

輸出

C# 使用 IronXL 關閉 Excel 進程:圖像 6 - 控制台輸出

與傳統的 Excel Interop 不同,您必須跟踪建立的每個 Excel 物件,對每個物件調用 ReleaseComObject 並強制垃圾收集器 GC.Collect(),IronXL 的方法意味著您永遠不必擔心任務管理員中出現孤立的進程。

如需更深入了解 .NET 如何管理非託管資源,Microsoft 文件 有關 IDisposable 的說明可解釋 IronXL 在內部遵循的模式。

如何解決常見的 Excel 進程問題?

問題:Excel 進程不會退出

使用傳統的 Interop,即使在調用 excelApp.Quit() 並釋放 COM 物件之後,由您的應用程式建立的所有 Excel 進程可能仍保持活動狀態。檢查任務管理器會顯示拒絕終止的 Excel.exe 實例。 這是因為:

  1. COM 物件的引用計數器不為零
  2. 未釋放隱式物件(如 Workbooks 集合)
  3. 事件處理程式維持對 Excel 物件的引用
  4. 垃圾收集尚未運行以完成物件

**IronXL 解決方案:**由於 IronXL 不會產生 Excel 進程,這個問題根本不存在。當您關閉工作簿時,其資源通過正常的 .NET 垃圾收集釋放——不需要進行特殊清理。

問題:操作後文件鎖定

一個常見的抱怨是:您的程式碼完成後,Excel 文件仍然被鎖定,您無法在 Excel 中打開它或執行其他操作。 這種情況發生在 Excel 進程維持對打開的工作簿的句柄時。

**IronXL 解決方案:**當您調用 Close()using 塊結束時,文件句柄會立即被釋放。 沒有滯留的鎖定,無需等待進程終止。

問題:事件處理程式複雜性

當您將事件處理程式附加到 Excel 物件(例如響應使用者關閉工作簿時),handler 委派會保持對 Excel 物件的引用。 這妨礙了正確清理,可能會導致該進程掛起。

// Traditional approach with event handler - problematic
public void ProcessExcel()
{
    Excel.Application excelApp = new Excel.Application();
    excelApp.WorkbookBeforeClose += OnWorkbookClose;
    // Even with cleanup, the event handler reference persists
    // The Excel app stays open because of this reference
}
private void OnWorkbookClose(Excel.Workbook Wb, ref bool Cancel)
{
    // Handler code
}

**IronXL 解決方案:**IronXL 不依賴於 COM 事件。 所有操作都使用同步方法調用,完全消除了事件處理程式引用問題。

如需有關打開工作簿後閱讀和處理單元格資料的更多細節,C# 中閱讀 Excel 文件的指南 介紹了型別讀取、範圍迭代和公式評估。

C# 中 Excel 文件管理的最佳實踐是什麼?

實施乾淨、可維護的 Excel 文件處理取決於幾個關鍵原則。 遵循這些做法可以幫助您避免常見陷阱並構建可靠的應用程式。

**始終將操作封裝在 using 語句或 try-finally 塊中。**雖然 IronXL 能夠乾淨地處理資源,但防禦性編碼可防止極端情況,並使其他開發人員在閱讀您的程式碼時明確了解您的意圖。

**只載入您需要的內容。**對於大型試算表,考慮存取特定工作表,而不是遍歷所有工作表。 GetWorkSheet() 方法可讓您精確針對所需的資料。 您還可以合併單元格排序範圍來清理保存前的資料。

**防範性處理文件操作。**文件可能被其他進程鎖定,路徑可能無效,或者權限可能受到限制。 在適當的錯誤處理中包裝操作可使您的應用程式更具彈性。

捕捉特定的異常型別可讓您為使用者提供有意義的反饋或實施重試邏輯以應對文件鎖定等暫時性故障。 如果需要,您還可以引發一個新的帶有額外上下文的異常。

**為您的情況使用合適的文件格式。**XLSX 適用於大多數情況,但 CSV 更適合需要由其他系統處理或導入到資料庫中的資料。 導出和保存特性文件詳細介紹了格式選擇。

**考慮大文件的記憶體。**雖然 IronXL 很高效,但極大的試算表(數十萬行)需要分塊處理資料而不是一次載入所有東西。 使用 WorkBook.FromStream()ToStream() 方法的基於流的方法為記憶體受限環境提供了額外的靈活性。 您還可以導出資料到 DataSet 或 DataTable 物件,以便於與資料庫和其他資料處理工作流的整合。

**在保存前應用樣式。**如果您需要格式化單元格——粗體標題、數字格式、背景顏色——IronXL 支持在最後一次 Save() 調用之前樣式化單元格範圍,以便一次性乾淨關閉工作簿。

快速參考:傳統 Interop 與 IronXL

C# 中常見文件管理任務的傳統 Excel Interop 與 IronXL 的比較
任務傳統 InteropIronXL
關閉 Excel 文件book.Close(); app.Quit(); + ReleaseComObject 對所有物件workBook.Close();
避免進程洩漏跟踪所有引用,強制 GC.Collect()無需任何操作 —— 無外部進程
終止孤立進程foreach (Process proc in Process.GetProcessesByName("EXCEL"))不需要
處理丟失的文件檢查存在性,處理 COMException標準 IOException
執行緒要求[STAThread] 在主執行緒上None

.NET Foundation 的COM 互操作性指南進一步說明了為什麼在沒有像 IronXL 這樣的程式庫的情況下,COM 中的引用計數難以保證清潔進程終止。

對於批處理工作流程,您可以逐個打開數十個文件,IronXL 的無進程模型還意味著您可以安全地在多執行緒環境中運行。 執行緒安全文件介紹了在並行化工作簿操作時需要注意的事項。

您的下一步是什麼?

在 C# 中管理 Excel 文件不必涉及與背景進程鬥爭或複雜的清理例程。 IronXL 提供了一種乾淨、現代的方法,自動處理資源管理,同時讓您對 Excel 操作保持完全控制。

本教程的關鍵要點:

  • IronXL 消除了與傳統 Excel 自動化相關的進程管理頭痛
  • 方法 Save()Close() 提供簡單的文件生命週期管理
  • 使用語句提供自動資源清理,程式碼量非常少
  • SaveAs() 方法支持多種導出格式(XLSX、CSV、JSON 等)
  • 正確的錯誤處理和防禦性編碼實踐確保了可靠的應用程式
  • 無需跟踪 Excel 進程 ID,呼叫 Process.GetProcessesByName("EXCEL"),或強制終止 Excel 進程

無論您是在構建自動化腳本、生成報告還是處理資料文件,IronXL 都能為您提供高效可靠處理 Excel 文件的工具。 此解決方案可清潔地關閉 Excel,以便您專注於應用程式邏輯,而不是在任務管理器中除錯孤立進程。

探索以下相關指南以繼續構建:

開始您的免費試用以體驗 IronXL 如何簡化您的 .NET 專案中的 Excel 文件管理。 對於生產部署,探索適合您團隊需求的授權選項

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天試用金鑰
無需信用卡或帳戶建立