bra*_*enb 8 .net c# com excel-interop
我遇到了一些我正在调试的代码问题.Excel interop用于从工作簿中提取某些值; 但是,Excel程序退出后仍保持打开状态.我已经尝试了传统的解决方案,但它仍然在运行代码的所有机器上保持对Excel的引用
private void TestExcel()
{
Excel.Application excel = new Excel.Application();
Excel.Workbooks books = excel.Workbooks;
Excel.Workbook book = books.Open("C:\\test.xlsm");
book.Close();
books.Close();
excel.Quit();
Marshal.ReleaseComObject(book);
Marshal.ReleaseComObject(books);
Marshal.ReleaseComObject(excel);
}
Run Code Online (Sandbox Code Playgroud)
即使是这段简单的代码也可以使进程运行多个文件(xlsm,xlsx,xls).现在我们有一个解决方法来杀死我们已经打开的Excel进程,但我更倾向于让这个工作为我自己的理智.
我应该补充一点,我已将其缩小到Workbook变量.如果我删除了对books.Open()所有引用的调用,book那么它将成功关闭.
Adi*_*l B 13
这对我来说很成功:
xlApp.Quit();
//release all memory - stop EXCEL.exe from hanging around.
if (xlWorkBook != null) { Marshal.ReleaseComObject(xlWorkBook); } //release each workbook like this
if (xlWorkSheet != null) { Marshal.ReleaseComObject(xlWorkSheet); } //release each worksheet like this
if (xlApp != null) { Marshal.ReleaseComObject(xlApp); } //release the Excel application
xlWorkBook = null; //set each memory reference to null.
xlWorkSheet = null;
xlApp = null;
GC.Collect();
Run Code Online (Sandbox Code Playgroud)
这段代码对我有用。
//Declare separate object variables
Excel.Application xlApp = new Excel.Application();
Excel.Workbooks xlWorkbooks = xlApp.Workbooks;
Excel.Workbook xlWorkbook = xlWorkbooks.Add(Missing.Value);
Excel.Worksheet xlWorksheet = (Excel.Worksheet)xlWorkbook.Worksheets.get_Item(1);
//Create worksheet
xlWorkbook.Close(false, Missing.Value, Missing.Value);
xlWorkbooks.Close();
xlApp.Quit();
Marshal.FinalReleaseComObject(xlWorksheet);
Marshal.FinalReleaseComObject(xlWorkbook);
Marshal.FinalReleaseComObject(xlWorkbooks);
Marshal.FinalReleaseComObject(xlApp);
xlWorksheet = null;
xlWorkbook = null;
xlWorkbooks = null;
xlApp = null;
GC.Collect();
Run Code Online (Sandbox Code Playgroud)
Microsoft 的这篇文章提供了有关此问题的一些很好的信息。