Adaptación a spark DataGrid del método de exportación a Excel usando formatters:
package es.util {
import com.as3xls.xls.ExcelFile;
import com.as3xls.xls.Sheet;
import flash.errors.IllegalOperationError;
import flash.net.FileReference;
import flash.utils.ByteArray;
import mx.controls.dataGridClasses.DataGridListData;
import spark.components.DataGrid;
import spark.components.gridClasses.GridColumn;
public class FlexToExcel {
public function FlexToExcel() {
throw new IllegalOperationError ("Class "ExcelExporterUtil" is static. You can't instance this");
}
static public function exportDataGrid (dt:DataGrid, filename:String="excel.xls",
listData:DataGridListData=null):void {
var head:Array = new Array();
for each (var item:GridColumn in dt.columns.toArray()) {
head.push(item.headerText);
}
var data:Array = new Array();
for each (var obj:Object in dt.dataProvider) {
var arr:Array=new Array();
for each (var hd:GridColumn in dt.columns.toArray()) {
arr.push(hd.itemToLabel(obj));
}
data.push(arr);
}
export(head,data,filename);
}
static private function export(head:Array, data:Array,filename:String):void {
// Create sheet
var cols:int = head.length;
var rows:int = data.length+1;
var sheet:Sheet = new Sheet();
sheet.resize(rows,cols);
// Header
var row:int=0;
var col:int=0;
for each (var item:String in head) {
sheet.setCell(row,col,item);
col++;
}
// Data
row=1;
col=0;
for each (var dataRow:Array in data) {
for each (var dataCol:String in dataRow) {
sheet.setCell(row,col,dataCol);
col++;
}
col=0;
row++;
}
// Add sheet
var xls:ExcelFile = new ExcelFile();
xls.sheets.addItem(sheet);
var bytes:ByteArray = xls.saveToByteArray();
// Generate file
var fr:FileReference = new FileReference();
fr.save(bytes, filename);
}
}
}
Y una aplicación de uso:
<?xml version="1.0"?>
<s:Application
xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx">
<s:layout>
<s:VerticalLayout/>
</s:layout>
<fx:Script>
<![CDATA[
import es.util.FlexToExcel;
import mx.collections.ArrayCollection;
import spark.components.gridClasses.GridColumn;
[Bindable]
private var items:ArrayCollection = new ArrayCollection([
{nombre:"Andrés", apellido:"Sánchez", date:new Date()},
{nombre:"Mónica", apellido:"Sánchez", date:new Date()},
{nombre:"Agustina", apellido:"Sánchez", date:new Date()},
{nombre:"Pablo", apellido:"Sánchez", date:new Date()},
{nombre:"MagalÃ", apellido:"Sánchez", date:new Date()}
]);
private function exportToExcel():void {
FlexToExcel.exportDataGrid(dt);
}
private function getCompleteLabel (item:Object, column:GridColumn):String {
var result:String = "";
if (item != null) {
result = item.nombre + " " + item.apellido;
}
return result;
}
]]>
</fx:Script>
<fx:Declarations>
<s:DateTimeFormatter id="myFormatter" dateTimePattern="dd/MM/yyyy"
errorText="test error!"/>
</fx:Declarations>
<s:DataGrid id="dt" dataProvider="{items}" width="100%" height="100%">
<s:columns>
<s:ArrayList>
<s:GridColumn dataField="nombre" headerText="Nombre"/>
<s:GridColumn dataField="apellido" headerText="Apellido"/>
<s:GridColumn headerText="Completo" labelFunction="getCompleteLabel"/>
<s:GridColumn headerText="Fecha" dataField="date" itemRenderer="es.renderer.DateRenderer"
formatter="{myFormatter}"/>
</s:ArrayList>
</s:columns>
</s:DataGrid>
<s:Button label="Export" click="exportToExcel();" />
</s:Application>
Es importante, para los datos con caracteres no ASCII usar la versión de la librerÃa de dwj que corrije los problemas para estos caracteres (eñes, tildes, etc.).
Para los datos complejos con itemRenderer es aconsejable utilizar Formatter en el GridColumn para proporcionar la cadena del método itemToLabel.