Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 创建和编辑Excel文件后释放该文件_C#_.net_Office Interop - Fatal编程技术网

C# 创建和编辑Excel文件后释放该文件

C# 创建和编辑Excel文件后释放该文件,c#,.net,office-interop,C#,.net,Office Interop,我正在创建一个Windows窗体应用程序,它可以从数据库数据生成Excel文件。在将数据库填充到文件中之后,我打开它并执行宏,保存文件然后关闭它(或者我认为我正在关闭它)。这些文件保存在我的硬盘上,但当生成所有文件时,我必须能够生成一组新文件,因此我必须在生成新文件集之前删除硬盘上的所有旧文件。在运行应用程序一次并尝试生成新的文件集后,出现一个错误,指出其中一个文件(第一批中生成的最后一个文件)被另一个进程使用 这是我的密码: public void RemoveRows_Macro(strin

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

这是我的密码:

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();
    }
} 

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

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

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

xlApp = null;
xlWorkBook = null;

这是否解决了问题?

您希望先释放对象,然后按照与分配对象相反的顺序将其设置为null

 finally
{
    GC.Collect(); 
   GC.WaitForPendingFinalizers();
}
releaseObject(xlWorkBook);
releaseObject(xlApp);
xlWorkBook = null;
xlApp = null;
当我在做Excel互操作时,我发现这个链接是一个很好的资源
我遇到了同样的问题,但我解决了。所以,在我创建了文件之后,我关闭了它

xlWorkbook.SaveAs("nameExcel");
xlWorkbook.Close();

我已经删除了这两行,但它仍然没有释放最后生成的文件。请立即尝试。但这并没有解决问题。它仍然会锁定上次生成的文件。我输入错误!我正在尝试。谢谢你的链接。谢谢你的帮助