Cómo usar el control WebBrowser para abrir documentos de Office en Visual C# 2005 o en Visual C# .NET

Para obtener una versión de Microsoft Visual Basic .NET de este artículo, consulte 304643.

Resumen

Es posible que quiera mostrar o insertar un documento de Microsoft Office directamente en un formulario de Microsoft Visual C#. Microsoft Visual C# 2005 y Microsoft Visual C# .NET no proporcionan un control OLE que le permite insertar un documento de Office en un formulario. Si desea insertar un documento existente y abrirlo como un objeto de documento ActiveX local en un formulario de Visual C#, una posible solución para usted es usar el control Microsoft WebBrowser.

En este artículo se muestra cómo examinar un documento de Office existente y cómo mostrarlo dentro de un formulario de Visual C# mediante el control WebBrowser.

Más información

Los documentos ActiveX son objetos OLE incrustables que se comportan más como controles ActiveX que los objetos OLE tradicionales. A diferencia de un objeto incrustado tradicional, un documento ActiveX no está diseñado para ser un objeto contenido en un documento mayor. En su lugar, se considera en sí mismo un documento completo que simplemente se está viendo (por ejemplo, con Microsoft Internet Explorer) o que se recopila en un solo recurso con otros documentos (como un archivo binder de Microsoft Office). Siempre está activo un documento ActiveX hospedado en el control WebBrowser; por lo tanto, a diferencia de los objetos incrustados OLE tradicionales, no hay ninguna sensación de activación local.

Aunque Visual C# 2005 y Visual C# .NET no admiten actualmente el hospedaje de documentos ActiveX directamente, puede usar el control WebBrowser para este propósito. El control WebBrowser (Shdocvw.dll) forma parte de Internet Explorer y solo se puede usar en sistemas que tengan instalado Internet Explorer.

Creación de una aplicación de Visual C# que abre documentos de Office

Para crear una aplicación de Visual C# que abra documentos de Office, siga estos pasos:

  1. Cree un nuevo proyecto de aplicación de Windows en Visual C# 2005 o en Visual C# .NET. Form1 se crea de forma predeterminada.

    Nota En Visual C# 2005, si no encuentra el archivo SHDocVw.dll o el archivo AxSHDocVw.dll, ejecute el siguiente comando en el símbolo del sistema de Visual Studio:

    aximp %WINDIR%\system32\shdocvw.dll
    

    A continuación, cree un proxy de Common Language Runtime (SHDocVw.dll) y un proxy de Windows Forms (AxSHDocVw.dll) para el control Microsoft Web Browser. Para agregar los archivos DLL en Visual C# 2005, siga estos pasos:

    1. On the Project menu, click Add Reference.
    2. In the Add Reference dialog box, click Browse.
    3. Busque y seleccione el archivo AxSHDocVw.dll y el archivo SHDocVw.dll.
    4. Para agregar referencias de proyecto para estos dos archivos, haga clic en Aceptar.
  2. En el menú Herramientas, haga clic en Personalizar cuadro de herramientas para abrir el cuadro de diálogo Personalizar cuadro de herramientas. En la pestaña Componentes COM, agregue una referencia a Microsoft WebBrowser. Haga clic en Aceptar para agregar el control WebBrowser al cuadro de herramientas de Windows Forms. El control WebBrowser aparece con el explorador de texto en el cuadro de herramientas.

    Nota En Visual Studio 2005, no es necesario realizar el paso 2.

  3. Con el cuadro de herramientas, agregue un control WebBrowser, un control OpenFileDialog y un control CommandButton a Form1. Esto agrega las variables miembro AxWebBrowser1, OpenFileDialog1 y Button1 a la clase Form1. En Visual C# 2005, se agregan las variables miembro webBrowser1, openFileDialog1 y button1.

  4. En Form1, haga doble clic en Button1. Esto agrega el evento Button1_Click a Form1.

  5. En la ventana de código de Form1, agregue el siguiente espacio de nombres a la lista:

    using System.Reflection;
    
  6. Defina un miembro privado en la clase Form1 de la siguiente manera:

    private Object oDocument;
    
  7. Al final del método InitializeComponent de la clase Form1, agregue el código siguiente para controlar los eventos Form1_Load, Form1_Closed y 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);
    
  8. Reemplace el código siguiente.

    private void button1_Click(object sender, System.EventArgs e)
    {
    }
    
    

    con:

    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() ); 
    }
    
    

    Nota Debe cambiar el código en Visual Studio 2005. De forma predeterminada, Visual C# agrega un formulario al proyecto al crear un proyecto de Windows Forms. El formulario se denomina Form1. Los dos archivos que representan el formulario se denominan Form1.cs y Form1.designer.cs. El código se escribe en Form1.cs. El archivo Form1.designer.cs es donde el diseñador de Windows Forms escribe el código que implementa todas las acciones que ha realizado arrastrando y quitando controles desde el cuadro de herramientas.

    Para obtener más información sobre el Diseñador de Windows Forms en Visual C# 2005, visite el siguiente sitio web de Microsoft Developer Network (MSDN):https://msdn.microsoft.com/en-us/library/ms173077.aspx

  9. Pulse F5 para ejecutar el proyecto. Al hacer clic en Examinar, aparece el cuadro de diálogo Abrir y le permite examinar un documento de Word, una hoja de cálculo de Excel o una presentación de PowerPoint. Seleccione cualquier archivo y, a continuación, haga clic en Abrir. El documento se abre dentro del control WebBrowser y aparece un cuadro de mensaje que muestra el nombre del servidor de documentos de Office.

