2017-12-03 256 views
-1

我正在用C#編寫這個特定的代碼來寫入Excel文件。Excel不會退出C#

public partial class WriteExcelForm : Form 
{ 
    public WriteExcelForm() 
    { 
     InitializeComponent(); 
    } 

    private void writeExcelButton_Click(object sender, EventArgs e) 
    { 
     Microsoft.Office.Interop.Excel.Application xlApp = new Microsoft.Office.Interop.Excel.Application(); 
     if (xlApp == null) 
     { 
      MessageBox.Show("Excel is not installed!!!"); 
      return; 
     } 

     Excel.Workbooks xlWorkBooks = xlApp.Workbooks; 
     Excel.Workbook xlWorkBook = xlWorkBooks.Add(Type.Missing); 
     Excel.Worksheet xlWorkSheet = xlWorkBook.ActiveSheet; 
     xlWorkSheet.Name = "sample"; 

     Excel.Range range1 = (Excel.Range)xlWorkSheet.Cells[1, 1]; 
     range1.Value = "dhiraj"; 

     Excel.Range range2 = xlWorkSheet.Range["A2"]; 
     range2.Value = "dhiraj"; 

     xlWorkBook.SaveAs("C:\\output.xlsx"); 

     //Properly closing the excel app 
     GC.Collect(); 
     GC.WaitForPendingFinalizers(); 

     xlWorkBook.Close(false, Type.Missing, Type.Missing); 
     xlApp.Quit(); 

     Marshal.FinalReleaseComObject(range1); 
     Marshal.FinalReleaseComObject(range2); 
     Marshal.FinalReleaseComObject(xlWorkSheet); 
     Marshal.FinalReleaseComObject(xlWorkBook); 
     Marshal.FinalReleaseComObject(xlWorkBooks); 
     Marshal.FinalReleaseComObject(xlApp); 
    } 
} 

如果我運行這段代碼,excel.exe不會退出,但會一直掛在後臺。

但是,如果我註釋掉這一行

 Excel.Range range1 = (Excel.Range)xlWorkSheet.Cells[1, 1]; 
     range1.Value = "dhiraj"; 

的EXCEL.EXE優雅退出。

我在這裏錯過了什麼?

編輯: 我已經解決了我的問題。發表我的發現作爲答案。

P.S:不知道我爲什麼被拒絕投票,在發佈這個問題之前,我做了很多研究。

+0

@ YowE3K:你是說沒有明確的類型轉換?我曾嘗試過,但最終得到的結果相同。 –

+0

檢查此鏈接:http://www.siddharthrout.com/2012/08/06/vb-net-two-dot-rule-when-working-with-office-applications-2/ - 並消除雙點。還建議您避免使用括號符號來進行類型轉換。 –

+0

看到這個:https://stackoverflow.com/questions/29067714/vsto-manipulating-com-objects-one-dot-good-two-dots-bad - 對於一個櫃檯點。 –

回答

0

所以,我繼續我的研究問這個問題後,我在這個特殊的鏈接找到該特定鏈接 How do I properly clean up Excel interop objects?

現在,它放在一起時三個答案幫了我。

第一個答案是這個特定的一個https://stackoverflow.com/a/158752/2241802 它說避免使用「不要使用COM對象兩點」。

第二個答案是這樣的一個https://stackoverflow.com/a/159419/2241802 這個答案指的是如何在實踐中使用Excel對象,它是遵循這一非常重要的,因爲我不會在我的代碼工作的唯一開發商。

的第三個答案https://stackoverflow.com/a/1893653/2241802 有關如何垃圾收集器的行爲會談的不同之處釋放模式和調試模式。

所以這是我的問題,當我在發佈模式下運行粘貼在問題中的代碼時,它工作正常,並且excel.exe正常退出。

但是,爲了使它在調試模式下工作,我採用了上面的Thrid Answer鏈接的建議,並創建了一個實現了Excel寫入內容的函數。

-1

查找下面的代碼

protected void Button3_Click(object sender, EventArgs e) 
    { 
     int randomvalue = new Random().Next(10); 
     try 
     { 
      filename = Server.MapPath("~/Reports/Tro_Reports" + randomvalue + ".xlsx"); 
      using (var getReportCollection = new DataSet1()) 
      { 
       using (var tableCollection = getReportCollection.Tables["SheetNames"]) 
       { 
        var excelApplication = new Microsoft.Office.Interop.Excel.Application(); 

        try 
        { 
         var wb = excelApplication.Workbooks.Add(); 

         var collection = new Microsoft.Office.Interop.Excel.Worksheet[20]; 

         for (var i = 0; i < tableCollection.Columns.Count; i++) 
         { 
          collection[i] = wb.Worksheets.Add(); 
          collection[i].Name = tableCollection.Columns[i].ToString(); 
         } 
         var thisWorksheet = collection[2]; 
         var thisRange = thisWorksheet.Range["A1"]; 
         thisRange.Value = "Event Summary Report"; 

         wb.SaveAs(filename); 
         wb.Close(); 
        } 
        finally 
        { 
         Marshal.ReleaseComObject(excelApplication); 
        } 
       } 
      } 
     } 
     catch (ExternalException ex) 
     { 

     } 
    } 

上面的代碼片斷將正常關閉您的Excel工作表。

+0

我懷疑線'xlWorkBook.Close(假的,Type.Missing,Type.Missing);'正在關閉工作簿。 – Enigmativity

+0

是的。它可以關閉工作簿。 GC.Collect()之後需要關閉工作簿? – maruthi

+0

調用'GC.Collect的(); GC.WaitForPendingFinalizers();'在OP的代碼中無效。 – Enigmativity