1. 程式人生 > >Excel物件使用後進程不能退出的完美解決辦法

Excel物件使用後進程不能退出的完美解決辦法

主要原因是:程式並沒有完全釋放掉使用的資源,雖然程式正常關閉,程式本身也可以自動釋放原來使用的資源,但Excel程序並不能判斷到,只要Excel使用的資源有沒有釋放的,Excel程序就不會關閉。
解決辦法:使用完Excel.Application物件後,關閉所有使用資源。如:app._Workbools / Sheets / _Workbook 等,最後 app.Quit()。

以下是我寫的一個分析指定 Excel 檔案子表名列表的方法,供參考:

       ///
        /// 獲得指定 xls 檔案中 Sheet 子表名的列表
        ///
        ///
        ///
        public static string[] GetSheetList(string xlsFile)
        {
            if (!File.Exists(xlsFile))
            {
                return null;
            }

            // 初始化 Excel 元件變數
            object opt = System.Reflection.Missing.Value;
            Microsoft.Office.Interop.Excel.Application app = null;
            _Workbook book = null;
            Sheets sheets = null;
            _Worksheet[] wsArray = null;

            app = new Microsoft.Office.Interop.Excel.Application();
            book = app.Workbooks.Open(xlsFile, opt, true, opt, opt, opt, true, opt, opt, opt, false, opt, opt, opt, opt);    // 只讀,不可編輯;
            sheets = book.Worksheets;

            // 列舉出所有表
            wsArray = new _Worksheet[sheets.Count];
            string[] sheetNames = new string[sheets.Count];
            for (int i = 0; i < sheets.Count; i++)
            {
                wsArray[i] = (_Worksheet)sheets.get_Item(i + 1);         // 從 1 開始索引
                sheetNames[i] = wsArray[i].Name;
            }

            app.Workbooks.Close();          // 關閉所有工作 Book
            app.Quit();

            // 強制回收 Excel 程序
            int geneID = System.GC.GetGeneration(app);
            wsArray = null;
            sheets = null;
            book = null;
            app = null;
            System.GC.Collect(geneID);

            return sheetNames;
        }