Você está na página 1de 15

Exportar datos de Flex a Excel

Por alfathenus el 18 de Marzo de 2009 con 49,142 visitas Aplicaciones web y moviles Otros tutoriales por alfathenus.

Buenas gente! Cuntas veces nos toca exportar datos que se muestran en un datagrid/advanceddatagrid/olap a excel y siempre repetimos lo mismo, slo se puede hacer desde backend (bueno, no es del todo cierto ya que con javascript se puede hacer a medias). Pero bueno ahora gracias a una librera que encontr en google code se pueden generar desde AS3 gracias a la clase ByteArray. El proyecto de google code es:http://code.google.com/p/as3xls/ e intenta portar las especificaciones de las estructuras BIFF a AS3 (estructuras de los archivos excel brindadas por openoffice). Estado de la librera: Recin acepta excel 2 (BIFF 2) por lo que solo se pueden manejar texto y tipos de datos de columna simple y algo de formulas. Bueno... para mi trabajo tuve que generar exportaciones a excel de datos que se muestran en un datagrid y por ahora con este nivel de desarrollo de la librera me es suficiente. Entonce cre un Util para utilizar la librera de forma mas sencilla, veamos como exportar los datos desde un datagrid Ejemplo en Flex:
Cdigo :

<?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"

layout="vertical">

<mx:Script> <![CDATA[ import com.kcc.tempos.utils.exporter.ExcelExporterUtil; import mx.collections.IViewCursor; import com.as3xls.xls.ExcelFile; import com.as3xls.xls.Sheet; import mx.collections.ArrayCollection;

[Bindable] private var flat:ArrayCollection = new ArrayCollection([ {nombre:"Andrs", apellido:"Sanchez"}, {nombre:"Mnica", apellido:"Sanchez"}, {nombre:"Agustina ", apellido:"Sanchez"}, {nombre:"Pablo", apellido:"Sanchez"}, {nombre:"Magal", apellido:"Sanchez"}

]);

private function onExportToExcel():void { ExcelExporterUtil.dataGridExporter(thi s.dg, "prueba_excel.xls"); }

]]> </mx:Script>

<mx:DataGrid id="dg" dataProvider="{flat}"> <mx:columns> <mx:DataGridColumn dataField="nombre" headerText="Nombre" /> <mx:DataGridColumn dataField="apellido" headerText="Apellido" /> </mx:columns> </mx:DataGrid>

<mx:Button label="Export" click="onExportToExcel();" />

</mx:Application>

Esta no es la nica funcionalidad, sino que puede exportar cualquier cosa, un array, arraycollecion, xml, xmllist, etc. Aca les dejo la clase
Cdigo :

