我使用以下方法。执行此代码块后,我通过检查任务管理器发现Microsoft Excel仍在后台运行。
编辑:完全一个 Microsoft Excel后台进程仍然有效。我只是添加这个,因为当我第一次开始使用Excel和Interop COM对象时,有时许多进程会在函数执行完毕后继续运行。
在执行当前功能后,如何确保Excel未在后台运行?
我用全局范围声明这些变量,因为有几个函数最终需要它们:
private Excel.Application xls = null;
private Excel.Workbooks workBooks = null;
private Excel.Workbook workBook = null;
private Excel.Sheets sheets = null;
private Excel.Worksheet workSheet = null;
此方法用于检查给定工作簿中是否存在工作表:
private bool sheetExists(string searchString)
{
xls = new Excel.Application();
workBooks = xls.Workbooks;
workBook = workBooks.Open(workbookPath); // <- Where the workbook is saved
sheets = workBook.Sheets;
bool isFound = false;
foreach (Excel.Worksheet sheet in sheets)
{
// Check the name of the current sheet
if (sheet.Name == searchString)
{
Marshal.ReleaseComObject(sheet);
isFound = true;
break;
}
Marshal.ReleaseComObject(sheet);
}
cleanUp(true, xls, workBooks, workBook, sheets);
return isFound;
}
此函数用于释放COM对象:
private void cleanUp(bool saveTrueFalse, params object[] comObjects)
{
workBook.Close(saveTrueFalse);
xls.Application.Quit();
xls.Quit();
foreach (object o in comObjects)
{
Marshal.ReleaseComObject(o);
}
workSheet = null;
sheets = null;
workBook = null;
workBooks = null;
xls = null;
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
GC.WaitForPendingFinalizers();
}
答案 0 :(得分:-1)
我希望看到一个合适的解决方案,但这种黑客攻击是我能够让它发挥作用的唯一方式。似乎互操作库在告诉时关闭过程并不是很好。如果在线程中运行,您将为每个线程启动进程。我会通过按名称扫描进程并跟踪新进程来跟踪进程ID。我在服务器上这样做,所以我知道所有进程都是互操作启动而不是由实际用户启动。完成逻辑后,我会启动一个计时器,每隔一分钟就会尝试终止进程。最终会把它关闭。我还有一些代码可以在启动时杀死任何Excel进程,以防它们在上次应用程序运行时没有被正确杀死。
如果您想要按名称或ID杀死进程的示例代码,请告诉我们。我没有随时可用,或者快速SO搜索应该带来一些好的样本。