我正在尝试打开一个(实际上有数百个)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'。
如何使这项工作?
答案 0 :(得分:30)
几乎所说的 - 你只能将using
与实现IDisposable的类一起使用,以便编译器知道在最终确定时调用哪个函数 - yourclass.Dispose()
。 Excel互操作类不实现此功能。
所以你有两个选择:
为实现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
}
自己实施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();
}