当前位置: 首页 > 编程语言 > C#

互操作后Excel程序保持打开状态;遗留方法不起作用Share

时间:2023-04-10 16:10:07 C#

Excel程序在互操作后保持打开状态;遗留方法不起作用我在调试某些代码时遇到了问题。Excel互操作用于从工作簿中提取某些值;但是,Excel在程序退出后仍保持打开状态。我已经尝试过传统的解决方案,但它仍然在所有运行代码的机器上保留对Excel的引用privatevoidTestExcel(){Excel.Applicationexcel=newExcel.Application();Excel.Workbooksbooks=excel.Workbooks;Excel.Workbookbook=books.Open("C:\test.xlsm");book.Close();books.Close();excel.Quit();Marshal.ReleaseComObject(书);Marshal.ReleaseComObject(书籍);元帅.ReleaseComObject(excel);}即使是这段简单的代码也可以使进程运行多个文件(xlsm、xlsx、xls)。现在我们有一个解决方法来终止我们打开的Excel进程,但为了我自己的理智,我更愿意让它工作。我应该补充一点,我将其缩小到Workbook变量。如果我删除对books.Open()的调用和对book的所有引用,它就会成功关闭。这对我有用:xlApp.Quit();//释放所有内存-停止EXCEL.exe闲逛。如果(xlWorkBook!=null){Marshal.ReleaseComObject(xlWorkBook);}//像这样释放每个工作簿if(xlWorkSheet!=null){Marshal.ReleaseComObject(xlWorkSheet);}//像这样释放每个工作表if(xlApp!=null){Marshal.ReleaseComObject(xlApp);}//发布Excel应用xlWorkBook=null;//将每个内存引用设置为空。xlWorkSheet=null;xlApp=null;GC.收集();我是一个COM业余爱好者,很久以前在一个项目中用过它来做一件小事,但这是我使用的Fragment。网上找的,记不太清了。无论如何,我把它贴在了它的所有荣耀中;)publicstaticclassComBlackBox{publicstaticvoidReleaseObject(objectobj){try{对象=空;}catch(ArgumentExceptionex){obj=null;MessageBox.Show("无法释放对象"+ex.Message);}最后{GC.Collect();我现在不能尝试,但它可能有效(我真的不记得任何细节)。也许它会对你有所帮助。请随意指出此代码的任何明显问题,我对COM知识真的很远;)这就是我解决这个问题的方法://在打开之前存储Excel进程。Processes[]processesBefore=Process.GetProcessesByName("excel");//在Excel中打开文件。应用程序excelApplication=newApplication();工作簿excelWorkbook=excelApplication.工作簿。打开(文件名);//打开文件后获取Excel进程。Process[]processesAfter=Process.GetProcessesByName(“excel”);//现在找到创建的进程ID,并存储它。int进程ID=0;foreach(ProcessprocessinprocessesAfter){if(!processesBefore.Select(p=>p.Id).Contains(process.Id)){processID=process.Id;}}//执行Excel操作//现在关闭带有COM对象的文件。excel工作簿。关闭();excel应用程序。工作簿。关闭();excel应用程序。辞职();//现在终止进程。if(processID!=0){Processprocess=Process.GetProcessById(processID);处理.Kill();这段代码对我有用。//声明单独的对象变量Excel.ApplicationxlApp=newExcel.Application();Excel.WorkbooksxlWorkbooks=xlApp.Workbooks;Excel.WorkbookxlWorkbook=xlWorkbooks.Add(Missing.Value);Excel.WorksheetxlWorksheet=(Excel.Worksheet)xlWorkbook.Worksheets.get_Item(1);//创建工作表xlWorkbook.Close(false,Missing.Value,Missing.Value);xlWorkbooks.Close();xlApp.Quit();Marshal.FinalReleaseComObject(xlWorksheet);元帅。FinalReleaseComObject(xlWorkbook);Marshal.FinalReleaseComObject(xlWorkbooks);Marshal.FinalReleaseComObject(xlApp);xl工作表=空;xl工作簿=空;xl工作簿=空;xlApp=null;GC.收集();关于这个问题的一些好信息。以上为C#学习教程:Excel进程互通后依然开启;传统方法行不通。收藏不代表立场,如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: