还是接上篇 http://lminqiang.iteye.com/blog/1562341
我们先来看看在 “ez进销存” 中excel到导出功能:如图
所谓通用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 的模板文件:
这样在需要导出的添加上button后就可以轻松的完成Excel导出。