package com.kcc.tempos.utils.exporter { import com.as3xls.xls.ExcelFile; import com.as3xls.xls.Sheet;

import flash.errors.IllegalOperationError; import flash.net.FileReference; import flash.utils.ByteArray;

import mx.collections.ArrayCollection; import mx.collections.ICollectionView; import mx.collections.IViewCursor; import mx.collections.XMLListCollection; import mx.controls.DataGrid;

/** * * Author: Andrs Lozada Mosto * Version: 0.1 * Fecha release: 10/03/2009 * Contacto: alfathenus@gmail.com * * Clase que maneja la exportacion de elementos * a Excel. * * Se utiliza el proyecto http://code.google.com/p/as3xls/ * para la generacion de Excel. * * Se necesita la version 10 de Flash player para realizar el correcto * guardado del archivo sin pasar por backend. * * @example * <code> * private var flat:ArrayCollection = new ArrayCollection([

* ", apellido:"Sanchez"}, * ", apellido:"Sanchez"}, * na", apellido:"Sanchez"}, * , apellido:"Sanchez"}, * ", apellido:"Sanchez"} *

{nombre:"Andrs {nombre:"Mnica {nombre:"Agusti {nombre:"Pablo" {nombre:"Magal ]);

* ExcelExporterUtil.dataGridExporter(this.dg, "prueba_excel.xls"); * </code> * * Lista de funciones * <list> * dataGridExporter: Exporta un datagrid a un excel de forma automatica * export: objetos * </list> * */ Exporta un listado de

public class ExcelExporterUtil { public function ExcelExporterUtil() { throw new IllegalOperationError("Class \"ExcelExporterUtil\" is static. You can't instance this"); }

//----------------------------// Public function //----------------------------/** * * Exporta los datos de un datagrid hacia un Excel. * Toma el dataProvider del mismo y las columnas para su exportacion * * @param dg Referencia al datagrid

* @defaultName Nombre default con el que se va a generar el archivo excel

* */ static public function dataGridExporter(dg:DataGrid, defaultName:String):void { if (dg == null || dg.dataProvider == null || defaultName == null || defaultName == "") return;

var cols:Number = 0; var colsValues:Array = []; var cantCols:Number = dg.columnCount; var fieldT:String; var headerT:String;

// armo el listado de headers y variables para cada columna for ( ; cols < cantCols; cols++) { headerT = (dg.columns[cols] as Object).headerText

fieldT = (dg.columns[cols] as Object).dataField; if ( fieldT == null || fieldT == "" || headerT == null || headerT == "") continue; colsValues.push({ header:headerT, value:fieldT }); }

if ( colsValues.length == 0 ) return;

ExcelExporterUtil.export(dg.dataProvider, colsValues, defaultName); }

/** * * Export to Excell *

* @param obj Objeto simple, XML, XMLList, Array, ArrayCollection o XMLListCollection * a excel * @colsValues Listado de objetos que indican cual es el nombre de la columna * y que propiedad del objeto se utiliza para sacar los datos de la columna * {header:"nombre del header", value:"propiedad del objeto que contiene el valor"} * @param defaultName el que se genera el excel * */ static public function export(obj:Object, colsValues:Array, defautlName:String):void { var _dp:ICollectionView = ExcelExporterUtil.getDataProviderCollection(obj); if ( _dp == null ) return; Nombre default con que se quiere exportar

var rows:Number = 0;

var cols:Number = 0; var cantCols:Number = colsValues.length; var sheet:Sheet = new Sheet(); sheet.resize(_dp.length, colsValues.length);

for ( ; cols < cantCols; cols++) { sheet.setCell(rows, cols, colsValues[cols].header); }

cols = 0; rows++; var cursor:IViewCursor = _dp.createCursor(); while ( !cursor.afterLast ) { for (cols = 0 ; cols < cantCols; cols++) { if ( (cursor.current as Object).hasOwnProperty(colsValues[cols].value) )

sheet.setCell(rows, cols, (cursor.current as Object)[colsValues[cols].value]); }

rows++; cursor.moveNext(); }

var xls:ExcelFile = new ExcelFile(); xls.sheets.addItem(sheet); var bytes:ByteArray = xls.saveToByteArray();

var fr:FileReference = new FileReference(); fr.save(bytes, defautlName); }

//----------------------------// Private function //-----------------------------

/** * * A partir de un elemento pasado se genera un ICollectionView * para su correcto recorrido * * @param obj ICollectionView * * * @return referencia a un ICollectionView. * */ static private function getDataProviderCollection(obj:Object):ICollectionV iew { if ( (obj is Number && isNaN(obj as Number)) || (!(obj is Number) && obj == null)) { return null; } else if ( obj is ICollectionView ) Objeto a convertir a

{ return obj as ICollectionView; } else if ( obj is Array ) { return new ArrayCollection(obj as Array); } else if ( obj is XMLList ) { return new XMLListCollection(obj as XMLList); } else if ( obj is XML ) { var col:XMLListCollection = new XMLListCollection(); col.addItem(obj); return col; } else if ( obj is Object ) {

return new ArrayCollection([obj]); } else { return null; } } } }

Nivel de desarrollo actual de la clase: - Exporta listas de objetos a un excel - Exporta un datagrid a un excel Tareas en desarrollo: - Testing ------ En entorno Flash ------ Exportacion de XML, XMLList, XMLListCollection ------ Exportaciones directas desde AdvancedDataGrid y OLAPDataGrid - Implementar BIFF 8 asi se le puede agregar cualquier tipo de multimedia Saludos y espero que les sirva

Você também pode gostar