我有一个加载在excel文件中进行分析的winforms应用程序。目前,为了打开excel文件,文件不能在excel中打开,否则当我尝试加载文件时会抛出FileIOException异常。如何打开在另一个应用程序中打开的文件
我想要做的是让我的应用程序读取文件,即使它是在Excel中打开,而不是强迫用户先关闭工作表。请注意,有问题的应用程序只需要读取文件,而不是写入文件。
这可能吗?
我有一个加载在excel文件中进行分析的winforms应用程序。目前,为了打开excel文件,文件不能在excel中打开,否则当我尝试加载文件时会抛出FileIOException异常。如何打开在另一个应用程序中打开的文件
我想要做的是让我的应用程序读取文件,即使它是在Excel中打开,而不是强迫用户先关闭工作表。请注意,有问题的应用程序只需要读取文件,而不是写入文件。
这可能吗?
你可以尝试通过FileShare.ReadWrite打开文件时:
using (var stream = new FileStream(
@"d:\myfile.xls",
FileMode.Open,
FileAccess.Read,
FileShare.ReadWrite))
{
}
你如何打开文件?
如果您试图打开它进行读取/写入,您将得到异常。如果你试图打开它只读,那么你应该没问题。
var file = File.Open("file.xls", FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
如果Excel中打开了文件,FileShare.Read
设置为允许其他应用程序(即你的)能够访问到文件中时才工作。如果未设置,则Excel将打开具有独占访问权限的文件。注意:我不认为这是事实,因为如果有人打开Excel文件(在Excel中)以供阅读,则可以进行编辑。
UPDATE - 好的,我在darin的评论后才正确地测试过这个。您需要FileShare.ReadWrite
标志,尽管有帮助表明它是用于后续文件的开启者。甚至连FileShare.Read
都不够好,我甚至觉得它很奇怪。
尝试使已经打开的文件的副本,阅读并丢弃。为了检查文件是否已经打开,请尝试通过执行复制,读取和放弃来读取和处理异常。
可以在Excel打开工作簿时读取工作簿。下面是我们用来做(注意,我们开场后锁定整个文件,以保持Excel或任何其他应用程序的编写,而我们在阅读中)的代码:
stream = new System.IO.FileStream(path,
System.IO.FileMode.Open,
System.IO.FileAccess.Read,
System.IO.FileShare.ReadWrite,
SG.CompoundDocumentIO.Storage.OpenBufferLength);
try
{
stream.Lock(0, stream.Length);
}
catch
{
// .NET 1.1 requires cast to IDisposable
((IDisposable)stream).Dispose();
throw;
}
声明:我自己的SpreadsheetGear LLC
这是不正确的。使用FileShare.Read意味着:“只有在任何先前的打开程序将其打开以便读取时才打开此文件。”事实并非如此,因为Excel打开了它的文字。 – 2009-06-26 09:43:25
@darin - 我没有使用FileShare。 – ChrisF 2009-06-26 09:45:24