REFERENCIA DE CONSTRUCCION DE
DOCUMENTOS MICROSOFT EXCEL USANDO OPEN
XML
DOCUMENTOS MICROSOFT EXCEL USANDO OPEN
XML
Como desarrolladores, generalmente debemos generar documentos Excel a partir de un aplicativo
que hayamos generado; generalmente lo hacemos usando recursos como cristal report, reporting services (sql server) o librerías interop (este último requiere la instalación de Microsoft Office); sin embargo todos estos recursos tienen que estar presentes en el servidor ósea instalados; lo cual muchas veces no es posible.
que hayamos generado; generalmente lo hacemos usando recursos como cristal report, reporting services (sql server) o librerías interop (este último requiere la instalación de Microsoft Office); sin embargo todos estos recursos tienen que estar presentes en el servidor ósea instalados; lo cual muchas veces no es posible.
Bien este es un documento que presenta una forma práctica de cómo elaborar un documento Excel usando Open XML , el mismo es un API que nos permite generar documentos office (Excel y Word) mediante XML; además actualmente es respaldado por el ISO 29500 (↑ISO/IEC (18-11-2008). «Publication of ISO/IEC 29500:2008, Information technology - Office Open XML formats». ISO. Consultado el 19-11-2008.), lo cual nos permite afirmar que nuestro aplicativo cumple con ciertas
normas de calidad.
normas de calidad.
Comencemos, inicialmente para construir un documento Excel con esta herramienta debe seguir los siguientes pasos:
1. Obtenga las librerías y las herramientas de http://www.microsoft.com/downloads/details.aspx?FamilyID=c6e744e5-36e9-45f5-8d8c-331df206e0d0&displaylang=en
2. Instálelas en su equipo de desarrollo (recalcamos que las mismas no necesitan estar en el servidor).
3. Genere el modelo de su documento Excel
usando Microsoft Excel y genere el código correspondiente con la herramienta OpenXMLSDKTool
usando Microsoft Excel y genere el código correspondiente con la herramienta OpenXMLSDKTool
4. Elabore su proyecto y referencie la librería OpenXMLSDKv2
5. Genere el código para llenar la
data.
data.
6. Sírvase de publicar su aplicativo.
Instalación de OPEN XML.
Bien para
la instalación de esta API solo siga al wizard y guarde la dirección de donde
instalo cada componente:
SDK:
la instalación de esta API solo siga al wizard y guarde la dirección de donde
instalo cada componente:
SDK:
Genere el modelo de su documento Excel usando Microsoft Excel y genere
el código correspondiente con la herramienta OpenXMLSDKTool
el código correspondiente con la herramienta OpenXMLSDKTool
Bien ahora
que usted ya tiene instalado en su equipo estas herramientas generemos nuestros
modelos de documentos EXCEL , en mi caso hare un documento para registrar
frutas:
que usted ya tiene instalado en su equipo estas herramientas generemos nuestros
modelos de documentos EXCEL , en mi caso hare un documento para registrar
frutas:
Como ven
solo abrí el Excel y empecé a diseñar el documento con la cabecera (incluyendo
su estilo) y un columna totalizadora que tiene una formula, ahora guarde su
templeta:
solo abrí el Excel y empecé a diseñar el documento con la cabecera (incluyendo
su estilo) y un columna totalizadora que tiene una formula, ahora guarde su
templeta:
Ahora que
ya tiene su templeta abra el tool que tiene Open XML y con el abra su documento
Excel:
ya tiene su templeta abra el tool que tiene Open XML y con el abra su documento
Excel:
A su
izquierda vera un panel con nodos xml , valídelo y tendra una interfaz similar
a esta:
izquierda vera un panel con nodos xml , valídelo y tendra una interfaz similar
a esta:
Ahora presione
el botón de Reflect code y obtenga el código que corresponde a su templeta.
el botón de Reflect code y obtenga el código que corresponde a su templeta.
Elabore su proyecto y referencie
la librería OpenXMLSDKv2
Ahora
usando Visual Studio 2008 crearemos una solución
que se denominara frutas:
usando Visual Studio 2008 crearemos una solución
que se denominara frutas:
Agreguemos a
nuestra solución dos proyectos una librería de clase y otra que sea una solución
web:
nuestra solución dos proyectos una librería de clase y otra que sea una solución
web:
Agregue una
clase denominada TemplateFrutas a su proyecto de librerías y pegue el código obtenido
desde el tool de open xml (cambien el nombre de la clase GeneratedClass por TemplateFrutas):
clase denominada TemplateFrutas a su proyecto de librerías y pegue el código obtenido
desde el tool de open xml (cambien el nombre de la clase GeneratedClass por TemplateFrutas):
Referencie la libreria del SDK (desde el lugar donde la instalo):
Referencie la librería Windows
Base:
Base:
Genere el código para llenar la data.
Ahora que usted referencio las librerías necesarias, trabajemos en la generación del Excel
con los datso de un XML.
con los datso de un XML.
Compile su proyecto y agregue un xml con la data al proyecto web (esto es opcional, si desea puede rescatar la información desde la Base de datos es indistinto pues usamos como base un DataTable para registrar los datos en el Excel):
Agregue una clase para consumir la data (en nuestro caso ExcelEscritor )y escribirla en el
excel, despues pegue el siguiente codigo:
excel, despues pegue el siguiente codigo:
using System;
using System.Data;
using
System.Collections.Generic;
System.Collections.Generic;
using
System.Linq;
System.Linq;
using
System.Text;
System.Text;
using
DocumentFormat.OpenXml.Packaging;
DocumentFormat.OpenXml.Packaging;
using
DocumentFormat.OpenXml.Spreadsheet;
DocumentFormat.OpenXml.Spreadsheet;
namespace
ExcelOpenXML
ExcelOpenXML
{
public class ExcelEscritor
{
private
TemplateFrutas excelDocument;
TemplateFrutas excelDocument;
/// <summary>
/// Metodo que escribe la data en la templeta
/// </summary>
/// <param name="table">tabla con los datos a llenar en el excel</param>
/// <param name="exportFile">ruta donde se generara el archivo </param>
public void ExportDataTable(DataTable
table, string exportFile)
table, string exportFile)
{
//usamos la templeta generada
excelDocument = new TemplateFrutas();
excelDocument.CreatePackage(exportFile);
//llenamos los daros en la hoja
using (SpreadsheetDocument spreadsheet =
SpreadsheetDocument.Open(exportFile,
true))
true))
{
WorkbookPart
workbook = spreadsheet.WorkbookPart;
workbook = spreadsheet.WorkbookPart;
//referenciamos
a la primera hoja
a la primera hoja
WorksheetPart
worksheet = workbook.WorksheetParts.Last();
worksheet = workbook.WorksheetParts.Last();
SheetData
data = worksheet.Worksheet.GetFirstChild<SheetData>();
data = worksheet.Worksheet.GetFirstChild<SheetData>();
//llenamos los datos fila por fila
DataRow contentRow;
for
(int i = 0; i < table.Rows.Count; i++)
(int i = 0; i < table.Rows.Count; i++)
{
contentRow = table.Rows[i];
data.AppendChild(createContentRow(contentRow, i + 2));
}
}
}
#region WorkBook Methods
/// <summary>
/// Gets the Excel column name based on a supplied index
number.
number.
/// </summary>
/// <returns>1 = A, 2 = B... 27 = AA, etc.</returns>
private
string getColumnName(int
columnIndex)
string getColumnName(int
columnIndex)
{
int
dividend = columnIndex;
dividend = columnIndex;
string
columnName = String.Empty;
columnName = String.Empty;
int
modifier;
modifier;
while
(dividend > 0)
(dividend > 0)
{
modifier = (dividend - 1) % 26;
columnName =
Convert.ToChar(65
+ modifier).ToString() + columnName;
+ modifier).ToString() + columnName;
dividend = (int)((dividend - modifier) / 26);
}
return
columnName;
columnName;
}
private
Cell createTextCell(
Cell createTextCell(
int
columnIndex,
columnIndex,
int
rowIndex,
rowIndex,
object
cellValue)
cellValue)
{
Cell
cell = new Cell();
cell = new Cell();
cell.DataType = CellValues.InlineString;
cell.CellReference =
getColumnName(columnIndex) + rowIndex;
getColumnName(columnIndex) + rowIndex;
InlineString
inlineString = new InlineString();
inlineString = new InlineString();
Text
t = new Text();
t = new Text();
t.Text = cellValue.ToString();
inlineString.AppendChild(t);
cell.AppendChild(inlineString);
return
cell;
cell;
}
private
Row createContentRow(
Row createContentRow(
DataRow
dataRow,
dataRow,
int
rowIndex)
rowIndex)
{
Row
row = new Row
row = new Row
{
RowIndex = (UInt32)rowIndex
};
for
(int i = 0; i < dataRow.Table.Columns.Count;
i++)
(int i = 0; i < dataRow.Table.Columns.Count;
i++)
{
Cell
dataCell = createTextCell(i + 1, rowIndex, dataRow[i]);
dataCell = createTextCell(i + 1, rowIndex, dataRow[i]);
row.AppendChild(dataCell);
}
return
row;
row;
}
#endregion
}
}
Ahora adicione un botón a su webform default.aspx, obteniendo un en su solución una
estructura similar a esta:
estructura similar a esta:
Adicione la referencia a su proyecto web de la librería que creamos:
Ahora en el evento click del botón agregado adicione el siguiente código (no olvide colocar
la instrucción using ExcelOpenXML en su documento):
la instrucción using ExcelOpenXML en su documento):
ExcelOpenXML.ExcelEscritor export = new
ExcelOpenXML.ExcelEscritor();
ExcelOpenXML.ExcelEscritor();
//creamos la data en base al xml
DataSet sampleDataSet = new DataSet();
sampleDataSet.ReadXml(Server.MapPath("~/Frutas.xml"));
DataTable
productsTable = sampleDataSet.Tables[0];
productsTable = sampleDataSet.Tables[0];
string
exportFile = Server.MapPath("~/excelExport.xslx");
exportFile = Server.MapPath("~/excelExport.xslx");
export.ExportDataTable(productsTable, exportFile);
Response.AddHeader("Content-Disposition", "attachment;filename=excelExport.xlsx");
Response.WriteFile(exportFile);
Compile la solución y hágala correr.
Sírvase de publicar su aplicativo.
Ahora que tiene su proyecto publiquémoslo para poder hacer un deploy en el servidor, de la siguiente manera:
Dicha referencia debe tener una copia local en el directorio del proyecto web para eso coloque en true la
propiedad de la misma:
propiedad de la misma:
Ahora solo hágale publish a su aplicativo de la siguiente manera
El empaquetado tendrá la siguiente estructura de directorios:
Y dentro de bin ud tendrá los siguiente archivos:
Bien ahora usted puede publicarlo en su server sin tener que instalar nada en el. Mas referencias en http://msdn.microsoft.com/en-us/office/bb738430.aspx




















