我有一個加載在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