为什么这个Using()给我一个错误?

时间:2011-08-25 13:53:12

标签: c# excel interop using

我正在尝试打开一个(实际上有数百个)excel文件。我打开应用程序但想要在我打开的每个工作簿周围使用Using()功能。为什么会导致错误?

using (Excel.Workbook wbXL = appXL.Workbooks.Open(_sourceFullPath, Type.Missing, Excel.XlFileAccess.xlReadOnly))
{
    //stuff with wbXL
}

使用获取红色下划线并说“'Microsoft.Office.Interop.excel.Workbook':在using语句中使用的类型必须可以隐式转换为'System.IDisposable'。

如何使这项工作?

5 个答案:

答案 0 :(得分:30)

几乎所说的 - 你只能将using与实现IDisposable的类一起使用,以便编译器知道在最终确定时调用哪个函数 - yourclass.Dispose()。 Excel互操作类不实现此功能。

所以你有两个选择:

  1. 为实现IDispose的Excel.Workbook编写自己的包装类,并将对象本身暴露给调用方法,或者包装这些方法,例如。

    public class DisposableWorkbook : IDisposable
    {
        private Excel.Workbook _workbook = null;
    
        public DisposableWorkbook(Excel.Application appXL, String path,
                                  NotSureOfType otherArgument,
                                  Excel.XlFileAccess access)
        {
            _workbook = appXL.Workbooks.Open(path, otherArgument, access);
        }
    
        public Excel.Workbook Workbook
        {
            get { return _workbook; }
        }
    
        public void Dispose()
        {
            if (workbook != null)
            {
                workbook.Close(Excel.XlSaveAction.xlDoNotSaveChanges,
                               workbookToClose);
                workbook = null;
            }
        }
    }
    
    using (DisposableWorkbook dwbXL = new DisposableWorkbook(appXL,
              _sourceFullPath, Type.Missing, Excel.XlFileAccess.xlReadOnly))
    {
         Excel.Workbook wbXL = dwbXL.Workbook;
         // stuff with wbXL
    }
    
  2. 自己实施using,例如

    Excel.Workbook wbXL = null;
    try
    {
        wbxl = appXL.Workbooks.Open(_sourceFullPath, Type.Missing,
                                    Excel.XlFileAccess.xlReadOnly);
        //stuff with wbXL
    }
    finally
    {
        if (wbxl != null) wbxl.Close();
    }
    

答案 1 :(得分:2)

using语句中的任何项都必须实现IDisposable接口。我还没有提供文档,但我猜测Excel.Workbook没有实现此接口。

答案 2 :(得分:1)

using Statement (C# Reference)

  

提供方便的语法,确保正确使用   IDisposable对象。

Excel.Workbook没有实现IDisposable,因此您无法使用using

答案 3 :(得分:1)

你不能让它发挥作用。

using块用于尽可能快速,安全地从实现IDisposable接口的对象中释放资源。

Excel.Workbook未实现IDisposable,因此您无法将其声明为在using块中使用。

答案 4 :(得分:-1)

Businessmanger emb = new Businessmanger();
        try
        {


            TempData["deparmentList"] = Deplist;
            return PartialView("create");
        }
        catch (Exception)
        {


            throw;
        }
        finally {
            //object dispose here
                            ((IDisposable)emb).Dispose();
        }