I am trying to open an (hundreds actually) excel file(s). I open the application but want to use the Using() functionality around each of the workbooks I open. Why is this resulting in an error?
using (Excel.Workbook wbXL = appXL.Workbooks.Open(_sourceFullPath, Type.Missing, Excel.XlFileAccess.xlReadOnly))
{
//stuff with wbXL
}
using gets the red underline and says "'Microsoft.Office.Interop.excel.Workbook':Type used in a using statement must be implicitly convertible to 'System.IDisposable'.
How to make this work?
You can prevent these indicators from being displayed by using the following procedure. In Excel 2016, Excel 2013, and Excel 2010: Click File > Options >Formulas. > Excel Options > Formulas. Under Error Checking, clear the Enable background error checking check box.
Often #VALUE! occurs because your formula refers to other cells that contain spaces, or even trickier: hidden spaces. These spaces can make a cell look blank, when in fact they are not blank.
Pretty much what it says - you can only use using
with classes that implement IDisposable, so that under the covers the compiler knows which function to call on finalisation - yourclass.Dispose()
. The Excel interop classes don't implement this.
So you've got two choices:
Write your own wrapper class for Excel.Workbook that implements IDispose and either exposes the object itself to call methods on, or wraps those methods too, e.g.
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
}
Implement using
yourself, e.g.
Excel.Workbook wbXL = null;
try
{
wbxl = appXL.Workbooks.Open(_sourceFullPath, Type.Missing,
Excel.XlFileAccess.xlReadOnly);
//stuff with wbXL
}
finally
{
if (wbxl != null) wbxl.Close();
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With