¿Quieres registrarte?

Exportar datos de Flex a Excel

Por: alfathenus
18 de Marzo del 2009
21,639 visitas

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" 
   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"}
                                 ]);
                                 
         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();" />
   
</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;
   
   /**
    *
    * Author: Andrés 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([
    *                              {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>
         *
    */

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

Enviar a twitter Enviar a facebook


También te interesa


Etiquetas flex excel

Comentarios | Enviar un comentario
Excelente -- > go a mis Utils :P
Por: leobaraldi-blog
Otro excelente mas!
Por: Raxiro-blog
se ve muy interesante U_U
Por: andresmaro
Mejor tip que he visto desde hace mucho tiempo
Por: Hernan-blog
Te me adelantaste :O , genial que ya estén usando la nueva característica del FileRefence, el nuevo metodo "save" (sólo para Flash Player 10), para guarda directamente un archivo al disco.
Felicidades por el tip, te quedo de lujo.
Por: Otaku RzO
Se ve bastante interesante tu aportación :D voy a seguir de cerca esta clase que manejas. Yo ya tuve un trabajo en Flex en el que necesitaban obtener un archivo de Excel. La forma en que lo arreglé fue crear, en un script php, una tabla html con los datos y darle extensión xls para que lo abriera con excel. Ya en este programa cambiaba los datos html a la estructura propia de este formato
Por: leoncitoamx
Excelente aportación, la probé y funciona muy bien, solo tengo el inconveniente de que los acentos y eñes "Ñ" no las muestra adecuadamente, supongo que es un problema de codificación, estoy investigando como resolverlo. Si alguien sabe como resolverlo estaré muy agradecido si comparte la solución.

Saludos y muchas gracias. :D
Por: alexsanchezm
Si cierto, no funcionan bien las ñ ni los acentos, eso se debe a q no esta utilizando UTF-8 la libreria de generacion de Excel, como aun no esta en prouductivo esta funcionalidad no me he puesto a revisar a ver como solucionar eso.


Bueno en estos dias estuve refactorizando un poco la clase y quedo asi... fijense q tiene alguna q otra funcionalidad nueva.

(Fijense q cambio el nombre de la clase)
ExcelExport.as

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.charts.chartClasses.ChartBase;

   import mx.collections.ArrayCollection;

   import mx.collections.ICollectionView;

   import mx.collections.IViewCursor;

   import mx.collections.XMLListCollection;

   import mx.controls.AdvancedDataGrid;

   import mx.controls.DataGrid;

   import mx.controls.OLAPDataGrid;

   

   /**

    *

    * Author: Andrés Lozada Mosto

    * Version: 0.5

    * Fecha release: 25/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([

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

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

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

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

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

    *                              ]);

    * //Exportando desde un datagrid

    * ExcelExport.fromGrid(this.dg, "prueba_excel_datagrid.xls");

    * //Exportacion general (en este caso un chart)

    * ExcelExport.export(this.Areachart, "prueba_excel_chart.xls", {colsValues:[{header:"Month", value:"Month"}]})

    * </code>

    * 

    * Lista de funciones

    * <list>

    *  fromGrid:          Exporta un datagrid a un excel de forma automática

    *  fromChart:         Exporta un gráfico a un excel de forma automática

    *  fromObject:       Exporta un listado de objetos XML, XMLList, Array o ICollectionView

    *  export:            Exporta los datos q se le pasen delegando a la tarea a la funcion

    *                   correspondiente dependiendo el proveedor de datos

    * </list>

    * 

    */

    

   public class ExcelExport

   {

      public function ExcelExport()

      {

         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 exportación.

       * 

       * @param grid                Referencia al DataGrid, AdvancedDataGrid u OLAPDataGrid

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

       * @param params            Parámetros opcionales

       *                         {

       *                            extraDataBefore:Listado de columnas extras (a colocar antes de las columnas del datagrid) 

       *                                        a las columnas del datagrid. Su dato se encuentra en el dataprovider 

       *                                        del datagrid.

       *                                        Formato:

       *                                        [{header:"nombre del header", value:"propiedad del objeto que contiene el valor"}]

       *                            extraDataAfter:Listado de columnas extras (a colocar luego de las columnas del datagrid)

       *                                        a las columnas del datagrid. Su dato se encuentra en el dataprovider 

       *                                        del datagrid.

       *                                        Formato:

       *                                        [{header:"nombre del header", value:"propiedad del objeto que contiene el valor"}]

       *                         }

       * 

       */

      static public function fromGrid(grid:*, defaultName:String, params:Object):void 

      {

         if ( !(grid is DataGrid) && !(grid is AdvancedDataGrid) && !(grid is OLAPDataGrid) )

            return;

         

         if (grid == null || grid.dataProvider == null || defaultName == null || defaultName == "")

            throw new ArgumentError("ExcelExporterUtil.datagridToExcel. Error in arguments");

         

         var colsValues2:Array = (params.hasOwnProperty("colsValues"))?params.colsValues:[];

         var extraSeriesBefore:Array = (params.hasOwnProperty("extraDataBefore"))?params.extraDataBefore:[];

         if ( extraSeriesBefore.length > 0 && colsValues2.length > 0 )

            extraSeriesBefore = extraSeriesAfter.concat(colsValues2);

         else if (extraSeriesBefore.length == 0 && colsValues2.length > 0 )

            extraSeriesBefore = colsValues2;

         var extraSeriesAfter:Array = (params.hasOwnProperty("extraDataAfter"))?params.extraDataAfter:[];

         

         var colsValues:Array = ExcelExport.generateColsValues(

                                                   grid.columns, 

                                                   "headerText", 

                                                   "dataField", 

                                                   extraSeriesBefore, 

                                                   extraSeriesAfter

                                                   );



         if ( colsValues.length == 0 )

            return;

            

         ExcelExport.fromObject(grid.dataProvider, defaultName, {colsValues:colsValues});

      }

      

      /**

       * 

       * Exporta los datos de un gráfico de flex hacia un Excel.

       * Toma el dataProvider del mismo y las series para su exportación.

       * 

       * @param chart                Referencia al datagrid

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

       * @param params            Parámetros opcionales

       *                         {

       *                            extraDataBefore:Listado de series extras (a colocar antes de las series del chart) 

       *                                        a las series del chart. Su dato se encuentra en el dataprovider 

       *                                        del datagrid.

       *                                        Formato:

       *                                        [{header:"nombre del header", value:"propiedad del objeto que contiene el valor"}]

       *                            extraDataAfter:Listado de series extras (a colocar luego de las series del chart)

       *                                        a las series del chart. Su dato se encuentra en el dataprovider 

       *                                        del chart.

       *                                        Formato:

       *                                        [{header:"nombre del header", value:"propiedad del objeto que contiene el valor"}]

       *                         }

       * 

       */

      static public function fromChart(chart:ChartBase, defaultName:String, params:Object):void

      {

         if ( chart == null || chart.dataProvider == null || chart.dataProvider.length < 1 || 

            chart.series == null || chart.series.length < 1 || 

            defaultName == null || defaultName == "" )

            throw new ArgumentError("ExcelExporterUtil.graphToExcel. Error in arguments");

         

         var colsValues2:Array = (params.hasOwnProperty("colsValues"))?params.colsValues:[];

         var extraColumsBefore:Array = (params.hasOwnProperty("extraDataBefore"))?params.extraDataBefore:[];

         if ( extraColumsBefore.length > 0 && colsValues2.length > 0 )

            extraColumsBefore = extraColumsBefore.concat(colsValues2);

         else if (extraColumsBefore.length == 0 && colsValues2.length > 0 )

            extraColumsBefore = colsValues2;

         var extraColumnsAfter:Array = (params.hasOwnProperty("extraDataAfter"))?params.extraDataAfter:[];

         

         var colsValues:Array = ExcelExport.generateColsValues(

                                                chart.series, 

                                                "displayName", 

                                                "yField", 

                                                extraColumsBefore, 

                                                extraColumnsAfter);

         if ( colsValues.length == 0 )

            return;

            

         ExcelExport.fromObject(chart.dataProvider, defaultName, {colsValues:colsValues});

      }

      

      /**

       * 

       * Export to Excell

       * 

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

       *                   que se quiere exportar a excel

       * @param defaultName   Nombre default con el que se genera el excel exportToFile

       * @param params      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"}

       * 

       */

      static public function fromObject(obj:Object, defaultName:String, params:Object):void

      {

         if ( !(obj is XML) && !(obj is XMLList) && !(obj is XMLList) && !(obj is Array) && !(obj is ICollectionView) )

            return;

         

         var colsValues:Array = (params.hasOwnProperty("colsValues"))?params.colsValues:null;

         

         if ( colsValues == null || colsValues.length == 0 )

            return;

         

         var _dp:ICollectionView = ExcelExport.getDataProviderCollection(obj);

         if ( _dp == null )

            return;

            

         ExcelExport.exportToExcel(_dp, colsValues, defaultName);

      }

      

      /**

       * 

       * Realiza la exportacion de datos a excell

       * 

       * @param obj      Referencia a un objeto con datos a exportar

       * @param obj      Nombre default del archivo

       * @param params   Datos opcionales dependiendo de lo que se quiera exportar.

       * 

       */

      static public function export(obj:Object, defaultName:String, params:Object = null):void

      {

         if (obj == null || defaultName == null || defaultName == "")

         {

            return

         }

         else if ( obj is ChartBase )

         {

            ExcelExport.fromChart(

                     obj as ChartBase, 

                     defaultName, 

                     params

                     );

         }

         else if (obj is DataGrid || obj is AdvancedDataGrid || obj is OLAPDataGrid)

         {

            ExcelExport.fromGrid(

                        obj, 

                        defaultName, 

                        params

                        )

         } 

         else if (obj is XML || obj is XMLList || obj is Array || obj is ICollectionView)

         {

            ExcelExport.fromObject(

                        obj, 

                        defaultName,

                        params

                        );

         }

         

         return;

      }

      

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

      // Private function

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

      /**

       * 

       * Genera el archivo excel a partir de una colección de datos

       * 

       * @param obj          Colección de datos

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

       * 

       */

      static private function exportToExcel(obj:ICollectionView, colsValues:Array, defaultName:String):void

      {

         if ( obj == null || colsValues == null || colsValues.length == 0)

            return;

         

         var rows:Number = 0;

         var cols:Number = 0;

         var cantCols:Number = colsValues.length;

         var sheet:Sheet = new Sheet();

         sheet.resize(obj.length, colsValues.length);

         

         for ( ; cols < cantCols; cols++)

         {

            sheet.setCell(rows, cols, colsValues[cols].header);

         }

         

         cols = 0;

         rows++;

         var cursor:IViewCursor = obj.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, defaultName);

      }

      /**

       * 

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

         }

         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;

         }

         else if ( obj is Object )

         {

            return new ArrayCollection([obj]);

         }

         else

         {

            return null;

         }

      }

      

      /**

       * {header:nombre de la columna, value:nombre de la propiedad del objeto}

       */

      static private function generateColsValues(dp:Array, headerName:String, valueName:String, extraColumsBefore:Array = null, extraColumnsAfter:Array = null):Array

      {

         var cant:Number = dp.length;

         var colsValues:Array = [];

         var fieldT:String;

         var headerT:String;

         

         for (var i:Number = 0; i < cant; i++)

         {

            if (dp[i].hasOwnProperty(headerName) && dp[i].hasOwnProperty(valueName))

            {

               headerT = dp[i][headerName];

               fieldT = dp[i][valueName];

               if ( fieldT == null || fieldT == "" || headerT == null || headerT == "")

                  continue; 

               colsValues.push({

                           header:headerT,

                           value:fieldT

               });

            }

         }

         

         if ( extraColumsBefore && extraColumsBefore.length > 0 )

            colsValues = extraColumsBefore.concat(colsValues)

         if ( extraColumnsAfter && extraColumnsAfter.length > 0 )

            colsValues = colsValues.concat(extraColumnsAfter);

         

         return colsValues;

      }

   }

}


Bueno, si alguien puede ayudar en probar todas las funcionalidades con mas exhaustividad de las q probe yo, seria de gran ayuda para toda la comunidad.

Test a probar
-Exportar desde: AdvancedDataGrid, OLAPDataGrid, XMLList, XMLListCollection

Desarrollo faltante
-Verficar la correcta internacionalizacion. Que permita generar archivos excel en UTF-8 para los acentos y las ñ.


Avisen si se les ocurre alguna funcionalidad nueva

Saludos!
Por: alfathenus
Que tal...
es muy buena esta libreria sin embargo como ya han comentado, no respeta acentos ni la letra ñ, asi que por favor si alguien sabe como solucionar eso que lo comparta con los demas :D:D:D

espero que alguien ya lo haya solucionado y lo publique ;)

saludos ;)
Por: magoisp-blog

magoisp-blog :

Que tal...
es muy buena esta libreria sin embargo como ya han comentado, no respeta acentos ni la letra ñ, asi que por favor si alguien sabe como solucionar eso que lo comparta con los demas :D:D:D

espero que alguien ya lo haya solucionado y lo publique ;)

saludos ;)



Como andas, si, no acepta la puntuacion clasica española... pero bueno, como nadie aporto... aca les paso la solucion:

En el archivo "ExcelFile.as" de la libreria de excel, en la linea 256, reemplacen este codigo:

Código :

cell.data.writeByte(0);
cell.data.writeByte(0);
cell.data.writeByte(0);
var len:uint = String(value).length;
cell.data.writeByte(len);
cell.data.writeUTFBytes(value);

por este nuevo:

Código :

var charset:String = "utf-16";
cell.data.writeByte(0);
cell.data.writeByte(0);
cell.data.writeByte(0);
var ba:ByteArray = new ByteArray();
ba.writeMultiByte(String(value),charset);
cell.data.writeByte(ba.length);
cell.data.writeMultiByte(String(value),charset);



Ahora acepta utf-16, practicamente cualqueir caracter de cualqueir idioma (salvo chino, arabe y esos lenguajes.... si necesitas q soporte eso simplemente cambia el charset y listo).

Espero q les sirva

Saludos!!

PD: voy a ir tratando de agregarle soporte para generar archivos de excels de versiones mas nuevas... pero bueno eso se hara de a poco...
Por: alfathenus
gracias por responder alfathenus...
ya modifique lo que me dijiste y efectivamente ahora si me respeta los acentos y la lertra ñ pero tiene un pequeño defecto :D:D

me pone un espacio despues de cada caracter, por ejemplo quiero exportar la palabra Sánchez, y lo que me resulta en la celda de Excel es: "S á n c h e z "....

sabes algo acerca de eso???

espero puedas ayudarme con eso

saludos ;)
Por: magoisp-blog
MMM q raro a mi no me paso.... voy a investigar

Saludos!
Por: alfathenus
que tal, estuve checando el archivo xls que se genera y al parecer no son espacios lo que te comentaba en el post anterior, me supongo que debe ser algun otro caracter o algo asi....

si copio varias celdas y las pego en word me lo pone correcto, sin espacios en una tabla, pero si eligo en las opciones de pegado 'conservar solo texto' solo pone la primera letra....
esto es lo mismo para una sola celda, si la copio y la pego en word lo pone correcto, por ejemplo en la celda de Excel aparece algo como esto "D a v i d", entonces selecciono la celda y le doy copiar y la pego en word ya pone "David" pero si le digo consercvar solo texto solo pone "D"... esto es seleccionando la celda, si selecciono el texto que esta dentro de la celda solo pone la primera letra....

esto solo sucede con los campos 'label' porque los numeros estan correctos...

no se como podria enviarte mi archivo xls generado para que lo checaras, igual te enviaria el ExcelFile.as que es donde debe estar el problema...

mi correo es marspiii[a]hotmail.com

espero me haya explicado y me puedas ayudar ....

saludos ;)...
Por: magoisp-blog
Hola de nuevo :D:D:D

ps dejando otro post :D:D

parece ser que ya se soluciono el problema que tenia...

en el archivo ExcelFile.as importe la clase File: import flash.filesystem.File;

y en el codigo que modificaste cambie el charset (utf-16) por File.systemCharset, [que en mi caso (Windows Vista) es 'windows-1252' (Europeo occidental)] de la siguiente forma:

var charset:String = File.systemCharset;

espero que al cambiar de SO no haya problema.....

ps si encuentras otra solucion sera bien aceptada :D:D

gracias y saludos ;D
Por: magoisp-blog
Hola magoisp-blog, buen agregado

El unico problema que veo es q la clase File solo esta disponible para AIR, porq lo q no seria la mejor solucion.

Aun no pude ver eso de los espacios q mencionas, en estos dias me voy a fijar, y voy a tratar de arreglar esto junto con otras mejoras q ya tengo en mente (por ej q reconozca los itemrenderers de las columnas y cosas asi).

Saludos y muhcas gracias por la ayuda y si queres agregarle funcionalidades o arreglar algun error me serias de mucha ayuda :)
Por: alfathenus
es cierto, como estoy desarrollando en Air se me paso ese detalle :D ...

por lo de los espacios si quieres puedo pasarte los archivos de excel que me genero para que los cheques tu...

y por otra parte me gustaria ayudar, pero soy algo novato en esto :D, no se si les maracaba un error al abrir los archivos de excel que decia fin del archivo y nadamas no los cargaba... si es asi la solucion esta aca
http://code.google.com/p/as3xls/issues/detail?id=4

y por ultimo :D:D
no se si con esta libreria se pueden formatear las columnas en el archivo de excel a erxportar, algo como ancho de columna, fuente, combinar columnas o algo asi....

si se puede ps haganlo saber jeje
[magoisp-blog]

saludos ;)
Por: isantos
Si se puede hacer, pero hay q seguir desarrollando el subproyecto de parseo de BIFF, aca explican los bytes q serian de cada cosa, lo estuve leyendo pero aun no pude hacer muchas pruebas... http://sc.openoffice.org/excelfileformat.pdf


saludos y muchas gracias por el aporte :)
Por: alfathenus
gracias por ese pdf, esper sacarle el mayor provecho :D:D

si hago algo lo posteo aqui ;)

saludos ;)
Por: isantos
1120: Access of undefined property ExcelExporterUtil. audi/src audi.mxml line 25

Me esta dando ese error, no se que se debe ese error, he creado el archivo excel y he puesto el codigo como esta.

Saludos!!
Por: drakon0
@drakon: no esta encontrando la clase, ¿le pusiste bien el nombre de la clase? ¿estas importando correctamente la clase?

Saludos!
Por: alfathenus
la verda no se, he creado un proyecto con el nombre test y dentro del mxml he puesto como lo tienes arriba y despues he creado una clase con el nombre class.as y le he puesto tambien igual como lo tienes arriba, pero ese archivo lo he puesto junto con el mxml, no se si la clase debe de ir en el directorio lib.
Por: drakon0
Fijate q el nombre del archivo debe ser igual al de la clase, lo mismo para la ruta de directorios debe coincidir con el package.


Saludos!
Por: alfathenus
Puedes poner un link para descargar el ejemplo directamente?
Gracias!
Por: Esteban-blog
Si el advancedatagrid tiene columnas con propiedad visible=false como logro obtener la exportacion al excel suprimiendo dichas columnas?

Gracias por cualquier aporte
Por: hector-blog
Hola hector, mmm si se puede... habria q modificar el codigo para q no agrege las columnas q estan ocultas.... si tenes ganas de hacerlo ;)
Por: alfathenus
Esta bueno el aporte, alguien conoce alguna forma de realizar la misma operación pero en proyectos Web de Flex.

He estado consultando y casi todo es basado en otros lenguajes, por lo general php, lo que hacen es mandar los datos a php y realizan la exportación a Excel y después devuelven el archivo a Flex, esto no me parece una buena forma de hacer la exportación.

Si saben de algo cuentan
Por: Luis Gabriel Correa-blog
Luis, esta clase hace todo el trabajo desde Flex sin intervencion del servidor.

Saludos!
Por: alfathenus
¿Ya hicieron la prueba con 'iso-8859-1'?

Ya pudimos exportar a excel aunque nos encontramos con otro problema. En un reporte no nos reconoce el getrows, si encontramos solución lo publico.

Gracias
Por: Yaz-blog
Cual error? por favor, describilo bien asi puedo darte una mano, saludos!
Por: alfathenus
Voy a ver si subo el proyecto a google code asi hay un bug traker....

saludos!
Por: alfathenus
Disculpa amigo soy nuevo en flex y queria saber si puedes decirme como instalo estos archivos que arriba mencionas para poder exportar a excel....
Por: Mario-blog
alguna alternativa para que funcione con Flex 3.0???? no exite FileReference.save
Por: Figux-blog
@Figux: El FileReference.save no tiene nada q ver con Flex 3.0.... sino q hay q utilizar el flashplayer 10 y exportar el proyecto flex para esa version de reproductor.
Te recomiendo igual q utilices el ultimo sdk, el 3.3, es mucho mas estable y corrige muchisimos bus.

(Creo q a lo q vos llamasn Flex 3.0 intestas decir flex builder 3 no???)

@Mario: tenes q entrar a la pag del proyecto en google code y bajarte la libreria q detallo en el tip y luego bajarte las clases que coloque en el tip y listo.... nose si eso te ayude o necesitas algo mas, avisa cualquier cosa y veo si puedo colgar en algun lado un proyecto ya configurado con todas las librerias.


Saludos!
Por: alfathenus
Pues si no es mucho trabajo podrias colgar algun ejemplo para poder verlo y asi checarlo me ayudaria mucho... Gracias y Saludos.
Por: Mario-blog
Yo he estado probando tmb este codigo y no lo he hecho funcionar, si pudieras poner el ejemplo online para ver el codigo y ver en que estoy fallando.

Saludos.
Por: Enrique Sanchez-blog
Buenas

Esta noche colgare el proyecto en google code, mientras tanto, le dejo como utilizar las clases.

1. Copiar las clases
2. PAra exportar un datagrid es de la siguiente manera:

Código :

ExcelExport.fromGrid(this.dg, "prueba_excel_datagrid.xls"); 

3. Para exportar un grafico seria asi:

Código :

ExcelExport.export(this.Areachart, "prueba_excel_chart.xls", {colsValues:[{header:"Month", value:"Month"}]}) 


Saludos!
Por: alfathenus
Gracias por responder tienes razon, me refiero a que no tenia el SDK 3.3 ya lo baje de adobe lo instale en Flex Builder pero me sigue apareciendo el mismo error.

1061: Call to a possibly undefined method save through a reference with static type flash.net:FileReference. InteresSimple/src/utils ExcelExporterUtil.as
Por: Figux-blog
Figux yo tenia el problema del File Reference.save y lo que hice que entrar al menu:

PROJECT - PROPERTIES y en la opción de Flex Compiler y abajo aparece la version de flash en la que estas compilando, para usar el .save tienes que tener 10.0.0 y ya con eso debe funcionar
Por: Tavo-blog
Oye disculpa ya pude correr el primer ejemplo pero cuando le agregas un registro mas al ArrayCollection y despues lo exportas... el ultimo registro ya no lo trae en el excel...

Saludos.
Por: Mario-blog
Para que muestre el último registro solo se agrega lo siguiente:

sheet.resize(obj.length+1, colsValues.length);

a la funcion exportToExcel
Por: Omar-blog
En el ultimo ejemplo que pones para llamar la clase pones asi con solo dos parametros:

ExcelExport.fromGrid(this.dg, "prueba_excel_datagrid.xls");


Pero en la ultima clase que pusiste (la refactorizada) tu definicion la tienes asi:}

static public function fromGrid(grid:*, defaultName:String, params:Object):void


Por lo cual como es de esperarse, me marca el siguien error:


"1136: Incorrect number of arguments. Expected 3. test test.mxml line 31 1245101973562 1814"


Cual es el tercer parametro?. Te comento que la primer clase si trabaja bien.
Por: sergestux
Hola

Fijate en la documentacion de la clase, ahi esta especificado q es lo q se le tiene q pasar. es un objeto simple, un Object (en la documentacion se especifica ese objeto), o bien le podes pasar null.


Saludos!
Por: alfathenus
Gracias Omar quedo resuelto lo de la ultima linea...
Por: Mario-blog
Gente actualice la libreria... la pueden bajar desde mi blog http://www.cristalab.com/tips/exportar-datos-de-flex-a-excel-c70300l/


Saludos!
Por: alfathenus
quisiera agregar la funcionalidad de darle formato a la celda pero no se por donde empezar. Alguien podría ayudarme?
Por: elBarto
Hola elBarto.

El tema es asi.. hay q leer la especificacion de BIFF y ver cuales bytes hay q configurar para q acepte la configuracion de formato...

Tengo algo por ahi hecho para poderle darle color a las celdas, hacer merges de celdas y algo mas, voy a ver cuando tengo tiempo en juntar todo...


Saludos!
Por: alfathenus
muchas gracias..pero necesito uno que me escriba desde FLEX en un archivo .xls POR FAVOR AYUDENME GRACIAS!!!
Por: milton-blog
ya lo encontraste Milton
Por: sergestux
Milton, justamente esto es lo que hace esta libreria.... saludos!
Por: alfathenus
me ayudo mucho tu programa, pero me causa un problema. tengo un Grid con Strings largos de varias lineas en una celula. cuando exporto a Excel, solo una parte del texto de la celula es insertada en Excel.

el largo del string que sí llega a Excel varía y tampoco lo corta en el primer break de linea o algo asi.

alguien conoce el problema?
Por: yoni-blog
Estoy trabajando con esta clase, y por consiguiente "mejorandola" un poquito. Para que no exporte las columnas con visible = false. Solo tienen que modificar la linea:

if ( fieldT == null || fieldT == "" || headerT == null || headerT == "" )

Que está en el método:

static public function dataGridExporter(dg:DataGrid, defaultName:String):void

Por esta otra linea:

if ( fieldT == null || fieldT == "" || headerT == null || headerT == "" || dg.columns[cols].visible == false)

A medida que vaya viendo otras cosas (formato de celdas, etc) lo iré subiendo.

Saludos.
Por: Fernando-blog
Hola, sabes que he intentado por todos los medios de hacer funcionar la appl.
Baje el proyecto de donde me dijiste, luego cree el mxml, luego, cree la función, pero aun así no me funciona. me da este error.
1120: Access of undefined property ExcelExport.
Primero nombraste la clase así ExcelExporterUtil luego ExcelExport. la verdad estoy confundido, porque cree el path en donde puse la clase y la referencio, es mas cuando la trato de usar y comienzo a escribir el autocompletado de Flex me muestra la función, pero despues me reclama como que no la encuentra.
Estoy confundido
Por: Luis Neira-blog
In the export function, the rows variable should not iterate after the cols variable is reset to 0. I needed to remove the rows++; line to get mine to save the last line of the datagrid to the Excel file.

Thanks alfathenus, and thanks to Babelfish for the translation. ;-)
Por: Turtleknee-blog
holaaa de donde puedo conseguir el archivo excelfile.as ??? ya que en la pagina del proyecto no solo veo un archivo de libreria compilada
Por: abraham-blog
que gran aporte muchas gracias :)
Por: Fabian Mejia-blog
Hola todos,
De antemano muchas gracias por el aporte

La siguiente pregunta tal vez este fuera de este contexto, pero de aqui nacio la necesidad.

Al tratar de implementar el proyecto de exportacion de datos en un datagrid a excel, me marco el error de FILEREFERENCE.SAVE que se menciona mas arriba, lei que es necesario tener el SDK 3.5 .

Al instalar el SDK 3.5 y tratar de abrir el proyecto en mencion no me muestra en modo diseño los controles que tiene la aplicacion, y es imposible ejecutarla, asi mismo aparece un mensaje que dice "THIS COMPONENT IS BASED ON APPLICATION, WICH IS NOT A VISUAL COMPONENT. SWITCH TO SOURCE MODE TO EDIT IT"

Alguien tiene alguna sugerencia?

He esta buscando informacion al respecto pero solo encuentro las instrucciones de instalacion en Adobe.com

Agradezco su apoyo

Saludos

Jonathan
Por: jonathanglez
Solucionado Post anterior

Tenia instalado el flex builder 3.0.1 , lo actualice a 3.0.2 y listo

saludos a todos
Por: jonathanglez
Me he de bajar el SWC?
Y como se integra al projecto?

Saludos!!
Por: segma-blog
un pequeño aporte:

Me vi en la necesidad de utilizar esto en Adobe Air y para guardarlo en el escritorio sólo fue necesario modificar las siguientes lineas dentro de la función: 'export' para guardar el ByteArray:

Código :


//var fr:FileReference = new FileReference();          

//fr.save(bytes, defautlName);      

// set an filename

var filename:String = defautlName;

var file:File = File.desktopDirectory.resolvePath( filename );

var wr:File = new File( file.nativePath );

var stream:FileStream = new FileStream();

stream.open( wr , FileMode.WRITE);

stream.writeBytes ( bytes, 0, bytes.length );

stream.close();



Como pueden ver sólo comenté las líneas que ya no fueron necesarias.
Saludos.
Por: Arc_Daniel
Que tal, primero que todo agradecer el tip que es fabuloso, ya implemente esta funcionalidad, pero tengo un problema, tengo un Data Grid con Imagenes, y quisiera saber si estas se pueden exportar a Excel, saludos.
Por: Alcome-blog
Deja un comentario
IMPORTANTE

Recuerda ser respetuoso, no insultes a otras personas, ni uses palabrotas, hay una persona al otro lado de la pantalla.

Habla bien, NO ESCRIBAS EN MAYUSCULA TODO, no escribas como en un SMS, evita cosas como "ke", "x q" y demás abreviaciones.

Aquí funcionan las etiquetas de los foros, puedes usar [b] para negrita, [img] para las imágenes, [url] para los enlaces, etc.

Si tienes preguntas técnicas, envíalas mejor al foro.