如何在 Visual Basic 中使用 WebBrowser 控制項開啟 Office 檔

如需本文的 Microsoft Visual C# 2005 和 Microsoft Visual C# .NET 版本,請 參閱304662

摘要

您可能想要直接在 Microsoft Visual Basic 表單上顯示或內嵌 Microsoft Office 檔。 Microsoft Visual Basic 2005 和 Visual Basic .NET 不提供可讓您在表單中內嵌 Office 檔的 OLE 控制項。 如果您想要在 Visual Basic 表單中內嵌現有檔,並將其開啟為就地 ActiveX 檔物件,則可能的解決方案是使用 WebBrowser 控制項。

本文示範如何使用 WebBrowser 控制項流覽至現有的 Office 檔,並以 Visual Basic 表單顯示檔。

其他相關資訊

ActiveX 檔是可內嵌的 OLE 物件,其行為比傳統 OLE 物件更像 ActiveX 控制項。 不同于傳統的内嵌物件,ActiveX 檔的設計不是較大檔中包含的物件。 相反地,它本身會被視為一份完整的檔,而該檔只會 (,例如使用 Microsoft Internet Explorer) 或在單一資源中收集,並與其他檔一起收集, (例如 Microsoft Office Binder 檔案) 。 裝載于 WebBrowser 控制項中的 ActiveX 檔一律為使用中;因此,不同于傳統的 OLE 内嵌物件,就地啟用沒有任何意義。

雖然 Microsoft Visual Basic .NET 和 Visual Basic 2005 目前不支援直接裝載 ActiveX 檔,但您可以針對此目的使用 WebBrowser 控制項。 WebBrowser 控制項 (Shdocvw.dll) 是 Internet Explorer 的一部分,只能在已安裝 Internet Explorer 的系統上使用。

建立開啟 Office 檔的 Visual Basic 應用程式

注意事項

當您使用上述兩種方法來建立開啟 Office 檔的 Visual Basic 應用程式時,您必須在 Visual Studio 2005 中變更程式碼。 根據預設,當您建立Windows Forms專案時,Visual Basic 會將一個表單新增至專案。 表單名為 Form1。 代表表單的兩個檔案名為 Form1.vb 和 Form1.designer.vb。 您可以在 Form1.vb 中撰寫程式碼。 Form1.designer.vb 檔案是Windows Forms設計工具撰寫程式碼的位置,該程式碼會實作您從 [工具箱] 拖放控制項所執行的所有動作。

建立 Visual Basic 應用程式之後,請按 F5 執行專案。 當您按一下 [流覽] 時,[ 啟] 對話方塊隨即出現,並可讓您流覽至 Word、Excel 或 PowerPoint 檔案。 選取任何檔案,然後按一下 [ 開啟]。 檔會在 WebBrowser 控制項內開啟,並顯示 Office 檔案伺服器名稱的訊息方塊隨即出現

方法 1

  1. 在 Microsoft Visual Studio 2005 或 Microsoft Visual Studio .NET 中,使用 Visual Basic 2005 或 Visual Basic .NET 建立 Windows 應用程式專案。 根據預設,會建立 Form1。

  2. 在 [ 工具] 功能表上,按一下 [自訂工具箱 ] 以開啟 [ 自訂工具箱 ] 對話方塊。 在 [ COM 元件] 索引 標籤上,新增 Microsoft WebBrowser的參考。 按一下[確定] 將 WebBrowser 控制項新增至 [Windows Forms] 工具箱。 WebBrowser 控制項隨即出現,工具箱中包含 [ 總管 ] 文字。

    注意 在 Visual Studio 2005 中,您不需要執行步驟 2。

  3. 使用 [工具箱],將 WebBrowser 控制項、OpenFileDialog 控制項和 Button 控制項新增至 Form1。 此步驟會將 AxWebBrowser1 成員變數、OpenFileDialog1 成員變數和 Button1 成員變數新增至 Form1 類別。

  4. 在 Form1 類別中定義私用成員,如下所示。

    Dim oDocument as Object
    
  5. 在 Form1 類別中貼上下列程式碼。

    Private Sub Button1_Click(ByVal sender As System.Object, _
       ByVal e As System.EventArgs) Handles Button1.Click
    
    Dim strFileName As String
    
    'Find the Office document.
        With OpenFileDialog1
            .FileName = ""
            .ShowDialog()
            strFileName = .FileName
        End With
    
    'If the user does not cancel, open the document.
        If strFileName.Length Then
            oDocument = Nothing
            AxWebBrowser1.Navigate(strFileName)
        End If
    
    End Sub
    
    Private Sub Form1_Load(ByVal sender As Object, ByVal e As _
       System.EventArgs) Handles MyBase.Load
    
    Button1.Text = "Browse"
    
    With OpenFileDialog1
            .Filter = "Office Documents " & _
            "(*.doc, *.xls, *.ppt)|*.doc;*.xls;*.ppt"
            .FilterIndex = 1
        End With
    
    End Sub
    
    Private Sub Form1_Closing(ByVal sender As Object, ByVal e As _
       System.ComponentModel.CancelEventArgs) Handles MyBase.Closing
    
    oDocument = Nothing
    
    End Sub
    
    Private Sub AxWebBrowser1_NavigateComplete2(ByVal sender As Object, _
       ByVal e As AxSHDocVw.DWebBrowserEvents2_NavigateComplete2Event) _
       Handles AxWebBrowser1.NavigateComplete2
    
    On Error Resume Next
    
    oDocument = e.pDisp.Document
    
    'Note: You can use the reference to the document object to
        '      automate the document server.
        MsgBox("File opened by: " & oDocument.Application.Name)
    
    End Sub
    

方法 2

  1. 在 Microsoft Visual Studio 2005 或 Microsoft Visual Studio .NET 中,使用 Visual Basic 2005 或 Visual Basic .NET 建立 Windows 應用程式專案。 根據預設,會建立 Form1。

  2. 從 [專案] 功能表中,選取 [元件] 以開啟 [元件] 對話方塊。 在 [元件] 對話方塊中,新增 Microsoft 通用對話方塊控制項和 Microsoft 網際網路控制項的參考。 按一下 [確定] 將專案新增至工具箱。

  3. 將 WebBrowser 控制項、CommonDialog 控制項和 CommandButton 的實例新增至 Form1。

  4. 接下來,將下列程式碼新增至 Form1 的 [程式碼] 視窗:

    Option Explicit
    
    Dim oDocument As Object
    
    Private Sub Command1_Click()
       Dim sFileName As String
    
     ' Find an Office file...
       With CommonDialog1
          .FileName = ""
          .ShowOpen
          sFileName = .FileName
       End With
    
     ' If the user didn't cancel, open the file...
       If Len(sFileName) Then
          Set oDocument = Nothing
          WebBrowser1.Navigate sFileName
       End If
    End Sub
    
    Private Sub Form_Load()
       Command1.Caption = "Browse"
       ' For the 2007 Microsoft Office documents, change the .Filter parameter of the 
       ' With CommonDialog1 statement to:
       ' .Filter = "Office Documents " & _
       '      "(*.docx, *.xlsx, *.pptx)|*.docx;*.xlsx;*.pptx"
       With CommonDialog1
          .Filter = "Office Documents " & _
          "(*.doc, *.xls, *.ppt)|*.doc;*.xls;*.ppt"
          .FilterIndex = 1
          .Flags = cdlOFNFileMustExist Or cdlOFNHideReadOnly
       End With
    End Sub
    
    Private Sub Form_Unload(Cancel As Integer)
       Set oDocument = Nothing
    End Sub
    
    Private Sub WebBrowser1_NavigateComplete2(ByVal pDisp As Object, _
    URL As Variant)
       On Error Resume Next
       Set oDocument = pDisp.Document
    
       MsgBox "File opened by: " & oDocument.Application.Name
    End Sub
    

使用 WebBrowser 控制項時的考慮

當您使用 WebBrowser 控制項時,應該考慮下列事項:

  • WebBrowser 控制項會以非同步方式流覽至檔。 當您呼叫 WebBrowser1.Navigate 時,呼叫會在檔完全載入之前,將控制權傳回您的 Visual Basic 應用程式。 如果您打算將包含的檔自動化,您必須使用 NavigateComplete2 事件,以在檔載入完成時收到通知。 使用傳入的 WebBrowser 物件的 Document 屬性來取得 Office 檔物件的參考,在上述程式碼中,該物件會設定為 oDocument。

  • WebBrowser 控制項不支援功能表合併。

  • WebBrowser 控制項通常會先隱藏任何停駐的工具列,再顯示 Office 檔。 您可以使用自動化,使用如下所示的程式碼來顯示浮動工具列。

    With oDocument.Application.CommandBars("Standard")
       .Position = 4 '[msoBarFloating]
       .Visible = True
    End With
    
    

    較新版本的 Internet Explorer (5.0 和更新版本) 也可讓您使用下列程式碼顯示停駐的工具列。

    ' This is a toggle option, so call it once to show the 
    ' toolbars and once to hide them. This works with Internet Explorer 5
    ' but often fails to work properly with earlier versions...
    AxWebBrowser1.ExecWB(SHDocVw.OLECMDID.OLECMDID_HIDETOOLBARS, SHDocVw.OLECMDEXECOPT.OLECMDEXECOPT_DONTPROMPTUSER)
    
  • 在專案中擁有多個 WebBrowser 控制項,以及讓每個控制項載入相同類型的 Office 檔 (,也就是所有 Word 檔或所有 Excel 試算表) ,有幾個已知問題。 建議您針對每個專案只使用一個控制項,並一次流覽至一份檔。

    最常見的問題是 Office 命令列似乎已停用。 如果您在同一個表單上有兩個 WebBrowser 控制項,這兩個控制項都會載入 Word 檔,而且您已使用上述其中一種技術來顯示工具列,則只有一組工具列作用中且運作正常。 另一個已停用且無法使用。

  • 若要清除其目前內容的 WebBrowser,請在其他命令按鈕的 Click 事件中 (或在程式碼) 中的其他適當位置,使用下列程式碼流覽至預設空白頁面:

       AxWebBrowser1.Navigate("about:blank")
    

當您搭配 2007 Microsoft Office 程式使用 WebBrowser 控制項時的考慮

根據預設,2007 Office 程式不會在網頁瀏覽器中開啟 Office 檔。 此行為也會影響 WebBrowser 控制項。 當您開發開啟 2007 Office 檔的應用程式時,建議您使用自訂 ActiveX 檔容器,而不是 WebBrowser 控制項。

對於需要與 WebBrowser 控制項回溯相容的現有應用程式,您可以修改登錄來設定 Internet Explorer。 您可以使用此方法來設定 Internet Explorer,以在網頁瀏覽器中開啟 2007 Office 檔。 如需詳細資訊,請按一下下列文章編號以檢視 Microsoft 知識庫中的文章:

927009 當您嘗試在 Windows Internet Explorer 7 中檢視 2007 Microsoft Office 程式檔時,會開啟新的視窗

注意 如果您使用知識庫文章927009中所述的方法來修改登錄,這些變更會影響您在應用程式中使用的 WebBrowser 控制項。 這些變更也會影響 Internet Explorer 的所有實例。 此外,此方法可能不適用於任何未來的 Microsoft Office 套件版本。 因此,建議您使用此方法只是為了與現有應用程式相容。

參考

如需如何使用 WebBrowser 控制項的詳細資訊,請按一下下列文章編號以檢視 Microsoft 知識庫中的文章:

304562 Visual Studio 2005 和 Visual Studio .NET 不提供適用于 Windows Forms 的 OLE 容器控制項

927009 當您嘗試在 Windows Internet Explorer 7 中檢視 2007 Microsoft Office 程式檔時,會開啟新的視窗