在我创建并关闭 C#4.0 中的 Excel 文件后,Excel 仍在任务管理器中运行

本文关键字:Excel 文件 运行 任务管理器 中的 创建 C#4 | 更新日期: 2023-09-27 18:31:27

创建 Excel 文件后,我从任务管理器释放 Excel 时遇到问题,请从 C# 保存并关闭它。

我使用以下代码创建 Excel 实例:

 Microsoft.Office.Interop.Excel.Application xlApp = new Microsoft.Office.Interop.Excel.Application();
Microsoft.Office.Interop.Excel.Workbook workbook = xlApp.Workbooks.Add(Microsoft.Office.Interop.Excel.XlWBATemplate.xlWBATWorksheet);
Microsoft.Office.Interop.Excel.Worksheet worksheet = (Microsoft.Office.Interop.Excel.Worksheet)workbook.Worksheets[1];

然后,我填充我的工作表:

worksheet.Cells[1, 1] = "Test";
worksheet.Cells[1, 2] = "Test";
worksheet.Cells[1, 3] = "Test";
worksheet.Cells[1, 4] = "Test";

之后,我保存工作簿:

workbook.SaveAs(filePath);

然后关闭它:

workbook.Close(false, false);

然后退出 Excel:

xlApp.Quit();

但是在我这样做之后,Excel仍然出现在任务管理器中!?!?

知道为什么在我调用 xlApp.Quit() 后它没有关闭吗?

提前谢谢。

在我创建并关闭 C#4.0 中的 Excel 文件后,Excel 仍在任务管理器中运行

也许您可以尝试删除互操作并使用EPPlus来创建/修改Excel文件。这非常简单,并且不会中继计算机上的Office。

但是,如果您真的想使用 Interop,那么这可能会有所帮助(我一直在我的代码中使用它以确保所有内容都正确处理,因为我必须在几分钟内创建 800+ excel 文件):

        workBook.Close(true, filePathTarget, Missing.Value);
        app.DisplayAlerts = true;
        app.Quit();
        Release(workSheet2);
        Release(workSheet1);
        Release(workBook);
        Release(workBooks);
        Release(app);
        workSheet2 = null;
        workSheet1 = null;
        workBook = null;
        workBooks = null;
        app = null;
        GC.Collect();
        GC.WaitForPendingFinalizers();

哪里:

 private static void Release(object obj) {
        // Errors are ignored per Microsoft's suggestion for this type of function:
        // http://support.microsoft.com/default.aspx/kb/317109
        try {
            System.Runtime.InteropServices.Marshal.FinalReleaseComObject(obj);
        } catch {
        }
    }

但我真的敦促你尝试使用EPPlus,如果你只处理XLSX文件。它工作得很好,它快速高效,并且不会中继正在安装Microsoft Office。在使用它一个小时后,我在 5 分钟后放弃了互操作......

您需要将 xlApp 变量设置为 null 才能释放 COM 引用。可能是 COM 使实例保持打开状态,因为引用计数不为零。

xlApp = null;

我使用了一个process.kill方法,它看起来不干净,但它工作得很好。

dim xlHWND= Xlapp.Hwnd
Dim proc = Process.GetProcessesByName("excel")
For i As Integer = 0 To proc.Count - 1
     If proc(i).MainWindowHandle = xlHWND Then
          proc(i).Kill()
     End If
Next