2010-08-05 85 views
4

我目前託管在.NET(2.0)格式的IE瀏覽器控制,並用它來加載Office文件,如Excel和Word正是如此:在自定義應用中託管MS Office文檔的更好選擇?

_ieCtrl.Navigate("C:\\test.xls", False); 

託管和裝載工作得很好,除了每當我瀏覽到一個文件,我會看到一個對話框,詢問我是要保存還是打開文件。 (這是標準的IE文件下載行爲。)我總是想打開它,我不想顯示對話框。

另一個問題是,當我關閉託管IE控件和Office文檔的窗口時,文檔不會關閉並保持在磁盤上打開。這意味着後續嘗試通過我的應用程序或本地辦公應用程序打開同一文件將因共享衝突而失敗。

是否有編程避免此對話框並清理資源後的方式?我正在尋求一個程序化的答案,因爲網絡研究只產生了需要修改操作系統級設置的解決方案。

賞金注:

我願意接受任何解決這個問題,讓我到:

  • 主機Excel電子表格中我的應用程序內
  • 工作,而透明(避免可用性像上面描述的問題)
  • 避免必須作出任何操作系統特定的更改,可能會影響其他應用程序(特別是包含IE)
  • 是額外的成本爲零(無許可的第三方庫請)代碼項目以及其他開放源代碼資源OK
  • 再浪費時間與DSO成幀器ActiveX控件,除非一個穩定的版本開發/發現

回答

0

如果你想打開一個單獨的Excel實例(沒有嵌入WebBrowser控件)的文件,你可以簡單地調用

Process.Start(@"C:\Test.xls"); 
+0

這樣會很好,但最終產品是需要將單個表單中的多種不同類型的數據進行分組的各種儀表板,因此我需要託管一個能夠顯示MS Office文檔的控件。 (對於允許相同類型的託管的解決方法的想法是受歡迎的。) – 2010-08-05 16:10:14

2

這是一個可怕的黑客,只應被視爲最後的手段:SendKeys.Send("{O}");

http://msdn.microsoft.com/en-us/library/system.windows.forms.sendkeys%28VS.71%29.aspx

類似的東西來
_ieCtrl.Navigate("C:\\test.xls", False);
(code to sleep or wait may be needed here)
SendKeys.Send("{O}");

基本上,你發送的 「O」 鍵到對話框所以它按下 「打開」 選項。您正在模擬鍵盤按下以單擊「打開」按鈕。這是hackey,因爲

  • 1)您可能需要等待 之間的電話。如果您在 之前發送了o鍵,則對話框將會失效。 希望導航調用完成時,彈出對話框(不知道在C#中的控制行爲)。您可能需要試驗時間,因爲不同的計算機打開速度會更快\更慢
  • 2)如果對話框未在 計算機上顯示,您將在其中插入「o」s 。這可能會導致 退出時出現問題,因爲它可能會彈出另一個對話框來嘗試並保存更改的 。可以通過以只讀模式打開它來阻止此問題
  • 3)不同的版本或窗口可能需要不同的sendkeys命令。例如,您可能需要發送「O」和他們的「{}輸入」鍵
  • 4)可能更:)
+0

你介意在此擴展嗎?例如。更多的代碼,文檔鏈接等。現在有一個賞金,無論是否破解,到目前爲止您的解決方案是最好的選擇。 ;-) – 2010-08-09 16:47:38

+0

增加了一些細節 – bugtussle 2010-08-09 16:54:38

+1

也許而不是睡覺我可以進入一個嚴密的循環尋找一個窗口打開後,我打電話導航?這應該比等待一段任意時間段更加穩定和確定,然後盲目地將點擊發送到最頂層的任何窗口? – 2010-08-09 18:20:57

3

是您的意向用戶能夠使用的Excel文件的工作以Excel-ish的方式(即列,行,公式等),可能會挽救它?如果是這種情況,我不明白如何在不依賴COM對象的Excel對象模型或通過集成第三方庫來處理Excel表格的情況下很好地解決這個問題。我知道你說過沒有付費的解決方案,但是有一些功能豐富的第三方控件僅用於處理應用程序中的Excel文件。

我在您的評論中注意到SLaks最終產品是「各種儀表板」。如果您打算設計自定義儀表板應用程序,是否考慮過解析Excel文件以提取數據,然後在您的應用程序中以邏輯方式呈現數據。這消除了直接顯示和使用Excel 文件的需求,同時仍允許您在該文件內使用數據。如果您試圖獲取文件以外的數據,這裏有兩種方法:

  • 您可能會考慮使用Excel對象模型和COM互操作將Excel文件中的數據讀入您的應用程序。當然,這包括對正在安裝的Excel的依賴,但這是一種可能性。 This article有一些很好的代碼可以用這種方式讀取Excel文件。
  • 更好的方法可能是使用不依賴Excel的庫安裝在本地系統上。 This answer建議使用CodePlex上提供的Excel Data Reader library

我知道這個答案側步你原來的「在[A]自定義應用程序託管MS Office文檔,」答案,但在什麼情況下,你在是數據的Excel文件裏面真的有興趣,希望這個答案會有幫助。

+0

偉大的選項,謝謝!我會檢查出來。此外,依賴於正在安裝的Excel並不是一個真正的問題。如果我能避免它,那麼很好,如果不是,那不算什麼大事。 – 2010-08-11 14:14:00

+0

@Paul任何時候我已經將Excel數據讀入.NET(這已經很少見了),我依賴於Excel互操作庫。但是,即使您計劃部署應用程序的每臺計算機上都可以使用Excel,仍需要注意他們正在運行的Excel的版本。我認爲引用的庫是完全不同的,所以如果你需要處理不同的版本,你必須弄清楚如何在運行時處理對不同文件的引用。解決這個問題可能有一個更簡單的方法,但無論哪種方式都很難。 – 2010-08-11 14:38:07

+1

@Paul如果我剛開始,我會首先查看其他與Excel無關的解決方案,看看是否允許我獲取所需的信息,然後查看Excel Interop是否有其他解決方案。 – 2010-08-11 14:38:58

-1

Office was never meant to run in embedded mode,不在網頁或ActiveX文檔主機中。微軟一次又一次地給了我們警告。將dsoframer從知識庫中拖動到跳過Office 2007中的BrowserFlags註冊表項。 儘快移至Office加載項,Excel Web Access或Office Web Apps。

相關問題