如何使用 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 对象,其行为更类似于 ActiveX 控件,而不是传统的 OLE 对象。 与传统的嵌入式对象不同,ActiveX 文档不是设计为较大文档中的包含对象。 相反,它本身就被视为一个完整的文档,该文档只是 (查看,例如使用 Microsoft Internet Explorer) 或在单个资源中收集,并包含其他文档 ((例如 Microsoft Office 绑定器文件) )。 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 窗体项目时,Visual Basic 会向项目添加一个窗体。 该窗体名为 Form1。 表示窗体的两个文件名为 Form1.vb 和 Form1.designer.vb。 在 Form1.vb 中编写代码。 Form1.designer.vb 文件是Windows 窗体设计器写入代码的位置,该代码通过拖放工具箱中的控件来实现执行的所有操作。

创建 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 窗体工具箱。 WebBrowser 控件随文本 资源管理器 一起显示在工具箱中。

    注意 在 Visual Studio 2005 中,无需执行步骤 2。

  3. 使用工具箱,将 WebBrowser 控件、OpenFileDialog 控件和按钮控件添加到 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 Common Dialog Control 和 Microsoft Internet 控件的引用。 单击“确定”将项目添加到工具箱。

  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")
    

将 WebBrowser 控件与 2007 Microsoft Office 计划结合使用时的注意事项

默认情况下,2007 Office 程序不会在 Web 浏览器中打开 Office 文档。 此行为也会影响 WebBrowser 控件。 我们建议在开发打开 2007 Office 文档的应用程序时使用自定义 ActiveX 文档容器而不是 WebBrowser 控件。

对于需要向后兼容 WebBrowser 控件的现有应用程序,可以修改注册表以配置 Internet Explorer。 可以使用此方法将 Internet Explorer 配置为在 Web 浏览器中打开 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 窗体的 OLE 容器控件

927009 尝试在 Windows Internet Explorer 7 中查看 2007 Microsoft Office 程序文档时,将打开一个新窗口