2012-04-18 48 views
4

我创建Excel文件并从C#中保存并关闭它后,从任务管理器中释放Excel时出现问题。在我创建和关闭C#4.0中的Excel文件后,任务管理器仍然运行Excel

我用下面的代码来创建Excel实例:

Microsoft.Office.Interop.Excel.Application xlApp = new Microsoft.Office.Interop.Excel.Application(); 

Microsoft.Office.Interop.Excel.Workbook workbook = xlApp.Workbooks.Add(Microsoft.Office.Interop.Excel.XlWBATemplate.xlWBATWorksheet); 
Microsoft.Office.Interop.Excel.Worksheet worksheet = (Microsoft.Office.Interop.Excel.Worksheet)workbook.Worksheets[1]; 

然后我填充我的工作表:

worksheet.Cells[1, 1] = "Test"; 
worksheet.Cells[1, 2] = "Test"; 
worksheet.Cells[1, 3] = "Test"; 
worksheet.Cells[1, 4] = "Test"; 

之后,我保存工作簿:

workbook.SaveAs(filePath); 

然后关闭它:

workbook.Close(false, false); 

然后退出Excel:

xlApp.Quit(); 

但我做这个Excel后仍出现在任务管理器!?!?

任何想法为什么在我打电话给xlApp.Quit()后没有关闭?

在此先感谢。

+0

可能重复:http://stackoverflow.com/questions/1884217/why-does-excel-remain-open – voidengine 2012-04-18 15:26:18

回答

6

也许你可以尝试删除Interop并使用EPPlus来创建/修改Excel文件。这非常简单,并且不会在计算机上安装Office。

但如果你真的想要去与互操作那么这可能帮助(我一直在使用它在我的代码,以确保一切,我不得不创建800+在几分钟Excel文件妥善处理):

 workBook.Close(true, filePathTarget, Missing.Value); 
     app.DisplayAlerts = true; 
     app.Quit(); 
     Release(workSheet2); 
     Release(workSheet1); 
     Release(workBook); 
     Release(workBooks); 
     Release(app); 
     workSheet2 = null; 
     workSheet1 = null; 
     workBook = null; 
     workBooks = null; 
     app = null; 
     GC.Collect(); 
     GC.WaitForPendingFinalizers(); 

其中:

private static void Release(object obj) { 
     // Errors are ignored per Microsoft's suggestion for this type of function: 
     // http://support.microsoft.com/default.aspx/kb/317109 
     try { 
      System.Runtime.InteropServices.Marshal.FinalReleaseComObject(obj); 
     } catch { 
     } 
    } 

但我真的强烈建议您尝试使用EPPlus如果你处理XLSX文件只。它工作的很好,速度快,效率高,并且不会在正在安装的Microsoft Office上进行中继。在使用它一个小时后,我在5分钟后丢弃了Interop ...

+0

谢谢你提的EPPlus。它看起来太棒了。不安装正在安装的MS Office是一大优势。 – AlefSin 2012-04-18 15:40:25

+0

不客气。 – MadBoy 2012-04-18 15:46:48

0

您需要将xlApp变量设置为null以释放COM引用。由于引用计数不为零,它可能是COM持有该实例的状态。

xlApp = null; 
+0

这可能还不够。我记得和Interop一起玩,很疯狂。我甚至不得不迫使GC进来收集一切。 – MadBoy 2012-04-18 15:30:27

+0

我并不是Interop的粉丝,但那是个问题。 – mgnoonan 2012-04-18 15:31:58

+0

我明白了,但是这样做不行:-)你需要多玩一点才能踢出Excel :-)查看我的答案,看看我在做什么才能真正把它踢出去... – MadBoy 2012-04-18 15:33:40

相关问题