2017-12-03 240 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