flex中 AdvancedDataGrid、datagrid导出到excel

本文介绍如何使用as3xls库将Adobe Flex中的AdvancedDataGrid组件导出为Excel文件,包括关键代码解析和示例应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 实现原理:使用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>


 全部源代码下载:

http://download.youkuaiyun.com/source/3572356

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值