C#读取xls后closuresexcel句柄

我正在尝试打开一个xls文件,读取多行数据,从数据形成一个自定义列表,然后closuresExcel工作表。 这是我的:

InitializeWorkbook(Path); List<Custom> list = new List<Custom>(); Worksheet wkSht = (Worksheet)workBk.Worksheets[3]; if (wkSht.Name.Equals("Sht3", StringComparison.OrdinalIgnoreCase)) { Range PartNumRange = wkSht.get_Range("A:A", System.Reflection.Missing.Value); Range RevRange = wkSht.get_Range("C:C", System.Reflection.Missing.Value); Range SwRange = wkSht.get_Range("L:L", System.Reflection.Missing.Value); Range NomenRange = wkSht.get_Range("M:M", System.Reflection.Missing.Value); // Start at Row 6 int i = 6; object Num = (PartNumRange[i, 1] as Range).Text; object Nomen = (NomenRange[i, 1] as Range).Text; object Sw = (SwRange[i, 1] as Range).Text; object SwRev = (RevRange[i, 1] as Range).Text; while (!string.IsNullOrEmpty(Num.ToString()) || !string.IsNullOrEmpty(Nomen.ToString()) || !string.IsNullOrEmpty(Sw.ToString()) || !string.IsNullOrEmpty(SwRev.ToString())) { if (!string.IsNullOrEmpty(Nomen.ToString()) && !string.IsNullOrEmpty(Sw.ToString()) && !string.IsNullOrEmpty(SwRev.ToString()) { Custom item = new Custom(); item.PartNumber = (PartNumRange[i, 1] as Range).Text.ToString(); item.Nomenclature = (NomenRange[i, 1] as Range).Text.ToString(); item.SwNumber = (SwRange[i, 1] as Range).Text.ToString(); item.SwRevision = (RevRange[i, 1] as Range).Text.ToString(); list.Add(item); } i++; Num = (PartNumRange[i, 1] as Range).Text; Nomen = (NomenRange[i, 1] as Range).Text; Sw = (SwRange[i, 1] as Range).Text; SwRev = (RevRange[i, 1] as Range).Text; } GC.Collect(); GC.WaitForPendingFinalizers(); Marshal.ReleaseComObject(PartNumRange); Marshal.ReleaseComObject(RevRange); Marshal.ReleaseComObject(SwRange); Marshal.ReleaseComObject(NomenRange); Marshal.ReleaseComObject(wkSht); workBk.Close(false, System.Reflection.Missing.Value, false); Marshal.ReleaseComObject(workBk); Marshal.ReleaseComObject(ExcelWorkSheets); ExcelApp.Quit(); Marshal.ReleaseComObject(ExcelApp); GC.Collect(); GC.WaitForPendingFinalizers(); } 

我不知道为什么,但Excel完成后不closures。 只有当程序退出Excel退出。 我尝试了各种各样的组合,并避免了两个点的规则,但仍然是一个不行。 任何想法,我失踪?

编辑:调用ExcelApp.QuitclosuresExcelApp和ExcelWorksheets。

你可能想看看这个post: 如何正确地清理Excel互操作对象?

关于在C#中处理COM对象有很多深入的讨论,您可能会发现有帮助。 值得一读。

你也需要打电话

  • ExcelWorkSheets
  • ExcelApp

调用Marshal.ReleaseComObjectconfiguration运行时可调用的包装器,但是保持应用程序本身仍然活着并且踢。

你可以试试这个代码 – 它工作正常

 while (Marshal.ReleaseComObject(YourRange) > 0) {} while (Marshal.ReleaseComObject(YourWorkSheet) > 0) {} while (Marshal.ReleaseComObject(YourWorkBook) > 0) {} YourApplication.quit() while (Marshal.ReleaseComObject(YourApplication) > 0) {}