flex前端+java后台实现Flex导出Excel的两种方法,

本文介绍两种从Flex界面的AdvancedDataGrid导出数据至Excel的方法:一是利用as3xls库直接在客户端导出;二是通过调用JSP或Servlet在服务器端生成Excel文件。

Flex前端+Java后台,要将Flex界面中AdvancedDataGrid的数据导出成Excel文件。有2种方法: 

1.直接在前台导出。 
    使用开源项目as3xls,下载个解决了中文乱码的as3xlsUTF8.swc包,加到Flex工程的引用库中。 
    AS代码,点击“导出Excel”按钮后的函数:

Java代码  复制代码  收藏代码
  1. var sheet:Sheet = new Sheet();   
  2. private function export2ExcelHandel(e:MouseEvent):void  
  3. {   
  4.     //在前台生成Excel   
  5.     var excelFile:ExcelFile=new ExcelFile();   
  6.     var arr:ArrayCollection=myTable.dataProvider as ArrayCollection;   
  7.     for(var i:int=0; i<arr.length; i++)   
  8.     {   
  9.         var obj:Object=arr[i];   
  10.         var j:int=0;   
  11.         for(var key:String in obj)   
  12.         {   
  13.             excelFile.sheets.addItem(generateSheet(0,j,key));      
  14.             excelFile.sheets.addItem(generateSheet(i,j,obj[key]));   
  15.             j++;   
  16.         }   
  17.     }          
  18.     var mbytes:ByteArray=excelFile.saveToByteArray();   
  19.     var file:FileReference=new FileReference();   
  20.     file.save(mbytes,"测试文件.xls");    
  21. }   
  22.                
  23. function generateSheet(i:int,j:int,o:Object):Sheet{   
  24.     if(!sheet){       
  25.         sheet = new Sheet();       
  26.         sheet.resize(10,10);       
  27.     }       
  28.     sheet.setCell(i, j, String(o));       
  29.     return sheet;       
  30. }      
Java代码   收藏代码
  1. var sheet:Sheet = new Sheet();  
  2. private function export2ExcelHandel(e:MouseEvent):void  
  3. {  
  4.     //在前台生成Excel  
  5.     var excelFile:ExcelFile=new ExcelFile();  
  6.     var arr:ArrayCollection=myTable.dataProvider as ArrayCollection;  
  7.     for(var i:int=0; i<arr.length; i++)  
  8.     {  
  9.         var obj:Object=arr[i];  
  10.         var j:int=0;  
  11.         for(var key:String in obj)  
  12.         {  
  13.             excelFile.sheets.addItem(generateSheet(0,j,key));     
  14.             excelFile.sheets.addItem(generateSheet(i,j,obj[key]));  
  15.             j++;  
  16.         }  
  17.     }         
  18.     var mbytes:ByteArray=excelFile.saveToByteArray();  
  19.     var file:FileReference=new FileReference();  
  20.     file.save(mbytes,"测试文件.xls");   
  21. }  
  22.               
  23. function generateSheet(i:int,j:int,o:Object):Sheet{  
  24.     if(!sheet){      
  25.         sheet = new Sheet();      
  26.         sheet.resize(10,10);      
  27.     }      
  28.     sheet.setCell(i, j, String(o));      
  29.     return sheet;      
  30. }      


FileReference的save方法在Flash10才支持, 
在Flex工程上右键,属性,Flex Conpiler中把Require Flash Player version:填为10.0.0;在Flex Build Path中加入playerglobal.swc 
,路径为…\sdks\3.2.0\frameworks\libs\player\10\playerglobal.swc 

2.通过调JSP或Servlet导出。 
AS代码:

