论坛首页 编程语言技术论坛

DataGrid导出Excel

浏览 10199 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (7) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-11-24   最后修改:2009-12-09

      在Adobe的RIA开发环境下,flex并没有导出Excel的功能,在完成此类功能的时候,在网上Google了很多相关文章,其中提到了利用Flex将DataGrid的数据拼凑成字符串然后利用JSP获取字符串形成Excel文件,在浏览器端给用户提供Excel下载功能。

      以上就是DataGrid导出Excel的主要思想。主要代码如下:

 

1.Flex端生成字符串:

 

public final class ExportToExcel
	{
		public function ExportToExcel()
		{
			super();
		}
		
		/** 在导出数据的时候有可能出现单元格数据长度过长而导致Excel在显示时
		 *  出现科学计数法或者#特殊符号,在此设置单元格宽度比例WIDTHSCALE,在
		 *  代码中每个单元格的宽度扩展适当的比例值WIDTHSCALE。
		 */
		public static var WIDTHSCALE:Number=2.0;
		
		/**
		 * 将DataGrid转换为htmltable
		 * @author 陈文锋 54cwf@163.com 
		 * @param: dg 需要转换成htmltable的DataGrid
		 * @return: String
		 */
		public static function convertDGToHTMLTable(dg:DataGrid):String {
			//设置默认的DataGrid样式
			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;
			
			//检索DataGrid的 headercolor
			if(dg.getStyle("headerColor") != undefined) {
				hcolor = [dg.getStyle("headerColor")];
			} else {
				hcolor = dg.getStyle("headerColors");
			}				
			
			str+= '<table width="'+dg.width+'" border="1"><thead><tr width="'+dg.width+'" style="background-color:#' +Number((hcolor[0])).toString(16)+'">';
			
			//设置tableheader数据(从datagrid的header检索headerText信息)				
			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");
			
			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] as DataGridColumn).labelFunction != undefined) {
							str += "<td width=\""+Math.ceil((dg.columns[k] as DataGridColumn).width*ExportToExcel.WIDTHSCALE)+"\" "+style+">"+(dg.columns[k] as DataGridColumn).labelFunction(dg.dataProvider.getItemAt(j),dg.columns[k].dataField)+"</td>";
							
						} else {
							str += "<td width=\""+Math.ceil(dg.columns[k].width*ExportToExcel.WIDTHSCALE)+"\" "+style+">"+dg.dataProvider.getItemAt(j)[(dg.columns[k] as DataGridColumn).dataField]+"</td>";
						}
					}
				}
				str += "</tr>";
			}
			str+="</tbody></table>";
			
			return str;
		}
		
		/**
		 * 将制定的DataGrid加载到Excel文件,此方法传入一个htmltable字符串参数到后台Script脚本,然后浏览器给用户提供一个Excel下载
		 * @author Chenwenfeng
		 * @params dg 需要导入的数据源DataGrid
		 * @params url excel文件下载路径
		 */
		public static function loadDGInExcel(dg:DataGrid,url:String):void {
			
			//设置URLVariables参数变量,动态增加属性htmltable
			var variables:URLVariables = new URLVariables(); 
			variables.htmltable	= convertDGToHTMLTable(dg);
			
			
			var u:URLRequest = new URLRequest(url);
			u.data = variables;
			u.method = URLRequestMethod.POST;
			
			navigateToURL(u,"_self");//"_self" 指定当前窗口中的当前帧。 
			//"_blank" 指定一个新窗口。 
			//"_parent" 指定当前帧的父级。 
			//"_top" 指定当前窗口中的顶级帧。
		} 
	}

 

2.JSP代码:

<%@ page language="java"%>
<%@ page contentType="application/msexcel;charset=GBK"
    pageEncoding="UTF-8"%>
<%
request.setCharacterEncoding("UTF-8");
response.setHeader("Content-disposition","attachment; filename=DownLoad.xls");
String str = request.getParameter("htmltable");
out.print(str);
%>

    一般情况下将JSP文件放在工程的WebRoot/bin目录下,然后在调用AS类的loadDGInExcel函数,注意需要得到正确的Excel文件下载路径url.还有就是JSP的设置问题,setHeader函数的第二个参数attachment表示会有下载提示框出现,若换成inline(似乎是这个单词)则没有下载提示框,浏览器会直接打开Excel文件

 

 

PS:在开始的时候还出过Excel出现科学计数法或者#等问题(因为Excel的单元格宽度太小造成的),后来设置了一个单元格宽度扩展比例。问题解决了。

 

 

   发表时间:2010-02-02  
乱码 晕
0 请登录后投票
   发表时间:2010-02-02  
toshibasony 写道
乱码 晕

什么意思?
0 请登录后投票
   发表时间:2010-11-08  
如果我的DataGrid里边是这样写的:dataField="user.userName",要取它的值应该怎么办啊?上边的方法都取不到,如果楼主了解的话,希望能尽快回复!谢谢
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics