我正在使用c#来读取/写入excel电子表格中的数据.
我正在使用这三个语句来打开我的excel文件
Excel.Application excelapp = new Excel.Application();
Excel._Worksheet worksheet = (Excel._Worksheet)workbook.ActiveSheet;
Excel._Worksheet worksheet = (Excel._Worksheet)workbook.ActiveSheet;
Run Code Online (Sandbox Code Playgroud)
并且这两行关闭/保存工作表.
workbook.Save();
workbook.Close();
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是EXCEL进程仍处于活动状态.(我使用任务管理器进行检查.)在读取/写入工作表数据后,我有20个EXCEL进程处于活动状态.
如果有人能够在我关闭工作簿之后立即向我展示结束excelapp proc的技术.
非常感谢,亚伦.
只需致电
excelapp.Quit();
Run Code Online (Sandbox Code Playgroud)
毕竟用Excel工作了.
如果进程仍在运行,请尝试Marshal.ReleaseComObject在所有Excel对象上使用并强制立即进行垃圾回收:
System.Runtime.InteropServices.Marshal.ReleaseComObject(excelapp);
excelapp = null;
GC.Collect();
GC.WaitForPendingFinalizers();
Run Code Online (Sandbox Code Playgroud)
请注意,您ReleaseComObject不仅需要使用excelapp对象,还需要使用您使用过的每个工作簿和工作表.
弓箭手走在正确的轨道上 ReleaseComObject,但是如果您需要搞乱垃圾收集,那么您在自动化代码中犯了一个错误。
它没有关闭的最可能原因是您对某些无法释放的对象有孤立的引用,因为您没有将它存储在变量中。一个常见的原因是如果您在一次调用中访问多个“层”。
例如,如果您执行以下操作:
Workbooks("Book1").Sheets("Sheet1").Range("A1:A2").Value = 1;
Run Code Online (Sandbox Code Playgroud)
然后,您将创建对工作簿、工作表和范围(也许还有工作表集合?)的引用,您无法正确释放这些引用。
因此,您必须将其拆分为类似这样的步骤(完全从记忆和后期绑定的角度编写,我可能错过了您需要发布的其他内容):
object wb = Workbooks("Book1");
object sheet = wb.Sheets("Sheet1");
object range = sheet.Range("A1:A2");
range.Value = 1;
Marshal.ReleaseComObject(range);
Marshal.ReleaseComObject(sheet);
Marshal.ReleaseComObject(wb);
Run Code Online (Sandbox Code Playgroud)
在正常情况下,您不应该终止进程或强制进行垃圾回收,我记得只有在我的代码中有错误时必须这样做。
| 归档时间: |
|
| 查看次数: |
4502 次 |
| 最近记录: |