Java代码  复制代码  收藏代码
  1. public static function ToExcel(dg:AdvancedDataGrid,name:String)   
  2. {   
  3.     //调用JSP   
  4.     var url:String="http://localhost:8080/XXX/Export/ExcelExport.jsp";   
  5.     var variables:URLVariables = new URLVariables();    
  6.     variables.htmltable = convertDGToHTMLTable(dg);   
  7.     var u:URLRequest = new URLRequest(url);   
  8.     u.data = variables;   
  9.     u.method = URLRequestMethod.POST;   
  10.     navigateToURL(u,"_self");    
  11. }   
  12.   
  13. private static function convertDGToHTMLTable(dg:AdvancedDataGrid):String {   
  14.     //Set default values   
  15.     var font:String = dg.getStyle('fontFamily');   
  16.     var size:String = dg.getStyle('fontSize');   
  17.     var str:String = '';   
  18.     var colors:String = '';   
  19.     var style:String = 'style="font-family:'+font+';font-size:'+size+'pt;"';                   
  20.     var hcolor:Array;   
  21.           
  22.     //Retrieve the headercolor   
  23.     if(dg.getStyle("headerColor") != undefined) {   
  24.         hcolor = [dg.getStyle("headerColor")];   
  25.     } else {   
  26.         hcolor = dg.getStyle("headerColors");   
  27.     }                   
  28.           
  29.     str+= '<head><meta http-equiv="Content-Type" content="text/htm; charset=utf-8"></head><table width="'+dg.width+'" border="1"><thead><tr width="'+dg.width+'" style="background-color:#' +Number((hcolor[0])).toString(16)+'">';   
  30.     for(var i:int = 0;i<dg.columns.length;i++) {   
  31.         colors = dg.getStyle("themeColor");               
  32.         if(dg.columns[i].headerText != undefined) {   
  33.             str+="<th "+style+">"+dg.columns[i].headerText+"</th>";                     
  34.         } else {   
  35.             str+= "<th "+style+">"+dg.columns[i].dataField+"</th>";   
  36.         }   
  37.     }   
  38.     str += "</tr></thead><tbody>";   
  39.     colors = dg.getStyle("alternatingRowColors");   
  40.     for(var j:int =0;j<dg.dataProvider.length;j++)    
  41.     {                       
  42.         str+="<tr width=\""+Math.ceil(dg.width)+"\">";   
  43.                   
  44.         for(var k:int=0; k < dg.columns.length; k++) {   
  45.             if(dg.dataProvider.getItemAt(j) != undefined && dg.dataProvider.getItemAt(j) != null) {                 
  46.                 if(dg.columns[k].labelFunction != undefined) {   
  47.                     str += "<td width=\""+Math.ceil(dg.columns[k].width)+"\" "+style+">"+dg.columns[k].labelFunction(dg.dataProvider.getItemAt(j),dg.columns[k].dataField)+"</td>";   
  48.                 }    
  49.                 else {   
  50.                     str += "<td width=\""+Math.ceil(dg.columns[k].width)+"\" "+style+">"+dg.dataProvider.getItemAt(j)[dg.columns[k].dataField]+"</td>";   
  51.                 }   
  52.             }   
  53.         }   
  54.         str += "</tr>";   
  55.     }   
  56.     str+="</tbody></table>";   
  57.     return str;   
  58. }  
Java代码   收藏代码
  1. public static function ToExcel(dg:AdvancedDataGrid,name:String)  
  2. {  
  3.     //调用JSP  
  4.     var url:String="http://localhost:8080/XXX/Export/ExcelExport.jsp";  
  5.     var variables:URLVariables = new URLVariables();   
  6.     variables.htmltable = convertDGToHTMLTable(dg);  
  7.     var u:URLRequest = new URLRequest(url);  
  8.     u.data = variables;  
  9.     u.method = URLRequestMethod.POST;  
  10.     navigateToURL(u,"_self");   
  11. }  
  12.   
  13. private static function convertDGToHTMLTable(dg:AdvancedDataGrid):String {  
  14.     //Set default values  
  15.     var font:String = dg.getStyle('fontFamily');  
  16.     var size:String = dg.getStyle('fontSize');  
  17.     var str:String = '';  
  18.     var colors:String = '';  
  19.     var style:String = 'style="font-family:'+font+';font-size:'+size+'pt;"';                  
  20.     var hcolor:Array;  
  21.          
  22.     //Retrieve the headercolor  
  23.     if(dg.getStyle("headerColor") != undefined) {  
  24.         hcolor = [dg.getStyle("headerColor")];  
  25.     } else {  
  26.         hcolor = dg.getStyle("headerColors");  
  27.     }                  
  28.          
  29.     str+= '<head><meta http-equiv="Content-Type" content="text/htm; charset=utf-8"></head><table width="'+dg.width+'" border="1"><thead><tr width="'+dg.width+'" style="background-color:#' +Number((hcolor[0])).toString(16)+'">';  
  30.     for(var i:int = 0;i<dg.columns.length;i++) {  
  31.         colors = dg.getStyle("themeColor");              
  32.         if(dg.columns[i].headerText != undefined) {  
  33.             str+="<th "+style+">"+dg.columns[i].headerText+"</th>";                    
  34.         } else {  
  35.             str+= "<th "+style+">"+dg.columns[i].dataField+"</th>";  
  36.         }  
  37.     }  
  38.     str += "</tr></thead><tbody>";  
  39.     colors = dg.getStyle("alternatingRowColors");  
  40.     for(var j:int =0;j<dg.dataProvider.length;j++)   
  41.     {                      
  42.         str+="<tr width=\""+Math.ceil(dg.width)+"\">";  
  43.                  
  44.         for(var k:int=0; k < dg.columns.length; k++) {  
  45.             if(dg.dataProvider.getItemAt(j) != undefined && dg.dataProvider.getItemAt(j) != null) {                
  46.                 if(dg.columns[k].labelFunction != undefined) {  
  47.                     str += "<td width=\""+Math.ceil(dg.columns[k].width)+"\" "+style+">"+dg.columns[k].labelFunction(dg.dataProvider.getItemAt(j),dg.columns[k].dataField)+"</td>";  
  48.                 }   
  49.                 else {  
  50.                     str += "<td width=\""+Math.ceil(dg.columns[k].width)+"\" "+style+">"+dg.dataProvider.getItemAt(j)[dg.columns[k].dataField]+"</td>";  
  51.                 }  
  52.             }  
  53.         }  
  54.         str += "</tr>";  
  55.     }  
  56.     str+="</tbody></table>";  
  57.     return str;  
  58. }  



