Excel进程仍在后台运行

rrh*_*rrh 5 .net c# excel

我正在使用互操作库从一张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();
Run Code Online (Sandbox Code Playgroud)

但是在我的应用程序终止后,我尝试编辑我的excel文件,并在打开时遇到一些问题.显然,即使我打电话,excel进程仍在后台运行ExcelApp.Quit().有没有办法正确关闭应用程序使用的excel文件?我是c#的新手,所以我可能在这里遗漏了一些东西.

编辑:解决了!显然,com对象的规则不鼓励使用2个点.

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();
Run Code Online (Sandbox Code Playgroud)

CJB*_*JBS 9

还有另一个类似的问题 - 并回答(/sf/answers/1215729931/),其中解决方案是避免使用双点表示法.相反,为沿途使用的每个对象定义变量,并在每个对象上单独使用Marshal.ReleaseComObject.

直接从链接的解决方案复制:

var workbook = excel.Workbooks.Open(/*params*/)
Run Code Online (Sandbox Code Playgroud)

--->改为使用 - >

var workbooks = excel.Workbooks;
var workbook = workbooks.Open(/*params*/)
Run Code Online (Sandbox Code Playgroud)

然后,完成后,释放每个COM对象:

Marshal.ReleaseComObject(workbook);
Marshal.ReleaseComObject(workbooks);
Marshal.ReleaseComObject(excel);
Run Code Online (Sandbox Code Playgroud)