等待Excel Interlop在C#中退出

我正在开发一个工具,为我自动执行一些操作。 其中一个操作是下载一个excel文件,在其上运行一个macros,然后邮寄文件。 在某些情况下,我希望工具只运行Excelmacros,然后在x秒后退出Excel并邮寄文件。 这一切工作正常,因为我可以等待一段固定的时间。 但是,在某些情况下,我希望能够检查和更改由Excelmacros检索到的数据。 当这种情况下,我想保持excel打开,直到使用手动closuresexcel。 当我发现excel不再打开我想要邮件的文件。

这最后一个案子给我一些麻烦。 因为我使用excel interlop打开excel,我不能使用WaitForExit()像我可以用一个正常的过程。 当我手动closuresexcel的过程也一直在进程资源pipe理器中运行。

我在互联网上search的解决scheme,但没有一个真正的工作。 有没有什么办法可以用简单的方法实现呢?

更新非常感谢您的回复,它真的帮助了我。 等待excel现在正常工作。 我使用了下面的代码:

if (Settings.ExitExcel) { System.Threading.Thread.Sleep(Settings.ExcelTimeout * 1000); //Close Excel excelWorkbook.Close(); excelApp.Quit(); } else { Excel.AppEvents_WorkbookBeforeCloseEventHandler Event_BeforeBookClose; Event_BeforeBookClose = new Excel.AppEvents_WorkbookBeforeCloseEventHandler(WorkbookBeforeClose); excelApp.WorkbookBeforeClose += Event_BeforeBookClose; //Wait until excel is closed while (!isClosed) { Thread.Sleep(1000); } //Show message MessageBox.Show("excel closed"); } //Clean up excel. Marshal.FinalReleaseComObject(excelSheets); Marshal.FinalReleaseComObject(excelWorksheet); Marshal.FinalReleaseComObject(excelWorkbook); Marshal.FinalReleaseComObject(excelApp); excelApp = null; excelWorkbook = null; excelWorksheet = null; excelSheets = null; GC.Collect(); 

现在唯一的问题是,excel仍然在进程中继续运行。 我没有正确closures它?

您可以通过使用BeforeClose事件来完成此操作。 基本上,你需要按照以下方法做一些事情:

  1. 创build一个variables来跟踪状态,即如果Excel打开或closures。
  2. 为WorkbookBeforeClose事件创build一个事件处理程序。
  3. 在处理程序中,检查工作簿是否已closures,并相应地更新状态跟踪variables的值。
  4. 如果工作簿已closures,请执行邮件发送操作。

代码可以是这样的:

 //Outside main private static bool isClosed = false; .... //Let's say your Workbook object is named book book.WorkbookBeforeClose += new Excel.AppEvents_WorkbookBeforeCloseEventHandler(app_WorkbookBeforeClose); if(isClosed) sendMailMethod(); ... private static void app_WorkbookBeforeClose(Excel.Workbook wb, ref bool cancel) { closed = !cancel; } 

这种方法不要求你先杀死进程。 但是,您应该释放COM对象并在Excel工作完成后结束该过程。

编辑:要closures该过程,请尝试Application.Quit()方法。