【问题标题】:Closing Excel process after creating using Excel COM使用 Excel COM 创建后关闭 Excel 进程
【发布时间】:2021-05-24 10:36:44
【问题描述】:

下面的代码会创建一个损坏的文件/只读 excel csv 文件,因此我无法打开该文件以在其中写入数据。我需要从csv file 读取数据,然后将其保存到 excel 文件中以绘制图形。我可以知道代码有什么问题吗?因为每次我想删除生成的文件时,即使我关闭它,它仍在进程中运行。每次都要去任务管理器强制关闭进程,然后才能删除文件。

我已经尝试了link 中提供的所有解决方案,但没有任何解决方案可以解决我的问题。我想尝试using,但我知道我必须做出哪些改变,所以这是我迄今为止唯一没有尝试过的。

Excel.WorkBook xlWorkBook;

...

public void createXMLFile()
        {
            Excel.Application xlApp = new Microsoft.Office.Interop.Excel.Application();

            if (xlApp == null)
            {
                MessageBox.Show("Excel is not properly installed!!");
                return;
            }

            object misValue = System.Reflection.Missing.Value;

            xlWorkBook = xlApp.Workbooks.Add(misValue);
            xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1);

            xlWorkSheet.Cells[1, 1] = "Stroke";
            xlWorkSheet.Cells[1, 2] = "Force";

             xlWorkBook.SaveAs(filePath, Excel.XlFileFormat.xlWorkbookNormal, AccessMode: Excel.XlSaveAsAccessMode.xlExclusive);
            xlWorkBook.Close(true, misValue, misValue);
            xlApp.Quit();

            Marshal.ReleaseComObject(xlWorkSheet);
            Marshal.ReleaseComObject(xlWorkBook);
            Marshal.ReleaseComObject(xlApp);

            MessageBox.Show("Excel file created , you can find the file     
D:\\Work\\ExtractData\\DataCharts");
}

【问题讨论】:

  • 这能回答你的问题吗? Closing Excel Application Process in C# after Data Access。而且您应该以 99 票而不是 1 票来关注答案
  • 嗯,你有一些 .NET 挂在上面的临时对象。我建议明确地使它们成为对象,然后也对它们调用 ReleaseComObject。您可能不知道临时对象,但 xlApp.Workbooks 是一个临时对象。 xlWorkbook.Worksheets 和 xlWorksheet.Cells 也是如此。我在 .NET / COM 互操作方面的经验以及试图避免将 COM 进程锁定在内存中的经验表明,要明确这些临时对象,使用它们,然后在它们上使用 ReleaseComObject。

标签: c# excel com


【解决方案1】:

试试这个方法……

Microsoft.Office.Interop.Excel.Application xlApp = null;
Microsoft.Office.Interop.Excel.Workbook xlWorkBook = null;
try {
  // code that works with excel…
}
catch (Exception ex) {
  MessageBox.Show("Excel Error " + ex.Message);
}
finally {
  if (xlWorkBook != null) {
    xlWorkBook.Close();
    Marshal.ReleaseComObject(xlWorkBook);
  }
  if (xlApp != null) {
    xlApp.Quit();
    Marshal.ReleaseComObject(xlApp);
  }
  //GC.Collect();
}

编辑……每个 OP 评论……

我猜你可能误解了任务管理器发布的内容。对于初学者,.NET 使用垃圾收集器来管理其未使用的内存。如果你想“立即”摆脱似乎在任务管理器中挥之不去的 Excel 的倍增实例,请直接调用 .NET 垃圾收集器……

GC.Collect();

但是……我不推荐这个。

如果您退出应用程序,那么所有实例都将被释放。如果应用程序继续运行,则通常至少会保留一个 Excel 实例。但是,当应用程序运行时......如果垃圾收集器已经有足够的内存,通常它不会从应用程序中释放这些内存,这是有道理的。

因此,即使它仍然出现在任务管理器中,但如果推送到了紧要关头并且需要内存,它会释放它。这里就是这种情况。当然,可能有许多 Excel 实例正在运行……如果您多次运行代码而不退出应用程序……Excel 应用程序将“最终”发布。在我的测试中,通常在大约 10-20 个应用程序运行后,它们都会被释放,并且会下降到一两个 Excel 实例。然后它会再次增长。这是垃圾收集器的工作。

调用上面的垃圾收集器Collect 代码将“立即”释放应用程序,但是,我会说要小心。不建议您这样做。所以,我说在这里自取毒药。

【讨论】:

  • 不工作..进程仍在后台运行。
猜你喜欢
  • 2013-10-19
  • 2019-03-03
  • 1970-01-01
  • 2015-01-11
  • 1970-01-01
  • 2023-01-24
  • 2011-10-21
  • 1970-01-01
相关资源
最近更新 更多