Flex界面DateGrid数据导出Excel表格

   使用as3xls-1.0.1.SWC包做的Flex界面DateGrid数据导出Excel表格

[color=red]注意

1.FileReference的save方法在Flash10才支持,在Flex工程上右键,属性,Flex Conpiler中把Require Flash Player version:填为10.0.0。
2.生成的Excel为旧版本,需要微软office才能打开,金山WPS版本不兼容。
3.as3xls-1.0.1.SWC解决as3xls-1.0.swc的中文乱码问题,附件提供。
as工具类:Util.as
package lzr.util
{
	        import com.as3xls.xls.Cell;
            import mx.collections.ArrayCollection;
            import flash.events.*;
            import flash.net.FileReference;
            import com.as3xls.xls.Sheet;
            import com.as3xls.xls.ExcelFile;
            import mx.controls.Alert;
            import mx.controls.DataGrid;
            import mx.controls.dataGridClasses.DataGridColumn;
            import flash.utils.ByteArray;
            import mx.controls.Alert;
	public class Util
	{
		public function Util()
		{
		}
		   /**导出Excel表格函数,参数为DataGrid**/
           public static function exportToExcel(myDg:DataGrid):void
            {  
            
               var fields:Array = new Array(); 
               /**生成表对象sheet**/
		        var sheet:Sheet= new Sheet();
		        
                var dataProviderCollection:ArrayCollection =myDg.dataProvider as ArrayCollection;
                /**获得表格的行数**/
                var rowCount:int =  dataProviderCollection.length;
                  /**设置表格的行数(rowCount+1),列数(myDg.columnCount)**/
                sheet.resize(rowCount+1,myDg.columnCount);
                /**获得DateGrid列的内容**/
                var columns:Array = myDg.columns; 
                /**循环设置列名的值**/
                var i:int = 0; 
                for each (var field:DataGridColumn in columns)
                {  
                    fields.push(field.dataField.toString()); 
                    /**第一行的值,取值为myDg的headerText**/
                    sheet.setCell(0,i,field.headerText.toString()); 
                    i++; 
                }
                /**循环设置行的值**/
                for(var r:int=0;r<rowCount;r++)
                {
                    /**获得dataProviderCollection的每行Item的对象**/
                    var record:Object =dataProviderCollection.getItemAt(r);
                    /**调用回调函数写入sheet**/
                    insertRecordInSheet(r+1,sheet,record);
                }
                /**生成Excel文件**/
                var xls:ExcelFile = new ExcelFile();
                /**将sheet写入Excel文件中**/
                xls.sheets.addItem(sheet);
                /**将xls对象转换为ByteArray流对象**/
                var bytes: ByteArray = xls.saveToByteArray();
                /**生成新文件域**/
                var fr:FileReference = new FileReference();
                 /**将bytes流对象保存到文件域**/
                fr.save(bytes,"SampleExport.xls");
                
                /**回调函数**/
                function insertRecordInSheet(row:int,sheet:Sheet,record:Object):void
            {
                var colCount:int = myDg.columnCount;
                for(var c:int; c < colCount; c++) 
                { 
                    var i:int = 0; 
                    for each(var field:String in fields)
                    { 
                        for each (var value:String in record)
                        { 
                        	/**循环判断myDg列名域值record[field]与value是否相等**/
                            if (record[field].toString() == value) 
                            /**写入表格中**/
                                sheet.setCell(row,i,value); 
                        } 
                        i++; 
                    } 
                }
            }
            }
	}
}



mxml界面 Test.mxml

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" creationComplete="init();">
    <mx:Script>
        <![CDATA[
         
           
            
            [Bindable]
            private var dg:Array;
            
            [Bindable] 
            private var fields:Array = new Array(); 
            private function init():void
            {
                dg=new Array();
                for(var i:int=0;i<5;i++)
                {
                    //ItemName/ItemCost/ItemQty/ItemPrice
                    var tempArray:Array = new Array();
                    tempArray.ItemName="测试"+i;
                    tempArray.ItemCost="调试"+i;
                    tempArray.ItemQty="ItemQty^^"+i;
                    tempArray.ItemPrice="ItemPrice^^"+i;
                    dg.push(tempArray);
                }
                
            }
            public function exportTo():void
            {
            	 ///调用Util类的静态方法
                Util.exportToExcel(myDg);
            }
        ]]>
    </mx:Script>
    <mx:DataGrid id="myDg" x="78" y="55" width="533" height="157"  dataProvider="{dg}">
        <mx:columns>
            <mx:DataGridColumn headerText="ItemName" dataField="ItemName"/>
            <mx:DataGridColumn headerText="ItemCost" dataField="ItemCost"/>
            <mx:DataGridColumn headerText="ItemQty" dataField="ItemQty"/>
            <mx:DataGridColumn headerText="ItemPrice" dataField="ItemPrice"/>
        </mx:columns>
    </mx:DataGrid>
    <mx:Button id="myBtn" x="619" y="113" label="exporttoexcel" click="exportTo();"/>   
</mx:Application>


你可能感兴趣的:(Flex,Excel,Flash,Office,金山)