使用 Excel COM 创建后关闭 Excel 进程

Closing Excel process after creating using Excel COM

下面的代码创建了一个损坏的 file/read-only 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");
}

试试这个方法…

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 实例。但是,当应用程序正在 运行ning 时...如果应用程序已经有足够的内存,垃圾收集器通常不会从应用程序释放此内存,这是有道理的。

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

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