c# - Excel 进程仍在后台运行

标签 c# .net 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();

但在我的应用程序终止后,我试图编辑我的 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/

相关文章:

vba - 使用宏删除 MS Word 页面

c# - 在编辑时处理 dataGridView FormatExeption

c# - 在 LINQ 查询中检查 NULL 的小数

c# - 以最大速率处理请求

c# - 用于在 CLR 上实现语言的书籍和文献

.net - 嵌套NEST `FirstOrDefault()`查询中 `Term()`有什么用途?

.net - 永不过期的不记名 token

java - 从 Java 生成 Excel 数据文件的最可靠方法是什么?

c# - 静态注册的工厂模式

vba - 宏在打开时不自动运行