Excel 2002 incluye funcionalidad para abrir archivos en el
formato del Lenguaje de marcado extensible (XML). Un archivo XML que esté bien
formado se puede abrir directamente en Excel 2002 o en Excel 2003, ya sea
mediante código o mediante la interfaz de usuario.
Con Microsoft
Visual C# 2005 o Microsoft Visual C# .NET puede aprovechar la funcionalidad XML
de Excel para transferir fácilmente datos a un libro de manera que pueda
presentarlos con un formato adecuado y organizados como desee. En este artículo
se muestra cómo realizar esta tarea.
Generar XML desde un objeto DataSet para usarlo en Excel 2002 o en Excel 2003
Esta sección ilustra cómo crear un objeto
DataSet y exportar los datos que contiene a un archivo XML utilizando el
método
WriteXML. El archivo XML que se genera se puede abrir directamente en
Excel. Con fines ilustrativos, el objeto
DataSet se crea desde la base de datos Northwind de Microsoft Access
mediante el proveedor OLEDB de Jet. Sin embargo, un código similar funcionará
con cualquier objeto
DataSet que cree con Visual C# 2005 o con Visual C# .NET.
- Inicie Microsoft Visual Studio 2005 o Microsoft Visual
Studio .NET. En el menú Archivo, haga clic en Nuevo y, después, haga clic en Proyecto. Seleccione Aplicación para Windows en los tipos de proyectos de Visual C#. De forma predeterminada,
se crea Form1.
- En el menú Ver, seleccione Cuadro de herramientas para mostrar el cuadro de herramientas y agregue un botón a
Form1.
- Haga doble clic en Button1. Aparecerá la ventana de código del formulario.
- Agregue las directivas using siguientes al principio de Form1.cs:
using System.Data.OleDb; using System.Xml;
- Agregue la siguiente variable miembro privada a la clase
Form1:
private string strConn ="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + " C:\\Archivos de programa\\Microsoft Office\\Office10\\Samples\\" + "Northwind.mdb;";
Nota
Quizás tenga que modificar la ruta de acceso a Northwind.mdb en
la cadena de conexión para adaptarla a su instalación. - Agregue el código siguiente al controlador button1_Click:
//Conectar con el origen de datos. OleDbConnection objConn = new OleDbConnection (strConn); try { objConn.Open();
//Rellenar un conjunto de datos con registros de la tabla Customers. OleDbCommand objCmd = new OleDbCommand( "Select CustomerID, CompanyName, ContactName, " + "Country, Phone from Customers", objConn); OleDbDataAdapter objAdapter = new OleDbDataAdapter(); objAdapter.SelectCommand = objCmd; DataSet objDataset = new DataSet(); objAdapter.Fill(objDataset);
//Crear el FileStream con el que escribir. System.IO.FileStream fs = new System.IO.FileStream( "C:\\Customers.xml", System.IO.FileMode.Create);
//Crear XmlTextWriter para FileStream. System.Xml.XmlTextWriter xtw = new System.Xml.XmlTextWriter( fs, System.Text.Encoding.Unicode);
//Agregar instrucciones de procesamiento al principio del archivo XML, //una de las cuales indica una hoja de estilos. xtw.WriteProcessingInstruction("xml", "version='1.0'"); //xtw.WriteProcessingInstruction("xml-stylesheet", // "type='text/xsl' href='customers.xsl'");
//Escribir los datos XML del conjunto de datos en el archivo. objDataset.WriteXml(xtw); xtw.Close();
//Cerrar la conexión con la base de datos. objConn.Close(); } catch (System.Exception ex) { MessageBox.Show(ex.Message); }
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 archivo Form1.designer.cs es donde el Diseñador de Windows
Forms escribe el código que implementa todas las acciones que realizó
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 F5 para generar y ejecutar el programa.
- Haga clic en Button1 para crear el archivo XML y cierre Form1 para finalizar el
programa.
- Inicie Excel 2002 o Excel 2003 y abra el archivo resultante
C:\Customers.xml.
- Tras observar cómo el código XML se ha analizado en filas y
columnas en el nuevo libro, cierre el archivo y salga de Excel.
Dar formato al código XML con una hoja de estilos
En este paso se muestra cómo utilizar una hoja de estilos (XSL)
para transformar cómo se da formato a los datos XML y se organizan en un libro
de Excel.
- Utilice un editor HTML o un editor de textos (como Bloc de
notas) y guarde la siguiente hoja de estilos como C:\Customers.xsl:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:template match="/"> <HTML> <HEAD> <STYLE> .HDR { background-color:bisque;font-weight:bold } </STYLE> </HEAD> <BODY> <TABLE> <COLGROUP WIDTH="100" ALIGN="CENTER"></COLGROUP> <COLGROUP WIDTH="200" ALIGN="LEFT"></COLGROUP> <COLGROUP WIDTH="200" ALIGN="LEFT"></COLGROUP> <COLGROUP WIDTH="100" ALIGN="LEFT"></COLGROUP> <COLGROUP WIDTH="100" ALIGN="LEFT"></COLGROUP> <TD CLASS="HDR">Customer ID</TD> <TD CLASS="HDR">Company</TD> <TD CLASS="HDR">Contact</TD> <TD CLASS="HDR">Country</TD> <TD CLASS="HDR">Phone</TD> <xsl:for-each select="NewDataSet/Table"> <TR> <TD><xsl:value-of select="CustomerID"/></TD> <TD><xsl:value-of select="CompanyName"/></TD> <TD><xsl:value-of select="ContactName"/></TD> <TD><xsl:value-of select="Country"/></TD> <TD><xsl:value-of select="Phone"/></TD> </TR> </xsl:for-each> </TABLE> </BODY> </HTML> </xsl:template> </xsl:stylesheet>
- Elimine el comentario de la siguiente línea de código en el
controlador button1_Click:
xtw.WriteProcessingInstruction("xml-stylesheet", "type='text/xsl' href='customers.xsl'");
Esta línea de código escribe una instrucción de procesamiento en el
archivo XML que Excel usa para encontrar la hoja de estilos
(Customers.xsl).
- Presione F5 para generar y ejecutar el programa.
- Haga clic en Button1 para crear el archivo XML y cierre Form1 para finalizar el
programa.
- Inicie Excel 2002 o Excel 2003 y abra el archivo resultante
C:\Customers.xml.
- Puesto que Excel ve la instrucción de procesamiento para la
hoja de estilos en el código XML, aparece un cuadro de diálogo al abrir el
archivo. En el cuadro de diálogo Importar XML, seleccione Abrir el archivo aplicándole la siguiente hoja de estilos. En la lista, seleccione Customers.xsl y haga clic en Aceptar. Observe que los datos XML tienen formato y que las columnas se
han organizado de acuerdo con la hoja de estilos.
- Cierre el archivo y salga de Excel.
Usar código para abrir el código XML transformado
Hasta este momento, ha abierto el archivo XML con la interfaz de
usuario de Excel. En esta sección se muestra cómo automatizar Excel para abrir
el libro mediante programación. En el siguiente ejemplo se muestra cómo abrir
el código XML transformado sin la intervención del usuario, para lo cual se
transforma primero el código XML del objeto
DataSet en HTML.
- Agregue una referencia a Microsoft Excel 10.0 Object Library o a Microsoft Excel 11.0 Object Library. Para ello, siga estos pasos:
- En el menú Proyecto, haga clic en Agregar referencia.
- En la ficha COM, busque Microsoft Excel 10.0 Object Library o Microsoft Excel 11.0 Object Library y haga clic en Seleccionar.
- En el cuadro de diálogo Agregar referencias, haga clic en Aceptar para aceptar su selección. Si se le pregunta si desea generar
contenedores para la biblioteca seleccionada, haga clic en Sí.
- Agregue las directivas using siguientes al principio de Form1.cs:
using Excel = Microsoft.Office.Interop.Excel;
- En el proyecto de Visual C# 2005 o Visual C# .NET, agregue
otro botón a Form1.
- Haga doble clic en Button2. Cuando aparezca la ventana de código del formulario, agregue el
código siguiente al controlador Button2_Click:
//Conectar con el origen de datos. OleDbConnection objConn = new OleDbConnection (strConn); objConn.Open();
//Rellenar un conjunto de datos con registros de la tabla Customers. OleDbCommand objCmd = new OleDbCommand( "Select CustomerID, CompanyName, ContactName, " + "Country, Phone from Customers", objConn); OleDbDataAdapter objAdapter = new OleDbDataAdapter(); objAdapter.SelectCommand = objCmd; DataSet objDataset = new DataSet(); objAdapter.Fill(objDataset);
//Crear el FileStream con el que escribir. System.IO.FileStream fs = new System.IO.FileStream( "C:\\Customers.htm", System.IO.FileMode.Create);
//Crear XmlTextWriter para FileStream. System.Xml.XmlTextWriter xtw = new System.Xml.XmlTextWriter( fs, System.Text.Encoding.Unicode);
//Transformar el código XML utilizando la hoja de estilos. XmlDataDocument xmlDoc = new XmlDataDocument(objDataset); System.Xml.Xsl.XslTransform xslTran = new System.Xml.Xsl.XslTransform(); xslTran.Load("C:\\Customers.xsl"); xslTran.Transform(xmlDoc, null, xtw);
//Abrir el archivo HTML en Excel. Excel.Application oExcel = new Excel.Application(); oExcel.Visible=true; oExcel.UserControl=true; Excel.Workbooks oBooks = oExcel.Workbooks; object oOpt = System.Reflection.Missing.Value; //for optional arguments oBooks.Open("c:\\customers.htm", oOpt, oOpt, oOpt, oOpt, oOpt, oOpt, oOpt, oOpt, oOpt, oOpt, oOpt, oOpt, oOpt, oOpt);
- Presione F5 para generar y ejecutar el programa.
- Haga clic en Button2 para abrir el código XML transformado en Excel.
Nota
Mientras que el Modelo de objetos de Excel 2002 o de Excel 2003
expone un método
OpenXML que le permite abrir mediante programación un archivo XML con
hojas de estilos aplicadas, el ejemplo anterior no llama a este método debido a
un problema conocido acerca del uso de este método desde un cliente de
Automatización. El método
OpenXML funciona según lo esperado cuando se le llama desde una macro de
Excel; sin embargo, cuando se le llama desde un cliente de Automatización, el
parámetro
StyleSheet no se tiene en cuenta.
Para obtener
información adicional al respecto, haga clic en el número de artículo siguiente
para verlo en Microsoft Knowledge Base:
307230
(http://support.microsoft.com/kb/307230/
)
ERROR: Se ignora el parámetro StyleSheets del método OpenXML cuando se automatiza Excel
Para obtener más información al respecto, consulte los
siguientes artículos de Microsoft Knowledge Base:
288215
(http://support.microsoft.com/kb/288215/
)
INFO: Microsoft Excel 2002 y XML
302084
(http://support.microsoft.com/kb/302084/
)
Cómo automatizar Microsoft Excel desde Microsoft Visual C# .NET
301216
(http://support.microsoft.com/kb/301216/
)
Cómo llenar un objeto DataSet desde una base de datos mediante Visual Basic .NET
306023
(http://support.microsoft.com/kb/306023/
)
Cómo transferir datos a un libro de Excel utilizando Visual C# 2005 o Visual C# .NET
Id. de artículo: 307029 - Última revisión: viernes, 24 de noviembre de 2006 - Versión: 7.1
La información de este artículo se refiere a:
- Microsoft Visual C# 2005
- Microsoft Visual C# .NET 2002 Standard Edition
- Microsoft ADO.NET 1.0
- Microsoft Excel 2002 Standard Edition