2013-03-19 29 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