首页 > 解决方案 > 如何修复实例化 Excel.Application 对象时随机发生的 Excel.Application 错误

问题描述

我有一个 ac# 程序,它打开一个 excel 工作表,用一些数据填充它,并在关闭工作表之前从工作表中检索一些信息。这在循环内发生了好几次。该程序执行了一段时间以完成循环,然后在循环期间随机失败,并出现以下错误:

System.Runtime.InteropServices.COMException (0x80080005):检索具有 CLSID {xxx} 的组件的 COM 类因子失败,原因是以下错误:80080005 服务器执行失败 [HRESULT 异常:0x80080005 (CO_E_SERVER_EXCEC_FAILURE))。

我检查了我对 Microsoft.Office.Interop.Excel 的参考,它是 Microsoft Excel 16.0 对象库版本 1.9.0.0,我安装了 Excel 2016。导致问题的代码类似于以下内容:

for (int i = 0; i < 100; i++)
{
     Excel.Application xlApp;
     Excel.Workbooks xlWorkBooks;
     Excel.Workbook xlWorkBook;
     Excel.Sheets xlWorksheets;
     Excel.Worksheet xlWorkSheet;
     object misValue = System.Reflection.Missing.Value;

     xlApp = new Excel.Application(); //line that causes error

     xlApp.Visible = false;
     xlApp.ScreenUpdating = false;
     xlWorkBooks = xlApp.Workbooks;
     xlWorkBook = xlWorkBooks.Open(IIHSTemplate.Text, 0, false, 5, "", "", true, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "\t", false, false, 0, true, 1, 0);
     xlWorksheets = xlWorkBook.Worksheets;
     xlWorkSheet = xlWorksheets["Automatic-Data-Analysis"];
     IIHSDemerit = Convert.ToDouble((xlWorkSheet.Cells[30, 14] as Excel.Range).Value2);

      xlWorkBook.Close(false, misValue, misValue);
      xlApp.Quit();

      releaseObject(xlWorksheets);
      releaseObject(xlWorkSheet);
      releaseObject(xlWorkBooks);
      releaseObject(xlWorkBook);
      releaseObject(xlApp);
}


private void releaseObject(object obj)
        {
            try
            {
                System.Runtime.InteropServices.Marshal.ReleaseComObject(obj);
                obj = null;
            }
            catch (Exception ex)
            {
                obj = null;
                MessageBox.Show("Exception Occured while releasing object " + ex.ToString());
            }
            finally
            {
                GC.Collect();
                GC.WaitForPendingFinalizers();
            }
        }



我的程序将 excel 数据的结果写入文本文件并执行多次,没有错误。经过随机次数的迭代(每次运行程序时数字不同),程序将失败并出现上面列出的错误。关于导致错误的原因以及如何纠正错误的任何想法?

标签: c#excelinterop

解决方案


解决方案是将 Excel 应用程序对象的实例化和释放移出循环,因为我只需要在循环内打开和关闭工作簿。感谢@SmrtGrunt 在评论中指出这一点。


推荐阅读