我们先来看看在 “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 的模板文件: