WebBrowser開啟Word文件的一些注意事項
忙乎了多日,終於將WebBrowser中Word工具欄中搞定
在題庫管理系統中,需要將試題顯示出來,並進行編輯。於是,每道題都儲存為一個Word檔案,並儲存在SQL Server中,在瀏覽試題庫時,用WebBrowser控制元件顯示試題是最好的方法,有直觀的Word操作介面,也為試題儲存提供了方便。
一開始是使用VS 2005中內建的Web Browser控制元件來顯示。顯示正常,但很快帶來兩個問題:
1、預設開啟時是有“審閱”工具欄,如何在剛開啟時就具有“常用”工具欄。
2、沒有辦法找到對應的文件物件,以控制Word檔案的儲存。
在網上搜了一大堆,都是提到要使用COM物件axWebBrowser控制元件,包括MSDN上的這篇文章:“如何使用 WebBrowser 控制元件在 Visual C# 2005 或 Visual C# .NET 中開啟 Office 文件”(
第一步:新增axWebBrowser控制元件到工具箱。
在工具箱上,單擊右鍵,使用選擇項,在COM元件中找到“Microsfot Web Browser”項,確定即可。
第二步,向窗體上新增“Microsfot Web Browser”控制元件,這個地方命名為wbDocView
第三步,需要使用WebBrowser控制元件載入Word文件時,使用以下語句:
wbDocView.Nagivate(yourfilename);
遇到的第一個問題:開啟第一個檔案時可以,再次開啟同一檔案時,由於檔案仍屬性於開啟狀態,無法再次開啟。窗體關閉時並不會主動關閉該檔案,它要等到整個程式退出時才釋放資源。
解決辦法:在窗體的FormClosing事件中,使用下列語句關閉檔案:
wbDocView.Navigate("about:blank");
解決第二個問題,開啟Word檔案時,顯示常用工具欄。MSDN 304662中介紹的是:
Object refmissing = System.Reflection.Missing.Value;
oDocument = null;
axWebBrowser1.Navigate(strFileName, ref refmissing , ref refmissing , ref refmissing , ref refmissing);
我按照同樣的方法做時,總是出現“試圖吊銷一個未註冊的拖放目標 (異常來自 HRESULT:0x80040100 (DRAGDROP_E_NOTREGISTERED))”的錯誤。很長時間不能解決。
後來,在WebBrowser控制元件的NavigateComplete2事件中寫入以下程式碼:
axWebBrowser1.Navigate(strFileName, ref refmissing , ref refmissing , ref refmissing , ref refmissing);
果然,“審閱”工具欄不再出現了,取而代之的是有“常用”、“字型”和“繪圖”三個工具欄。暫時不管它了,以後再深入研究。
解決第三個問題:適當的時候如何儲存Word檔案?
同樣,在NavigateComplete2事件中,寫入以下程式碼以獲取Document物件。
object o = e.pDisp;
oDocument = o.GetType().InvokeMember("Document", System.Reflection.BindingFlags.GetProperty, null, o, null);
這裡的oDocument是定義在窗體類中的一個私有欄位:object oDocument = null;
接下來,在“儲存”按鈕的Click事件中,用以下程式碼:(此時需要引入Office類庫)
object missing = System.Reflection.Missing.Value;
Microsoft.Office.Interop.Word.DocumentClass doc = oDocument as Microsoft.Office.Interop.Word.DocumentClass;
doc.Save();
此時,窗體上的WebBrowser控制元件會處於假死狀態,這時重新載入這個檔案就可以了:
wbDocView.Navigate(wbDocView.LocationURL);
雖然載入過程會有明顯的停頓與閃爍,但暫時不管它了。