Checking if an Excel Workbook is open
Try this:
try
{
Stream s = File.Open(FileName, FileMode.Open, FileAccess.Read, FileShare.None);
s.Close();
return true;
}
catch (Exception)
{
return false;
}
This will tryand open the file exclusively. If the file is already open it will throw an exception, where you can then (try to) close it and carry on.
The right way is to examine the Application.Workbooks object. In VBA you would write:
Dim wb as Workbook
On Error Resume Next '//this is VBA way of saying "try"'
Set wb = Application.Workbooks(wbookName)
If err.Number = 9 then '//this is VBA way of saying "catch"'
'the file is not opened...'
End If
In other words, Workbooks is an array (or in VBA terms, Collection) of all open workbooks.
In C# the following code works:
static bool IsOpened(string wbook)
{
bool isOpened = true;
Excel.Application exApp;
exApp = (Excel.Application)System.Runtime.InteropServices.Marshal.GetActiveObject("Excel.Application");
try
{
exApp.Workbooks.get_Item(wbook);
}
catch (Exception)
{
isOpened = false;
}
return isOpened;
}
You will probably want to pass the reference to Excel.Application yourself.