Extjs在线进销存-通用Excel导出

还是接上篇  http://lminqiang.iteye.com/blog/1562341

我们先来看看在  “ez进销存” 中excel到导出功能:如图


Extjs在线进销存-通用Excel导出_第1张图片

 

所谓通用Excel导出,就是 将GrrdPanel 中的列的信息 和 数据 (store)以Json的形式 传递到后台,后台根据列信息和json 在excel 模板中生成导出的实际数据然后提供链接给客户下载。

 

优点: 针对所以GridPanel 都可以通用,并且速度快,不用查询数据库。

缺点: 如果加入的分页,那么不好意思,只能导出当前页数的数据。

好了不废话:先看一段JS:

 

tbar : [ {
						text : '刷新',
						iconCls : 'refresh-icon',
						handler : function() {
							ds.load();
						}
					}, {
						text : '导出Excel',
						iconCls : 'excel-icon',
						scope : this,
						handler : function(button) {
							var deskPanel = Ext.get("x-desktop");
							deskPanel.mask('正在为您导出EXCEL,请稍等....',
									'x-mask-loading');
							var obj = exportexcel(this.detail);
							Ext.Ajax.request({
								url : 'qo/export/exportExcel.do',
								scope : this,
								timeout : 300000,
								method : 'post',
								params : {
									jsonstr : Ext.util.JSON.encode(obj),
									filename : '应收应付'
								},
								success : function(response) {
									deskPanel.unmask();
									var fileJson = Ext
											.decode(response.responseText);

									var dir = fileJson.dir;
									var filename = fileJson.filename;
									var url = "qo/download/downloadExcel.do?dir="
											+ dir + "&filename=" + filename;
									url = encodeURI(url);
									window.open(url, "_self");

								}
							});

						}

					}]
 

声明下 :this.detail = new Ext.grid.GridPanel();

 

然后再看:exportexcel函数 , 负责从gridPanel 中提取相关的信息。

 

// 导出excel
function exportexcel(grid){
	var records = grid.getStore().data.items;
	if(records.length == 0){
		Ext.Msg.alert("提示", "不存在要导出数据。");
		return;
	}
	var count =  grid.getColumnModel().getColumnCount(); 
	var columns = new Array();
	for(var i = 0 ; i< count; i ++){
		if(grid.getColumnModel().isHidden(i))
			continue;
		var head = new Object();
		head.header = grid.getColumnModel().getColumnHeader(i) ;
		head.dataIndex = grid.getColumnModel().getDataIndex(i) ;
		if(!head.dataIndex)
			continue;
		head.render = 	grid.getColumnModel().getRenderer(i);
		if(head)
		columns.push(head) ;
	}
 
	var dataarray = new Array();
	for (var i = 0; i < records.length  ; i++) {
		if(!records[i])
			continue;
		var rec = new Object();
		for(var j = 0 ; j < columns.length ; j ++){
			rec = columns[j].render.call(columns[j].render , records[i].get(columns[j].dataIndex) , j, records[i] )
			if (rec) {
				try {
					rec = rec.replace(/<[^>].*?>/g, "")
				} catch (e) {
				}
			}
			records[i].set(columns[j].dataIndex , rec)
		}
		dataarray.push(records[i].data );
	}
	var obj = {
		columns : columns ,
		datas : dataarray 
	}
	return obj;
}
 

下来是 我们aciton中处理这个请求:

// 导出Excel
	@RequestMapping(value = "/exportExcel")
	public void exportExcel( String jsonstr, String filename ,HttpServletRequest request,HttpServletResponse response){
		System.out.println(jsonstr);
		JSONObject object = JSONObject.fromObject(jsonstr);
		JSONArray colums = JSONArray.fromObject(object.get("columns"));
		JSONArray datas = JSONArray.fromObject(object.get("datas"));
		
		List<String> headers = new ArrayList<String>();
		List<String> dataIndexs = new ArrayList<String>();
		for (Iterator iterator = colums.iterator(); iterator.hasNext();) {
			JSONObject obj = (JSONObject) iterator.next();
			headers.add(obj.getString("header"));
			dataIndexs.add(obj.getString("dataIndex"));
		}
		
		List datalist = new ArrayList();
		for (Iterator iterator = datas.iterator(); iterator.hasNext();) {
			JSONObject obj = (JSONObject) iterator.next();
			//Map map = new THashMap();
			List array = new ArrayList();
			for(String dataindex :dataIndexs ){
				//map.put(dataindex, obj.get(dataindex));
				array.add(obj.get(dataindex));
			}
			datalist.add(array);
		}
		
		Map contextMap = new THashMap();
		contextMap.put("headers",headers);
		contextMap.put("dataIndexs",dataIndexs);
		contextMap.put("datalist",datalist);
		
		String webRoot = super.getServletContext().getRealPath("/");
		String templetFileName = new StringBuffer(filename).append(".xls").toString();
		
		String dateTemp = commonXlsPrint(contextMap, webRoot,"commonTemplet.xls",templetFileName);
		int index = templetFileName.indexOf(".");
		String tempFileName = new StringBuffer( templetFileName.substring(0, index)).append(dateTemp).append(".xls").toString();
		String destFileName = new StringBuffer(webRoot).append("/tempDir/").append(tempFileName).toString();
		Map result = new THashMap();
		result.put("filename", dateTemp);
		result.put("dir", "tempDir");
		super.renderObjectText(result, response);
	}

 细心的你估计已经看到了commonTemplet.xls 的模板文件:


Extjs在线进销存-通用Excel导出_第2张图片

 

这样在需要导出的添加上button后就可以轻松的完成Excel导出。

你可能感兴趣的:(Excel,ExtJs,在线进销存,Extjs通用Excel导出,ExtjsExcel导出)