Excel不退出C#

时间:2017-12-03 08:17:23

标签: c# excel excel-vba c#-4.0 vba

我在C#中编写这个特殊代码来写入excel文件。

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:不知道为什么我被投了票,在发布这个问题之前我做了很多研究。

2 个答案:

答案 0 :(得分: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 :(得分:-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工作表。