我是否需要在foreach循环中释放excel工作表对象?

时间:2013-11-04 21:49:58

标签: c# excel interop

我在我的网站项目中使用C#中的Excel互操作来解析excel文件并将其转换为文本文件。示例代码如下。

Excel.Application excel=new Excel.Application();
Excel.Workbooks wbs=excel.Workbooks;
Excel.Workbook wb=wbs.Open(…);

Try 
{
   …
   Foreach(Excel.Worksheet sheet in wb.Sheets)
   {
      …
      Marshal.RealseComObject(sheet);
      sheet=null; //compiler error
   }
   …
}

Catch()
{
}

Finally
{
   wb.Close(false, missing, missing);
   while (Marshal.ReleaseComObject(wb)!=0)
   {
   }
   wb=null;
   while (Marshal.ReleaseComObject(wbs)!=0)
   {
   }
   wbs=null;

   excel.Quit();
   while (Marshal.ReleaseComObject(excel)!=0)
   {
   }
   excel=null;
   GC.Collect();
   GC.WaitForPendingFinalizers();
}

我的问题是我需要在foreach循环中释放工作表对象吗?我看到了一些关于使用excel工作表编程的示例代码,但没有一个代码。如果我确实需要重新启动对象,在我的foreach循环中,我无法将工作表设置为null,这是否意味着我不应该使用foreach?

2 个答案:

答案 0 :(得分:0)

当您将工作表设置为null时,实际上是将wb.sheets设置为null。我不认为Excel对象会允许这样做。

答案 1 :(得分:0)

这就是,你所做的是非常糟糕的主意 - 在网站服务器上使用Office interop。而你的问题与你做错的商业决定完全相关。您可以使用Microsoft.ACE.OleDb.<version>完成所做的工作。使用ACE,您可以像db表一样查询工作簿,这种方法对于互操作来说非常薄。