我正在使用互操作库从一张 Excel 文件中读取一些数据。通过使用 Microsoft.Office.Interop.Excel
然后读取工作表中的所有数据,我得到了很好的数据。
Application ExcelApp = new Excel.Application();
Workbook excelWorkbook = ExcelApp2.Workbooks.Open(excelFileNamePath);
_Worksheet excelWorksheet = excelWorkbook.Sheets[excelSheetName];
Range excelRange = excelWorksheet.UsedRange;
//...for loops for reading data
ExcelApp.Quit();
但在我的应用程序终止后,我试图编辑我的 excel 文件,但在打开时遇到了一些问题。显然,即使我调用了 ExcelApp.Quit()
,excel 进程仍在后台运行。有没有办法正确关闭应用程序使用的excel文件?我是 C# 的新手,所以我可能在这里遗漏了一些东西。
编辑:已解决!显然有一个 rule对于不鼓励使用 2 个点的 com 对象。
Excel.Application ExcelApp2 = new Excel.Application();
Excel.Workbooks excelWorkbooks = ExcelApp2.Workbooks;
Excel.Workbook excelWorkbook = excelWorkbooks.Open(excelFileName);
Excel._Worksheet excelWorksheet = excelWorkbook.Sheets[excelSheetName];
//...
excelWorkbook.Close();
Marshal.ReleaseComObject(excelWorkbook);
Marshal.ReleaseComObject(excelWorksheet);
Marshal.ReleaseComObject(excelRange);
ExcelApp2.Quit();
最佳答案
还有另一个类似的问答(https://stackoverflow.com/a/17367570/3063884),解决方案是避免使用双点符号。相反,为沿途使用的每个对象定义变量,并在每个对象上单独使用 Marshal.ReleaseComObject
。
直接从链接的解决方案中复制:
var workbook = excel.Workbooks.Open(/*params*/)
---> 改为使用 -->
var workbooks = excel.Workbooks;
var workbook = workbooks.Open(/*params*/)
然后,完成后,释放每个 COM 对象:
Marshal.ReleaseComObject(workbook);
Marshal.ReleaseComObject(workbooks);
Marshal.ReleaseComObject(excel);
关于c# - Excel 进程仍在后台运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22050384/