2013-03-19 41 views
1

我正在创建可从数据库数据生成Excel文件的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(); 
    } 
} 

我在做什么错误的,因为应用程序未释放的文件?

回答

1
finally 
{ 
    GC.Collect(); 
    GC.WaitForPendingFinalizers(); 
} 
+0

对不起,我输错了!即时尝试它。 – Lahib 2013-03-19 08:20:52

+0

编辑我的答案 – TalentTuner 2013-03-19 08:22:02

+0

它的工作。我很感激帮助。谢谢 – Lahib 2013-03-19 08:28:21

0

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

+0

我已删除了2条线,它仍然不释放最后生成的文件。 – Lahib 2013-03-19 08:17:13

0

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

xlApp = null; 
xlWorkBook = null; 

这是否解决了问题?

+0

立即尝试。并没有解决这个问题。它仍然锁定最后生成的文件 – Lahib 2013-03-19 08:18:58

2

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

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

我发现这个链接一个巨大的资源,当我在做的Excel互操作 How do I properly clean up Excel interop objects?

+0

感谢您的链接。感谢帮助 – Lahib 2013-03-19 08:28:49