我有一个
Windows服务,通过Microsoft.Office.Interop.Excel.Application对象打开一个Excel电子表格.
Application xlApp = new Application(); Workbook workbook = xlApp.Workbooks.Open(fileName,2,false); ... ... workbook.Close(); xlApp.Quit();
在完成工作簿之后,我想杀死EXCEL.exe进程.
我试过以下,没有成功…
// This returns a processId of 0 IntPtr processId; GetWindowThreadProcessId(new IntPtr(xlApp.Hwnd),out processId); Process p = Process.GetProcessById(processId.ToInt32()); p.Kill();
任何人有什么想法,通过Windows服务如何做到这一点?
正确关闭打开的Excel工作簿并退出应用程序是非常困难的.如果我可以找到我将发布的链接,但实质上您必须清理所有对您创建的任何COM对象的引用.这包括来自ODBCConnections(数据连接),Worksheets,Workbooks和Excel应用程序的所有内容.我的工作涉及垃圾收集和System.Runtime.InteropServices.Marshal对象的组合:
// Garbage collecting GC.Collect(); GC.WaitForPendingFinalizers(); // Clean up references to all COM objects // As per above,you're just using a Workbook and Excel Application instance,so release them: workbook.Close(false,Missing.Value,Missing.Value); xlApp.Quit(); Marshal.FinalReleaseComObject(workbook); Marshal.FinalReleaseComObject(xlApp);
像你所说的,循环和杀死每个Excel进程通常不是一个好主意,因为如果你作为一个Windows应用程序运行它,你可以关闭Excel在您的用户,或在一个服务也关闭正在运行的Excel实例通过一些其他程序.
编辑:有关更多信息,请参阅this question.