【问题标题】:Do I need to release the excel worksheet object in foreach loop? [duplicate]我是否需要在 foreach 循环中释放 excel 工作表对象? [复制]
【发布时间】:2013-11-05 09:14:08
【问题描述】:

我在我的网站项目中使用 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?

【问题讨论】:

标签: c# excel interop


【解决方案1】:

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

【讨论】:

  • 如果我创建一个类似的函数: private void NAR(object o) { try { while (System.Runtime.InteropServices.Marshal.ReleaseComObject(o) > 0) ; } 捕捉 { } 最后 { o = null; } }。我可以将工作表间接设置为 null。
  • 设置为空不会有任何优势恕我直言。你有什么理由想将它设置为空吗?
【解决方案2】:

这就是,你所做的真是个坏主意——在网站服务器上使用Office interop。您的问题与您错误的商业决策完全相关。您所做的,可以通过使用Microsoft.ACE.OleDb.<version> 来完成。使用 ACE,您可以像查询 db 表一样查询您的工作簿,这种方法与互操作相比非常简单。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-04
    • 2011-08-16
    • 1970-01-01
    • 2021-06-24
    • 1970-01-01
    • 1970-01-01
    • 2012-01-22
    • 2011-07-01
    相关资源
    最近更新 更多