ExcelExport.jsp放在后台XXX工程的WebRoot下的Export文件夹中。 
ExcelExport.jsp:

Java代码  复制代码  收藏代码
  1. <%@ page language="java"%>   
  2. <%@ page contentType="application/msexcel;charset=UTF-8"  
  3.     pageEncoding="UTF-8"%>   
  4. <%   
  5. request.setCharacterEncoding("UTF-8");   
  6. //String instr=request.getParameter("filename");   
  7. response.setHeader("Content-disposition","attachment; filename=excel.xls");   
  8. response.setCharacterEncoding("UTF-8");   
  9. String str = request.getParameter("htmltable");   
  10. out.print(str);   
  11. %>  
<?xml version="1.0" encoding="utf-8"?> <mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"> <mx:Script> <![CDATA[ import mx.controls.CheckBox; import mx.controls.Alert; import com.as3xls.xls.ExcelFile; import com.as3xls.xls.Sheet; import flash.filesystem.*; [Bindable] private var dp:Array = [ {idx:1, names: "test1", sex: "b" }, {idx:2, names: "test2", sex: "g" } ]; public function doSelect(o:Object):void { Alert.show("行的数据分别是:"+o.idx+"/"+o.names+"/"+o.sex); } private var sheet:Sheet; private function onCreate():void { var excelFile:ExcelFile = new ExcelFile(); sheet = new Sheet(); sheet.resize(10, 10); sheet.setCell(0, 0, "Today's date:"); sheet.setCell(0, 1, new Date()); excelFile.sheets.addItem(sheet); var mbytes:ByteArray = excelFile.saveToByteArray(); var stream:FileStream = new FileStream(); var docsDir:File = File.documentsDirectory.resolvePath("abc.xls"); // 定死文件名 try { docsDir.browseForSave("Save As"); docsDir.addEventListener(Event.SELECT, saveData); } catch (error:Error) { trace("Failed:", error.message) } function saveData(event:Event):void { var newFile:File = event.target as File; if (!newFile.exists) { var stream:FileStream = new FileStream(); stream.open(newFile, FileMode.WRITE); stream.writeBytes(mbytes); // 写文件流 stream.close(); } } } ]]> </mx:Script> <mx:Panel> <mx:Button label="导出" click="onCreate()"/> <mx:DataGrid id="dg1" dataProvider ="{dp}"> <mx:columns> <mx:DataGridColumn width="20" headerText="" > <mx:itemRenderer> <mx:Component> <mx:CheckBox change=" {outerDocument.doSelect(data as Object)} " /> </mx:Component> </mx:itemRenderer> </mx:DataGridColumn> <mx:DataGridColumn headerText="names" dataField="names" width="200" /> <mx:DataGridColumn headerText="sex" dataField="sex" width="300" /> </mx:columns> </mx:DataGrid> </mx:Panel> </mx:WindowedApplication>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值