如何使用 WebBrowser 控件在 Visual C# 2005 或 Visual C# .NET 中打开 Office 文档
2009-04-01 20:01
1066 查看
如何使用 WebBrowser 控件在 Visual C# 2005 或 Visual C# .NET 中打开 Office 文档
察看本文应用于的产品本文的发布号曾为 CHS304662有关本文的 Microsoft Visual Basic .NET 版本,请参阅 304643 (http://support.microsoft.com/kb/304643/ ) 。您可能希望直接在 Microsoft Visual C# 窗体中显示或嵌入 Microsoft Office 文档。Microsoft Visual C# 20...您可能希望直接在 Microsoft Visual C# 窗体中显示或嵌入 Microsoft Office 文档。Microsoft Visual C# 2005 和 Microsoft Visual C# .NET 不提供用于在窗体中嵌入 Office 文档的 OLE 控件。如果希望嵌入现有文档并将其作为 Visual C# 窗体内的就地 ActiveX 文档对象打开,一个可能的解决方案是使用 Microsoft WebBrowser 控件。本文阐述如何使用 WebBrowser 控件在 Visual C# 窗体内浏览到现有 Office 文档并显示它。更多信息
ActiveX 文档是比传统 OLE 对象更像 ActiveX 控件的可嵌入 OLE 对象。与传统嵌入对象不同的是,ActiveX 文档不是作为更大文档中所包含...ActiveX 文档是比传统 OLE 对象更像 ActiveX 控件的可嵌入 OLE 对象。与传统嵌入对象不同的是,ActiveX 文档不是作为更大文档中所包含的对象而设计的。其本身可以算作是仅供查看(如用 Microsoft Internet Explorer 查看)或是与其他文档(如 Microsoft Office 活页夹文件)一起集中到单个资源的完整文档。WebBrowser 控件中承载的 ActiveX 文档始终是活动的;因此,与传统的 OLE 嵌入对象不同,无需就地激活。尽管 Visual C# 2005 和 Visual C# .NET 当前不支持直接承载 ActiveX 文档,但您可以使用 WebBrowser 控件来实现此目的。WebBrowser 控件 (Shdocvw.dll) 是 Internet Explorer 的一部分,并且只能在安装了 Internet Explorer 的系统上使用。创建可打开 Office 文档的 Visual C# 应用程序
要创建可打开 Office 文档的 Visual C# 应用程序,请按照下列步骤操作: 在 Visual C# 2005 或 Visual C# .NET 中新建一个 Windows 应用程序项目。默认情况下创建 Form1。注意:在 Visual C# 2005 中,如果您找不到 SHDocVw.dll 文件或 AxSHDocVw.dll 文件,请在 Visual Studio 命令提示符下运行下面的命令:aximp %WINDIR%/system32/shdocvw.dll然后,为 Microsoft WebBrowser 控件创建公共语言运行库代理 (SHDocVw.dll) 和 Windows 窗体代理 (AxSHDocVw.dll)。若要在 Visual C# 2005 中添加 DLL 文件,请按下列步骤操作: 在“项目”菜单上,单击“添加引用”。在“添加引用”对话框中,单击“浏览”。找到并选择 AxSHDocVw.dll 和 SHDocVw.dll 文件。若要为这两个文件添加项目引用,请单击“确定”。在“工具”菜单上,单击“自定义工具箱”以打开“自定义工具箱”对话框。在“COM 组件”选项卡上,添加一个对“Microsoft WebBrowser”的引用。单击“确定”,将 WebBrowser 控件添加到 Windows 窗体工具箱。WebBrowser 控件会显示出来,并且在工具箱中带有“Explorer”(资源管理器)字样。注意:在 Visual Studio 2005 中,不必执行步骤 2。使用该工具箱向 Form1 添加一个 WebBrowser 控件、一个 OpenFileDialog 控件和一个 CommandButton 控件。这就会向 Form1 类添加“AxWebBrowser1”、“OpenFileDialog1”和“Button1”成员变量。在 Visual C# 2005 中,会添加“webBrowser1”、“openFileDialog1”和“button1”成员变量。在 Form1 上,双击“Button1”。这就会向 Form1 添加”Button1_Click”事件。在 Form1 的代码窗口中,向列表添加以下命名空间:
using System.Reflection;如下所示在 Form1 类中定义一个私有成员:
private Object oDocument;在 Form1 类的“InitializeComponent”方法的末尾,添加以下代码以处理“Form1_Load”、“Form1_Closed”和“axWebBrowser1_NavigateComplete2”事件:
this.axWebBrowser1.NavigateComplete2 += new AxSHDocVw.DWebBrowserEvents2_NavigateComplete2EventHandler(this.axWebBrowser1_NavigateComplete2);this.Load += new System.EventHandler(this.Form1_Load);this.Closed += new System.EventHandler(this.Form1_Closed);将下面的代码
private void button1_Click(object sender, System.EventArgs e){}替换为:
private void button1_Click(object sender, System.EventArgs e){String strFileName;//Find the Office document.openFileDialog1.FileName = "";openFileDialog1.ShowDialog();strFileName = openFileDialog1.FileName;//If the user does not cancel, open the document.if(strFileName.Length != 0){Object refmissing = System.Reflection.Missing.Value;oDocument = null;axWebBrowser1.Navigate(strFileName, ref refmissing , ref refmissing , ref refmissing , ref refmissing);}}public void Form1_Load(object sender, System.EventArgs e){button1.Text = "Browse";openFileDialog1.Filter = "Office Documents(*.doc, *.xls, *.ppt)|*.doc;*.xls;*.ppt" ;openFileDialog1.FilterIndex = 1;}public void Form1_Closed(object sender, System.EventArgs e){oDocument = null;}public void axWebBrowser1_NavigateComplete2(object sender, AxSHDocVw.DWebBrowserEvents2_NavigateComplete2Event e){//Note: You can use the reference to the document object to// automate the document server.Object o = e.pDisp;oDocument = o.GetType().InvokeMember("Document",BindingFlags.GetProperty,null,o,null);Object oApplication = o.GetType().InvokeMember("Application",BindingFlags.GetProperty,null,oDocument,null);Object oName = o.GetType().InvokeMember("Name",BindingFlags.GetProperty ,null,oApplication,null);MessageBox.Show("File opened by: " + oName.ToString() );}注意:您必须在 Visual Studio 2005 中更改此代码。默认情况下,当您创建 Windows 窗体项目时,Visual C# 向该项目添加一个窗体。该窗体被命名为 Form1。表示该窗体的两个文件被命名为 Form1.cs 和 Form1.designer.cs。您在 Form1.cs 中编写代码。Windows 窗体设计器在 Form1.designer.cs 文件中编写代码,这些代码实现通过从工具箱拖放控件所执行的所有操作。有关 Visual C# 2005 中 Windows 窗体设计器的更多信息,请访问下面的 Microsoft Developer Network (MSDN) 网站:http://msdn2.microsoft.com/zh-cn/library/ms173077.aspx (http://msdn2.microsoft.com/zh-cn/library/ms173077.aspx)按 F5 运行该项目。单击“浏览”后,会出现“打开”对话框,您可以使用该对话框浏览到 Word 文档、Excel 工作表或 PowerPoint 演示文稿。选择任一文件,然后单击“打开”。文档在 WebBrowser 控件内打开,并出现一个显示 Office 文档服务器名称的消息框。
![](http://writeblog.csdn.net/library/images/support/en-us/uparrow.gif)
使用 WebBrowser 控件的注意事项
使用 WebBrowser 控件时应考虑以下几点:WebBrowser 控件异步浏览到文档。在调用“WebBrowser1.Navigate”时,该调用会在文档完全加载之前将控制权返回给 Visual C# 应用程序。如果您打算为所包含的文档实现自动操作,则必须使用“NavigateComplete2”事件在文档完成加载后发出通知。使用传入的“WebBrowser”对象的“Document”属性可获得对 Office 文档对象的引用,在前面的代码中,该对象被设置为“oDocument”。WebBrowser 控件不支持菜单合并。在 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.Object refmissing = System.Reflection.Missing.Value;axWebBrowser1.ExecWB(SHDocVw.OLECMDID.OLECMDID_HIDETOOLBARS, SHDocVw.OLECMDEXECOPT.OLECMDEXECOPT_DONTPROMPTUSER,ref refmissing , ref refmissing);几个已知问题:在一个项目中有多个 WebBrowser 控件并且每个控件都加载有相同类型的 Office 文档(即,全部都是 Word 文档或者全部都是 Excel 工作表)。建议一个项目只使用一个控件,并且一次只浏览到一个文档。最常见的问题发生在 Office 命令栏上(命令栏会被禁用)。如果同一个窗体上有两个 WebBrowser 控件,且两个控件都加载有 Word 文档,而您使用了前面某一种技术显示了工具栏,那么只有一组工具栏会是活动的,且只有该工具栏能正常工作。另外一个则被禁用,无法使用。若要清除 WebBrowser 控件的当前内容,请在另一个命令按钮的“Click”事件中(或在代码中的其他某个适当位置),使用下面的代码浏览到默认空白页:
AxWebBrowser1.Navigate("about:blank");
![](http://writeblog.csdn.net/library/images/support/en-us/uparrow.gif)
将 WebBrowser 控件与 2007 Microsoft Office 程序一起使用时的注意事项
默认情况下,2007 Office 程序不会在 Web 浏览器中打开 Office 文档。这种行为也会影响 WebBrowser 控件。我们建议您在开发用于打开 2007 Office 文档的应用程序时使用自定义 ActiveX 文档容器,而不要使用 WebBrowser 控件。 有关自定义 ActiveX 文档容器的更多信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:311765 (http://support.microsoft.com/kb/311765/ ) Visual Basic 或 HTML 中承载 Office 文档的 Visual C++ ActiveX 控件对于要求与 WebBrowser 控件实现向后兼容的现有应用程序,可以更改注册表来配置 Internet Explorer。可以使用此方法来配置 Internet Explorer 以便在 Web 浏览器中打开 2007 Office 文档。 有关更多信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:927009 (http://support.microsoft.com/kb/927009/ ) 尝试在 Windows Internet Explorer 7 中查看 2007 Microsoft Office 程序文档时会打开一个新的窗口注意:如果使用 Microsoft 知识库文章 927009 中提及的方法更改注册表,则更改会影响您在应用程序中使用的 WebBrowser 控件。更改还会影响所有 Internet Explorer 实例。此外,对未来版本的 Microsoft Office 套件,该方法可能不再适用。因为,我们建议您仅将此方法用于对现有应用程序的兼容。![](http://writeblog.csdn.net/library/images/support/en-us/uparrow.gif)
参考
有关使用 WebBrowser 控件的更多信息,请单击下面的文章编号,以查看 Microsoft 知识库中的相应文章: 304562 (http://supp...有关使用 WebBrowser 控件的更多信息,请单击下面的文章编号,以查看 Microsoft 知识库中的相应文章:304562 (http://support.microsoft.com/kb/304562/ ) Visual Studio 2005 和 Visual Studio .NET 不为 Windows 窗体提供 OLE 容器控件243058 (http://support.microsoft.com/kb/243058/ ) 如何使用 WebBrowser 控件打开 Office 文档162719 (http://support.microsoft.com/kb/162719/ ) 如何通过 Visual Basic 5.0 使用 WebBrowser 控件202476 (http://support.microsoft.com/kb/202476/ ) BUG:无法在 OLE 或 WebBrowser 控件中编辑 Word 文档188271 (http://support.microsoft.com/kb/188271/ ) 如何从 VB 打印 Web 浏览器控件的内容191692 (http://support.microsoft.com/kb/191692/ ) PRB:Shdocvw.dll 未包含在 PDW 安装程序包中238313 (http://support.microsoft.com/kb/238313/ ) PRB:从 Visual Basic 访问 Internet Explorer 文档对象模型927009 (http://support.microsoft.com/kb/927009/ ) 尝试在 Windows Internet Explorer 7 中查看 2007 Microsoft Office 程序文档时会打开一个新的窗口![](http://writeblog.csdn.net/library/images/support/en-us/uparrow.gif)
![](http://writeblog.csdn.net/library/images/support/en-us/uparrow.gif)
相关文章推荐
- 如何使用 WebBrowser 控件在 Visual C# 2005 或 Visual C# .NET 中打开 Office 文档
- 如何使用 WebBrowser 控件在 Visual C# 2005 或 Visual C# .NET 中打开 Office 文档
- 如何使用 WebBrowser 控件在 Visual C# 2005 或 Visual C# .NET 中打开 Office 文档
- 如何使用 WebBrowser 控件在 Visual C# 2005 或 Visual C# .NET 中打开 Office 文档
- 如何使用 WebBrowser 控件在 Visual C# 2005 或 Visual C# .NET 中打开 Office 文档
- HOWTO:使用 WebBrowser 控件在 Visual C# .NET 中打开 Office 文档(转贴)
- 如何使用 Visual C# 2005 或 Visual C# .NET 通过 DataSet 对象更新数据库
- 如何使用 Visual C# 2005 或 Visual C# .NET 向 Excel 工作簿传输数据
- 如何使用 Visual C# 2005 或 Visual C# .NET 向 Excel 工作簿传输数据
- 如何使用 Visual C# 2005 或 Visual C# .NET 向 Excel 工作簿传输数据
- 如何使用 Visual C# 2005 或 Visual C# .NET 向 Excel 工作簿传输数据
- 如何使用 Visual C# 2005 或 Visual C# .NET 向 Excel 工作簿传输数据
- 如何使用 Visual C# 2005 或 Visual C# .NET 向 Excel 工作簿传输数据[转载MSDN]
- 如何使用 Visual C# 2005 或 Visual C# .NET 向 Excel 工作簿传输数据
- (转)如何使用 Visual C# 2005 或 Visual C# .NET 向 Excel 工作簿传输数据
- [转载]如何使用 Visual C# 2005 或 Visual C# .NET 向 Excel 工作簿传输数据
- 如何使用 Visual C# 2005 或 Visual C# .NET 向 Excel 工作簿传输数据
- 如何通过使用 ADO.NET 2005 和 Visual C# 2005 或使用 ADO.NET 和 Visual C# .NET 连接到数据库并运行命令
- 如何使用 Visual C# 2005 或 Visual C# .NET 通过 DataSet 对象更新数据库
- 如何使用 Visual C# .NET 对 DataGrid Windows 控件执行分页?