Qué se debe tener en cuenta al usar el control WebBrowser

Debe tener en cuenta lo siguiente cuando use el control WebBrowser:

  • El control WebBrowser busca documentos de forma asincrónica. Al llamar a WebBrowser1.Navigate, la llamada devuelve el control a la aplicación de Visual C# antes de que el documento se haya cargado por completo. Si planea automatizar el documento contenido, debe usar el evento NavigateComplete2 para recibir una notificación cuando el documento haya terminado de cargarse. Use la propiedad Document del objeto WebBrowser que se pasa para obtener una referencia al objeto de documento de Office, que, en el código anterior, se establece en oDocument.

  • El control WebBrowser no admite la combinación de menús.

  • En las versiones 5.0 y posteriores de Internet Explorer, puede mostrar las barras de herramientas acopladas mediante el código siguiente:

     // 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);
    
  • Hay varios problemas conocidos con tener más de un control WebBrowser en un proyecto y con tener cada control cargado con el mismo tipo de documento de Office (es decir, todos los documentos de Word o todas las hojas de cálculo de Excel). Microsoft recomienda usar solo un control para cada proyecto y buscar un documento a la vez.

    El problema más común es con las barras de comandos de Microsoft Office, que aparecen deshabilitadas. Si tiene dos controles WebBrowser en el mismo formulario, ambos cargados con documentos de Word y si ha mostrado barras de herramientas mediante una de las técnicas anteriores, solo un conjunto de barras de herramientas está activo y funciona correctamente. El otro está deshabilitado y no se puede usar.

  • Para borrar el control WebBrowser de su contenido actual, en el evento Click de otro botón de comando (o en algún otro lugar adecuado del código), vaya a la página en blanco predeterminada mediante el código siguiente:

       AxWebBrowser1.Navigate("about:blank");
    

Qué tener en cuenta al usar el control WebBrowser junto con un programa de Microsoft Office 2007

De forma predeterminada, los programas de Office 2007 no abren documentos de Office en el explorador web. Este comportamiento también afecta al control WebBrowser. Se recomienda usar un contenedor de documentos ActiveX personalizado en lugar del control WebBrowser al desarrollar aplicaciones que abran documentos de Office 2007.

Para las aplicaciones existentes que requieren compatibilidad con versiones anteriores con el control WebBrowser, puede modificar el registro para configurar Internet Explorer. Puede usar este método para configurar Internet Explorer para abrir documentos de Office 2007 en el explorador web. Para obtener más información, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:

927009 Se abre una nueva ventana al intentar ver un documento de programa de Microsoft Office 2007 en Windows Internet Explorer 7

Nota:

Si modifica el registro mediante el método que se menciona en el artículo de Microsoft Knowledge Base 927009, los cambios afectan al control WebBrowser que se usa en la aplicación. Los cambios también afectan a todas las instancias de Internet Explorer. Además, este método puede no funcionar para ninguna versión futura de los conjuntos de aplicaciones de Microsoft Office. Por lo tanto, se recomienda usar este método solo para la compatibilidad con una aplicación existente.

Referencias

Para obtener más información sobre el uso del control WebBrowser, haga clic en los números de artículo siguientes para ver los artículos de Microsoft Knowledge Base:

  • 304562 Visual Studio 2005 y Visual Studio .NET no proporcionan un control de contenedor OLE para Windows Forms

  • 243058 Cómo usar el control WebBrowser para abrir un documento de Office

  • 927009 Se abre una nueva ventana al intentar ver un documento de programa de Microsoft Office 2007 en Windows Internet Explorer 7