Puede que desee mostrar o incrustar directamente un
documento de Microsoft Office en un formulario de Microsoft Visual C#.
Microsoft Visual C# 2005 y Microsoft Visual C# .NET no proporcionan un control
OLE que permita incrustar un documento de Office en un formulario. Si desea
incrustar un documento existente y abrirlo como un objeto de documento ActiveX
en contexto dentro de un formulario de Visual C#, una posible solución
consiste en utilizar el control WebBrowser de Microsoft.
En este artículo se demuestra cómo
buscar un documento de Office existente y mostrarlo dentro de un formulario de
Visual C# con el control WebBrowser.
Los documentos ActiveX son objetos OLE incrustables que se
comportan más como controles ActiveX que como objetos OLE tradicionales. A
diferencia de un objeto tradicional incrustable, un documento ActiveX no está
diseñado para ser un objeto contenido en un documento mayor. En cambio, se
considera como un documento completo que simplemente se está mostrando (como
ocurre con Microsoft Internet Explorer) o que está almacenado en un único
recurso junto con otros documentos (como un archivo del Cuaderno de Microsoft
Office). Un documento ActiveX alojado en el control WebBrowser siempre está activo; por tanto, a diferencia de los objetos OLE
incrustados tradicionales, no hay necesidad de realizar la activación en
contexto.
Aunque Visual C# 2005 y Visual C# .NET no permiten alojar
documentos ActiveX directamente, puede utilizar el control WebBrowser para este propósito. El control WebBrowser (Shdocvw.dll) forma parte de Internet Explorer y sólo se puede
utilizar en sistemas que tengan instalado este programa.
Crear una aplicación de Visual C# .NET que abra documentos de Office
Para crear una aplicación de Visual C# que abra documentos de
Office, siga estos pasos:
Cree un nuevo proyecto de aplicación para Windows en
Visual C# 2005 o en Visual C# .NET. De manera predeterminada se creará
Form1.
En el menú Herramientas, haga clic en Personalizar cuadro de herramientas para abrir el cuadro de diálogo Personalizar cuadro de herramientas. En la ficha 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 aparecerá con el texto Explorador en el cuadro de herramientas.
Nota: en Visual Studio 2005 no tiene que realizar el paso 2.
Con el cuadro de herramientas, agregue un control WebBrowser, un control OpenFileDialog y un control CommandButton a Form1. De esta forma se agregan las variables miembro AxWebBrowser1, OpenFileDialog1 y Button1 a la clase Form1.
En Form1, haga doble clic en Button1. De esta forma se agrega el evento Button1_Click a Form1.
En la ventana de código de Form1, agregue el espacio de
nombres siguiente a la lista:
using System.Reflection;
Defina un miembro privado en la clase Form1 como se indica
a continuación:
private Object oDocument;
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)
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 cuando se crea un
proyecto de Windows Forms. El formulario se denomina Form1. Los dos archivos
que lo representan se denominan Form1.cs y Form1.designer.cs. Escribe el
código en Form1.cs. El Diseñador de Windows Forms escribe en el archivo
Form1.designer.cs el código que implementa todas las acciones que se realizan
arrastrando y colocando controles desde el cuadro de herramientas.
Para obtener más información acerca del Diseñador de Windows Forms en Visual
C# 2005, visite el siguiente sitio Web de Microsoft Developer Network (MSDN):
Presione la tecla F5 para ejecutar el proyecto. Al hacer
clic en Examinar, el cuadro de diálogo Abrir aparece 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 haga clic en Abrir. El documento se abrirá dentro del control WebBrowser y aparecerá un cuadro de mensajes que muestra el servidor del
documento de Office.
Consideraciones al utilizar el control WebBrowser
Debería considerar lo siguiente al utilizar el control WebBrowser:
El control WebBrowser examina los documentos de forma asincrónica. Cuando llama a WebBrowser1.Navigate, la llamada devuelve el control a la aplicación de Visual C# antes de que el documento se haya cargado completamente. Si piensa
utilizar la Automatización en el documento contenido, tendrá que utilizar el
evento NavigateComplete2 para que se le informe cuando se ha terminado de cargar el
documento. Utilice la propiedad Document del objeto WebBrowser que se pasa para obtener una referencia del objeto de documento
de Office, que en el código anterior está establecido como oDocument.
El control WebBrowser no permite la combinación de menús.
En Internet Explorer versiones 5.0 y posteriores, puede
mostrar barras de herramientas acopladas con 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);
Se conoce la existencia de algunos problemas derivados de
tener más de un control WebBrowser en un proyecto y de tener cada control cargado con el mismo tipo
de documento de Office (por ejemplo, documentos de Word u hojas de cálculo de
Excel) Microsoft recomienda utilizar sólo un control por cada proyecto y
buscar sólo un documento cada vez.
El problema más común se produce
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
desea mostrar las barras de herramientas con una de las técnicas anteriores,
sólo estará activo y funcionará correctamente un conjunto de barras de
herramientas. El otro estará deshabilitado y no se podrá utilizar.
Para borrar el contenido actual de WebBrowser, en el evento Click de otro botón de comando (o en algún otro lugar apropiado del
código), busque la página en blanco predeterminada con el siguiente código:
Para obtener
información adicional acerca de cómo usar el control WebBrowser, haga clic en
los números de artículo siguientes para verlos en Microsoft Knowledge Base:
¡Muchas gracias! Sus comentarios nos ayudarán a mejorar los contenidos de soporte. Para más opciones de asistencia, visite la página de Ayuda y soporte técnico.