使用C#退出excel(使用excel自动化时)

Aar*_*ron 1 c# excel process

我正在使用c#来读取/写入excel电子表格中的数据.

我正在使用这三个语句来打开我的excel文件

 Excel.Application excelapp = new Excel.Application();
 Excel._Worksheet worksheet = (Excel._Worksheet)workbook.ActiveSheet;
 Excel._Worksheet worksheet = (Excel._Worksheet)workbook.ActiveSheet;
Run Code Online (Sandbox Code Playgroud)

并且这两行关闭/保存工作表.

  workbook.Save();
  workbook.Close();
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是EXCEL进程仍处于活动状态.(我使用任务管理器进行检查.)在读取/写入工作表数据后,我有20个EXCEL进程处于活动状态.

如果有人能够在我关闭工作簿之后立即向我展示结束excelapp proc的技术.

非常感谢,亚伦.

Kyr*_*o M 5

只需致电

excelapp.Quit();
Run Code Online (Sandbox Code Playgroud)

毕竟用Excel工作了.

如果进程仍在运行,请尝试Marshal.ReleaseComObject在所有Excel对象上使用并强制立即进行垃圾回收:

System.Runtime.InteropServices.Marshal.ReleaseComObject(excelapp);
excelapp = null;
GC.Collect();
GC.WaitForPendingFinalizers();
Run Code Online (Sandbox Code Playgroud)

请注意,您ReleaseComObject不仅需要使用excelapp对象,还需要使用您使用过的每个工作簿和工作表.


Han*_*son 5

弓箭手走在正确的轨道上 ReleaseComObject,但是如果您需要搞乱垃圾收集,那么您在自动化代码中犯了一个错误。

它没有关闭的最可能原因是您对某些无法释放的对象有孤立的引用,因为您没有将它存储在变量中。一个常见的原因是如果您在一次调用中访问多个“层”。

例如,如果您执行以下操作:

Workbooks("Book1").Sheets("Sheet1").Range("A1:A2").Value = 1;
Run Code Online (Sandbox Code Playgroud)

然后,您将创建对工作簿、工作表和范围(也许还有工作表集合?)的引用,您无法正确释放这些引用。

因此,您必须将其拆分为类似这样的步骤(完全从记忆和后期绑定的角度编写,我可能错过了您需要发布的其他内容):

object wb = Workbooks("Book1");
object sheet = wb.Sheets("Sheet1");
object range = sheet.Range("A1:A2");
range.Value = 1;

Marshal.ReleaseComObject(range);
Marshal.ReleaseComObject(sheet);
Marshal.ReleaseComObject(wb);
Run Code Online (Sandbox Code Playgroud)

在正常情况下,您不应该终止进程或强制进行垃圾回收,我记得只有在我的代码中有错误时必须这样做。