exportar datos de flex a excel

18
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! Cuántas veces nos toca exportar datos que se muestran en un datagrid/advanceddatagrid/olap a excel y siempre repetimos lo mismo, sólo 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 librería 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 librería: Recién 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 librería me es suficiente. Entonce creé un Util para utilizar la librería de

Upload: amemiklo

Post on 21-Apr-2015

124 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Exportar Datos de Flex a Excel

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!

Cuántas veces nos toca exportar datos que se muestran en un datagrid/advanceddatagrid/olap a excel y siempre repetimos lo mismo, sólo 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 librería 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 librería: Recién 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 librería me es suficiente.

Entonce creé un Util para utilizar la librería de forma mas sencilla, veamos como exportar los datos desde un datagrid

Ejemplo en Flex:

Código :

<?xml version="1.0" encoding="utf-8"?>

<mx:Application

   xmlns:mx="http://www.adobe.com/2006/mxml"

Page 2: Exportar Datos de Flex a Excel

   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:"Andrés", apellido:"Sanchez"},

                                 {nombre:"Mónica", apellido:"Sanchez"},

                                {nombre:"Agustina", apellido:"Sanchez"},

                                 {nombre:"Pablo", apellido:"Sanchez"},

                                 {nombre:"Magalí", apellido:"Sanchez"}

Page 3: Exportar Datos de Flex a Excel

                                 ]);

                                 

         private function onExportToExcel():void

         {

           ExcelExporterUtil.dataGridExporter(this.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();" />

Page 4: Exportar Datos de Flex a Excel

   

</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

Código :

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;

Page 5: Exportar Datos de Flex a Excel

   

   /**

    *

    * Author: Andrés Lozada Mosto

    * Version: 0.1

    * Fecha release: 10/03/2009

    * Contacto: [email protected]

    * 

    * 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>

Page 6: Exportar Datos de Flex a Excel

    * private var flat:ArrayCollection = new ArrayCollection([

    *                             {nombre:"Andrés", apellido:"Sanchez"},

    *                             {nombre:"Mónica", apellido:"Sanchez"},

    *                             {nombre:"Agustina", apellido:"Sanchez"},

    *                             {nombre:"Pablo", apellido:"Sanchez"},

    *                             {nombre:"Magalí", apellido:"Sanchez"}

    *                              ]);

    * ExcelExporterUtil.dataGridExporter(this.dg, "prueba_excel.xls");

    * </code>

    *

    * Lista de funciones

    * <list>

    *  dataGridExporter:       Exporta un datagrid a un excel de forma automatica

    *  export:             Exporta un listado de objetos

    * </list>

         *

Page 7: Exportar Datos de Flex a Excel

    */

   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

Page 8: Exportar Datos de Flex a Excel

       * @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++)

         {

Page 9: Exportar Datos de Flex a Excel

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

      }

      

      /**

       *

Page 10: Exportar Datos de Flex a Excel

       * Export to Excell

       *

       * @param obj          Objeto simple, XML, XMLList, Array, ArrayCollection o XMLListCollection

       *                   que se quiere exportar 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   Nombre default con 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;

Page 11: Exportar Datos de Flex a Excel

         

         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++)

Page 12: Exportar Datos de Flex a Excel

            {

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

      }

      

      //-----------------------------

Page 13: Exportar Datos de Flex a Excel

      // Private function

      //-----------------------------

      /**

       *

       * A partir de un elemento pasado se genera un ICollectionView

       * para su correcto recorrido

       *

       * @param obj         Objeto a convertir a ICollectionView

       *

       *

       * @return referencia a un ICollectionView.

       *

       */

      static private function getDataProviderCollection(obj:Object):ICollectionView

      {

         if ( (obj is Number && isNaN(obj as Number)) || (!(obj is Number) && obj == null))

         {

            return null;

Page 14: Exportar Datos de Flex a Excel

         }

         else if ( obj is ICollectionView )

         {

            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;

         }

Page 15: Exportar Datos de Flex a Excel

         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