Flex的Web应用程序,经常有数据导出Excel的需求。我从前的处理方式为:FLex的DataGrid数据传入C#,在服务端处理生成Excel文件,之后再将生成的文件地址传回Flex,进行下载
这样做不仅在编程实现上较为麻烦,而且速度较慢,现在可直接通过Flex生成 Html格式的字符串,然后传入服务端的一个asxh文件中,输出到客户端浏览器,下面是代码
import flash.errors.*; |
import flash.events.*; |
import flash.external.*; |
import flash.net.URLRequest; |
import flash.net.URLVariables; |
|
/** |
* 作者:IT小金 |
* 时间:2011-09-07 |
* 功能:FLex DataGird生成HTML 导出Excel |
*/ |
|
/*将DataGird导出成HTML格式*/ |
private function convertDGToHTMLTable(dg:DataGrid): String { |
//设置默认参数 |
var font: String = dg.getStyle( 'fontFamily' ); |
var size: String = dg.getStyle( 'fontSize' ); |
var str: String = '' ; |
var colors: String = '' ; |
var style: String = 'style="font-family:' +font+ ';font-size:' +size+ 'pt;"' ; |
var hcolor: Array ; |
|
//设置标题行颜色 |
if (dg.getStyle( "headerColor" ) != undefined ) { |
hcolor = [dg.getStyle( "headerColor" )]; |
} else { |
hcolor = dg.getStyle( "headerColors" ); |
} |
|
//根据datagrid设置基础结构 |
str+= '<table width="' +dg.width+ '" border="1"><thead><tr width="' +dg.width+ '" style="background-color:#' + Number ((hcolor[ 0 ])).toString( 16 )+ '">' ; |
|
//设置列头 |
for ( var i: int = 0 ;i<dg.columns.length;i++) { |
colors = dg.getStyle( "themeColor" ); |
|
if (dg.columns[i].headerText != undefined ) { |
str+= "<th " +style+ ">" +dg.columns[i].headerText+ "</th>" ; |
} else { |
str+= "<th " +style+ ">" +dg.columns[i].dataField+ "</th>" ; |
} |
} |
str += "</tr></thead><tbody>" ; |
colors = dg.getStyle( "alternatingRowColors" ); |
|
|
//设置单元格数据,数据遍历DataGird |
for ( var j: int = 0 ;j<dg.dataProvider.length;j++) { |
str+= "<tr width=\"" +Math.ceil(dg.width)+ "\">" ; |
|
for ( var k: int = 0 ; k < dg.columns.length; k++) { |
|
if (dg.dataProvider.getItemAt(j) != undefined && dg.dataProvider.getItemAt(j) != null ) { |
if (dg.columns[k].labelFunction != undefined ) { |
str += "<td width=\"" +Math.ceil(dg.columns[k].width)+ "\" " +style+ ">" +dg.columns[k].labelFunction(dg.dataProvider.getItemAt(j),dg.columns[k].dataField)+ "</td>" ; |
|
} else { |
str += "<td width=\"" +Math.ceil(dg.columns[k].width)+ "\" " +style+ ">" +dg.dataProvider.getItemAt(j)[dg.columns[k].dataField]+ "</td>" ; |
} |
} |
} |
str += "</tr>" ; |
} |
str+= "</tbody></table>" ; |
|
return str; |
} |
|
|
/*接Asp。net中 ashx一般处理程序,输出html成Excel文件 |
*/ |
private function loadDGInExcel(dg:DataGrid,url: String ): void { |
|
var var iables:URLVariables = new URLVariables(); |
var iables.htmltable = convertDGToHTMLTable(dg); |
|
var u:URLRequest = new URLRequest(url); |
u.data = var iables; |
u.method = URLRequestMethod.POST; |
navigateToURL(u, "_self" ); |
} |
下面是在.net中建立的一个一般处理程序,代码如下
1 <%@ WebHandler Language="C#" Class="JinExcelExport" %> 2 3 using System; 4 using System.Web; 5 6 public class JinExcelExport : IHttpHandler { 7 8 public void ProcessRequest (HttpContext context) { 9 10 context.Response.ContentType = "application/vnd.ms-excel"; 11 context.Response.AddHeader("Content-Disposition", string.Format("attachment;filename=ExportExcel.xls")); 12 context.Response.Write(context.Request.Form["htmltable"]); 13 14 } 15 16 public bool IsReusable { 17 get { 18 return false; 19 } 20 } 21 22 }
希望对大家有帮助