1

我正在创建一个可以从数据库数据生成 Excel 文件的 Windows 窗体应用程序。将数据库填充到文件中后,我打开它并执行一个宏,保存文件然后关闭它(或者我认为我正在关闭它)。这些文件保存在我的硬盘上,但是当所有文件生成时,我必须能够生成一组新文件,因此我必须在生成新文件之前从我的硬盘中删除所有旧文件。在运行应用程序一次并尝试生成新的文件集后,我收到一条错误消息,指出其中一个文件(第一批中生成的最后一个文件)被另一个进程使用。

这是我的代码:

public void RemoveRows_Macro(string fileName)
{

    Microsoft.Office.Interop.Excel.Application xlApp = new Microsoft.Office.Interop.Excel.Application();
    Microsoft.Office.Interop.Excel.Workbook xlWorkBook;
    xlWorkBook = xlApp.Workbooks.Open(fileName);
    //xlApp.Visible = true;
    xlApp.DisplayAlerts = true;

    //Run the macro
    xlApp.Run("RemoveRows", Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
        Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
        Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);

    xlWorkBook.Save();

    xlWorkBook.Close(false);
    xlApp.Quit();
    releaseObject(xlApp);
    releaseObject(xlWorkBook);
}

private void releaseObject(object obj)
{
    try
    {
        System.Runtime.InteropServices.Marshal.ReleaseComObject(obj);
        obj = null;
    }
    catch (Exception ex)
    {
        Console.WriteLine("Error in releasing object :" + ex);
        obj = null;
    }
    finally
    {
        GC.Collect();
    }
} 

由于应用程序没有释放文件,我做错了什么?

4

5 回答 5

2

您可能希望首先释放对象,然后按照分配它们的相反顺序将它们设置为 null。

releaseObject(xlWorkBook);
releaseObject(xlApp);
xlWorkBook = null;
xlApp = null;

我在进行 Excel 互操作时发现此链接是一个很好的资源 如何正确清理 Excel 互操作对象?

于 2013-03-19T08:22:18.930 回答
1
 finally
{
    GC.Collect(); 
   GC.WaitForPendingFinalizers();
}
于 2013-03-19T08:19:19.853 回答
0

我现在无法运行测试,但看起来您在将 xlApp 和 xlWorkBook 传递给 releaseObject 之前将它们设置为 null。之后可能还有其他原因。

于 2013-03-19T08:16:02.313 回答
0

您首先将 xlApp 和 xlWorkBook 设置为 null,然后尝试释放它。尝试注释掉这两行:

xlApp = null;
xlWorkBook = null;

这能解决问题吗?

于 2013-03-19T08:17:10.827 回答
0

我遇到了同样的问题,但我解决了它。因此,在创建文件后,我将其关闭。

xlWorkbook.SaveAs("nameExcel");
xlWorkbook.Close();
于 2020-07-08T08:02:47.760 回答