2011-08-30 109 views
1

我正在使用Microsoft.Office.Interop.Excel創建Excel報告與C#。這些報告有大量的圖形,需要很長時間準備。在準備過程中,我的程序使用的Excel應用程序的實例對用戶是隱藏的。防止用戶使用Excel的實例

我的問題是,Microsoft Office傾向於自動共享應用程序實例。如果用戶打開Excel工作簿,則Excel將嘗試查找正在運行的Excel實例並從中打開該文檔。當用戶嘗試在程序運行時打開Excel工作簿時,它會附加到我的程序使用的實例上。

這會產生兩個問題。首先,它使我的報告變得可見,然後才能看到它們。其次,我的程序現在需要與Excel實例關注用戶,而我的程序通常會丟失。

那麼,有什麼辦法讓Excel實例拒絕來自用戶的請求(它應該仍然服從我的程序)來打開文檔,並且讓Office在決定如何打開Excel時忽略我的實例文件?

+2

如果MS沒有從程序中基本運行Excel的完整副本的情況下生成Excel報告,這不是很好嗎? MS產品通常在一起運行得非常好,但辦公文檔生成往往是那些突出顯示爲混亂的東西之一。 – Kibbee

回答

1

您可以處理Application.WorkbookOpen事件。在這裏,請啓動Excel的第二個實例並使其打開工作簿,或者使用錯誤消息關閉工作簿。

我還看到了Application.Interactive屬性。我沒有玩過這個,但它可能對你有用。

+0

那麼,交互屬性不起作用 - 工作簿仍然在我的實例上打開 - 一旦它們打開,它們根本無法觸及。 我會嘗試你的第一個建議。我必須檢查只讀屬性,但還有其他需要查找的內容嗎?例如,用戶嘗試打開的工作簿中的WorkbookOpen事件或從互聯網下載的工作簿(使用「打開」而不是「保存」)? –

+0

將顯示Excel顯示的任何工作簿的事件,而不管它是什麼來源。當您單擊網頁上的「打開」時,瀏覽器實際上將文件保存到臨時文件夾中,然後將其打開,因此與打開本地文件沒有區別。 –

0

我做了一個小實驗,我認爲這會工作:

每當你開始使用Excel時,創建兩個實例,並與第二個工作。當你完成你的工作時,刪除第二個實例及其對象,然後檢查第一個的「UserControl」屬性。如果它返回「true」,那麼只刪除該對象,但留下該實例的進程。如果它返回「false」,那麼也刪除該實例。

據我所知,用戶可以打開和關閉任意數量的工作簿,並且它將使用您創建的第一個實例,只要您不刪除它,並且第二個實例將被取消刪除。