实现原理:使用as3xls这个lib,将当前页面上的AdvancedDataGrid或者Datagrid导出到excel中,效果如下
关键代码
ExportToExcel.as
package
{
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.AdvancedDataGrid;
public final class ExportToExcel
{
public function ExportToExcel()
{
super();
}
static public function dataGridExporter(dg:AdvancedDataGrid, 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;
ExportToExcel.export(dg.dataProvider, colsValues, defaultName);
}
static public function export(obj:Object, colsValues:Array, defautlName:String):void
{
var _dp:ICollectionView = ExportToExcel.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);
}
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;
}
}
}
}
test.mxml
<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" minWidth="955" minHeight="600" creationComplete="application1_creationCompleteHandler(event)">
<s:layout>
<s:VerticalLayout verticalAlign="middle" horizontalAlign="center"/>
</s:layout>
<fx:Script>
<![CDATA[
import com.as3xls.xls.ExcelFile;
import com.as3xls.xls.Sheet;
import mx.collections.ArrayCollection;
import mx.collections.HierarchicalData;
import mx.controls.Alert;
import mx.controls.DataGrid;
import mx.events.FlexEvent;
[Bindable] private var resourceCollection:ArrayCollection;
private var myData:XML;
protected function application1_creationCompleteHandler(event:FlexEvent):void
{
myData = <root>
<node>
<id>01</id>
<name>汽车分类</name>
<type>汽车</type>
<children>
<id>01-1</id>
<name>宝马</name>
<type>汽车</type>
</children>
</node>
<node>
<id>02</id>
<name>书籍分类</name>
<type>书籍</type>
<children>
<id>02-1</id>
<name>数学</name>
<type>书籍</type>
</children>
<children>
<id>03-1</id>
<name>语文</name>
<type>书籍</type>
</children>
</node>
</root>
resourceCollection = new ArrayCollection();
for(var i:int=0;i<myData.node.length();i++) {//遍历一级节点
var obj:Object = new Object();
obj.id = myData.node[i].id;
obj.name = myData.node[i].name;
obj.type = myData.node[i].type;
var arr:Array = new Array();
for(var j:int=0;j<myData.node[i].children.length();j++) {//遍历二级节点
var obj2:Object = new Object();
obj2.id = myData.node[i].children[j].id;
obj2.name = myData.node[i].children[j].name;
obj2.type = myData.node[i].children[j].type;
arr.push(obj2);
}
obj.children = arr;
resourceCollection.addItem(obj);
}
adg.dataProvider = new HierarchicalData(resourceCollection);
//adg.displayItemsExpanded=true;
}
protected function button1_clickHandler(event:MouseEvent):void
{
// TODO Auto-generated method stub
adg.displayItemsExpanded=true; //导出前展开所有节点 否则只能导出当前展示节点
adg.validateNow(); //刷新 展开后需要进行刷新
ExportToExcel.dataGridExporter(adg,"test.xls");
}
]]>
</fx:Script>
<fx:Declarations>
<!-- 将非可视元素(例如服务、值对象)放在此处 -->
</fx:Declarations>
<mx:Button label="导出" click="button1_clickHandler(event)"/>
<mx:AdvancedDataGrid id="adg">
<mx:columns>
<mx:AdvancedDataGridColumn dataField="id"/>
<mx:AdvancedDataGridColumn dataField="name" headerText="名称"/>
<mx:AdvancedDataGridColumn dataField="type" headerText="类型"/>
</mx:columns>
</mx:AdvancedDataGrid>
</s:Application>
全部源代码下载: