【问题标题】:Problem with closing excel by c#c#关闭excel的问题
【发布时间】:2010-03-24 17:13:07
【问题描述】:

我已经用这段代码进行了单元测试:

  Excel.Application objExcel = new Excel.Application();
            Excel.Workbook objWorkbook = (Excel.Workbook)(objExcel.Workbooks._Open(@"D:\Selenium\wszystkieSeba2.xls", true,
            false, Missing.Value, Missing.Value, Missing.Value,
            Missing.Value, Missing.Value, Missing.Value,
            Missing.Value, Missing.Value, Missing.Value,
            Missing.Value));


            Excel.Worksheet ws = (Excel.Worksheet)objWorkbook.Sheets[1];
            Excel.Range r = ws.get_Range("A1", "I2575");
            DateTime dt = DateTime.Now;
            Excel.Range cellData = null;
            Excel.Range cellKwota = null;
            string cellValueData = null;
            string cellValueKwota = null;
            double dataTransakcji = 0;
            string dzien = null;
            string miesiac = null;
            int nrOperacji = 1;
            int wierszPoczatkowy = 11;
            int pozostało = 526;

            cellData = r.Cells[wierszPoczatkowy, 1] as Excel.Range;
            cellKwota = r.Cells[wierszPoczatkowy, 6] as Excel.Range;


            if ((cellData != null) && (cellKwota != null))
            {

                object valData = cellData.Value2;
                object valKwota = cellKwota.Value2;


                if ((valData != null) && (valKwota != null))
                {
                    cellValueData = valData.ToString();
                   dataTransakcji = Convert.ToDouble(cellValueData);
                   Console.WriteLine("data transakcji to: " + dataTransakcji);
                    dt = DateTime.FromOADate((double)dataTransakcji);
                   dzien = dt.Day.ToString();
                   miesiac = dt.Month.ToString();


                    cellValueKwota = valKwota.ToString();


                }
  }

                       r.Cells[wierszPoczatkowy, 8] = "ok";
            objWorkbook.Save();



            objWorkbook.Close(true, @"C:\Documents and Settings\Administrator\Pulpit\Selenium\wszystkieSeba2.xls", true);
                objExcel.Quit();

为什么在完成测试后我仍然在处理 excel(它没有关闭)

还有:有什么我可以改进以提高性能的吗??

Excel 2007 和 .net 3.5

【问题讨论】:

  • 尝试将集合中项目的访问与集合本身分开。不确定它会解决您的问题,但有时,当您“链接”对对象的访问时,保持匿名的对象(在您的情况下为表格)未正确清理。 Excel.Sheets 工作表 = objWorkbook.Sheets; Excel.Worksheet ws = (Excel.Worksheet)sheets[1];工作簿也一样。

标签: c# excel optimization


【解决方案1】:

我使用这样的代码段来强行关闭它:

    public void DisposeExcelInstance()
    {
        //oXL.DisplayAlerts = false;
        //oWB.Close(null, null, null);
        //oXL.Quit();


        //oWB.Close(null, null, null);
        //oXL.Quit();
        ///KNG - CLEANUP code
        oXL.DisplayAlerts = false;
        oWB.Close(null, null, null);
        oXL.Workbooks.Close();
        oXL.Quit();
        if (oResizeRange != null)
            System.Runtime.InteropServices.Marshal.ReleaseComObject(oResizeRange);
        if (oSheet != null) 
            System.Runtime.InteropServices.Marshal.ReleaseComObject(oSheet);
        if (oWB != null)
            System.Runtime.InteropServices.Marshal.ReleaseComObject(oWB);
        if (oXL != null)
            System.Runtime.InteropServices.Marshal.ReleaseComObject(oXL);
        oSheet = null;
        oWB = null;
        oXL = null;
        GC.Collect(); // force final cleanup!

    }

【讨论】:

  • +1,我可以建议更改为 FinalReleaseComObject 以便更通用,以防有人将代码用于其他用途。
  • 如果对 Excel 对象的所有引用都被释放,则 Excel 将关闭。问题是太容易错过了。在上面的代码中,您错过了 - “oXL.Workbooks.Close()” 行隐式创建了对未发布的“oXL.Workbooks”的引用。我相信最后调用 GC.Collect() 两次会捡起你错过的那些。
【解决方案2】:

也许你的引用计数已关闭: http://support.microsoft.com/kb/317109

【讨论】:

    【解决方案3】:

    除了康侃的回答,还可以尝试使用已有的Excel实例(如果还有未关闭的实例在运行):

            try {
                objExcel = (Excel.Application)Marshal.GetActiveObject("Excel.Application");
            } catch (Exception) {
                if (objExcel == null) {
                    objExcel = new Excel.Application();
                }
            }
    

    【讨论】:

    • 我不明白...为什么要创建新的 excel 流程?在下一次运行测试中,还是什么?
    • 如果您有一个未关闭的 Excel 实例,它将使用上面的示例重新使用。如果没有未关闭的 Excel 实例在运行,则会创建一个新实例。
    【解决方案4】:

    【讨论】:

      猜你喜欢
      • 2015-02-02
      • 2015-11-04
      • 1970-01-01
      • 2021-04-16
      • 2021-12-29
      • 2017-08-20
      • 1970-01-01
      • 2011-05-27
      • 2012-09-26
      相关资源
      最近更新 更多