版本Ext 4.1
实现单行表头、多行表头、Store分组, 通用grid 数据导出功能。
导出grid列表显示数据,避免直接从数据库导出,标识符需要填写转换方法。如:
return v=='Y'?'是':'';
上代码:
Ext.qy.ExtractionGridDate = function(){ /** 列表头 text,align */ var theadObj = {}, theadArray = [], tabName, dataRows = [], form, _eachColumns function(cs,n){ var num = 0 ; for(var j=0,l=cs.length;j<l;j++){ num += _col_z(cs[j],n); if((n+1)>theadObj.depth){ theadObj.depth = n+1; } } return num; }, _col_z = function(cols,n){ var return_num = 0, child_cols = cols.columns, hidden_ = cols.hidden||false, child_len = child_cols?child_cols.length:0, align_ = cols.align||'left'; if(child_cols){ child_len = _eachColumns(child_cols,n+1); return_num = child_len; }else{ if(!hidden_){ return_num += 1; } theadArray.push({ hidden:hidden_, align:align_ }); } theadObj["row"+n].push({ text:cols.header||cols.text||'', align:align_, hidden:hidden_, child_len:child_len }); return return_num; }, _subForm = function (arrs, url){//提交 var i, l, rowStyle=[], rows = []; for(i=0,l=theadArray.length;i<l;i++){ if(!theadArray[i].hidden){ rowStyle.push(theadArray[i].align); }; }; for(i=0,l=arrs.length;i<l;i++){ var arr = arrs[i], row = []; for(var j=0,k = arr.length;j<k;j++){ if(!theadArray[j].hidden){ row.push(arr[j]); }; }; rows.push(row.join('<&$&>')) }; l = '<#$#>'; var inputs = [ {name: 'filename', value: tabName}, {name: 'depth', value: theadObj.depth}, {name: 'headerStr', value: function(){ var result = ''; var je = '<*>',jg='!*!',jk='&$&'; for(i=0;i<theadObj.depth;i++){ for(var j=0,l = theadObj["row"+i].length;j<l;j++){ var o = theadObj["row"+i][j]; result += o.text +je+ o.align +je+ o.hidden +je+ o.child_len +je +jg; } result += jk; } return result; }()}, {name: 'styleStr', value: rowStyle.join(l)}, {name: 'rowsStr', value: rows.join(l)} ]; if(!form){ form = document.createElement("form"); form.method = 'post'; form.target="_blank" document.body.appendChild(form);form.style.display="none"; }; form.action = url; while(form.firstChild){ //判断是否有子节点 form.removeChild(form.firstChild); }; for(i=0,l=inputs.length;i<l;i++){ var input = document.createElement("input"); input.value = inputs[i].value; input.name = inputs[i].name; form.appendChild(input); }; Ext.qy.unmask(); form.submit(); }; return function(gridpanel, url){ Ext.qy.mask("加载数据……"); tabName = gridpanel.title||''; dataRows.splice(0,dataRows.length); theadArray.splice(0,theadArray.length); theadObj = {//表头最多5层 row0:[], row1:[], row2:[], row3:[], row4:[], depth:1//判断深度 }; var columns = gridpanel.columns, i; for(i=0,l=columns.length;i<l;i++){ var cols = columns[i].initialConfig; _col_z(cols,0); } var html = gridpanel.getView().getEl().getHTML(); var rows = html.replace(/<([a-zA-Z1-6]+)(\s*[^>]*)?>/gi, '<$1>') .replace(/<\/?div.*?>|<\/?a.*?>|<\/?span.*?>/gi, '') .replace(/\s+/g, '') .replace(/<th><\/th>/gi, '') .replace(/<table><tbody><tr><\/tr><tr><td>/gi, '') .replace(/<\/td><\/tr><\/tbody><\/table>/gi, '') .split(/<\/td><\/tr><tr.*?><td.*?>/i); for(i=0,l=rows.length;i<l;i++){ var row = rows[i].split(/<\/td><td.*?>/i) dataRows.push(row); } return _subForm(dataRows, url); }; }();
按钮调用:
{ xtype: 'button', icon : 'images/tool_xls.gif', tooltip: { text : '导出Excel文件' }, handler: function(btn){ Ext.qy.ExtractionGridDate(btn.up('gridpanel'), "file/download/Excel.html"); } }
java 实现使用springmvc
@RequestMapping("/file/download/{view}.html") public String view( @PathVariable("view") String view, @RequestParam(value = "filename",required=false)String filename,//文件名||标题 @RequestParam(value = "depth",required=false)int depth,//列表头 深度 @RequestParam(value = "headerStr",required=false)String headerStr,//列表头 @RequestParam(value = "styleStr",required=false)String styleStr,//表格algin @RequestParam(value = "rowsStr",required=false)String rowsStr,//数据 Model model ){ if(filename==null&&headerStr==null&&rowsStr==null){ return null; } model.addAttribute("filename", filename); String regex = "\\<\\#\\$\\#\\>";//行分割符<#$#> headerStr = headerStr.replace(" ", " "); rowsStr = rowsStr.replace(" ", " "); model.addAttribute("headerStr", headerStr); model.addAttribute("depth", depth); List<String[]> rowsList = new ArrayList<String[]>(); String[] rows = rowsStr.split(regex); for (int i = 0; i < rows.length; i++) { String[] row = rows[i].split("\\<\\&\\$\\&\\>");//列分割符<&$&> rowsList.add(row); } model.addAttribute("rowsList", rowsList); model.addAttribute("styleArray", styleStr.split(regex)); return view+"View"; }
ExcelView 代码
public class ExcelView extends AbstractExcelView{ @SuppressWarnings({ "unchecked", "deprecation" }) @Override protected void buildExcelDocument( Map<String, Object> model, HSSFWorkbook workbook, HttpServletRequest request, HttpServletResponse response) throws Exception { String filename = "----"; if(model.get("filename")!=null && !"".equals(model.get("filename"))){ filename = (String) model.get("filename"); } int depth = (Integer) model.get("depth"); String headerStr = (String) model.get("headerStr"); String[] styleArray = (String[]) model.get("styleArray"); List<String[]> rowsList = (List<String[]>) model.get("rowsList"); int len = styleArray.length; HSSFSheet sheet = workbook.createSheet(filename); response.setHeader("Content-Disposition", "inline;filename="+new String((filename+"-"+DateUtil.getCalendarStr()+".xls").getBytes(),"iso8859-1")); HSSFCellStyle style = workbook.createCellStyle(); // 样式对象 style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 垂直 style.setAlignment(HSSFCellStyle.ALIGN_CENTER);// 水平 HSSFCellStyle styleLeft = workbook.createCellStyle(); styleLeft.setAlignment(HSSFCellStyle.ALIGN_LEFT); styleLeft.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 垂直 HSSFCellStyle styleCenter = workbook.createCellStyle(); styleCenter.setAlignment(HSSFCellStyle.ALIGN_CENTER); styleCenter.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 垂直 HSSFCellStyle styleRight = workbook.createCellStyle(); styleRight.setAlignment(HSSFCellStyle.ALIGN_RIGHT); styleRight.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 垂直 int rowNum = 0; sheet.addMergedRegion(new Region(0,(short)0,1,(short)(len-1)));// 四个参数分别是:起始行,起始列,结束行,结束列 HSSFCell titleCell = sheet.createRow(rowNum).createCell((short) 0); titleCell.setCellStyle(styleCenter); titleCell.setCellType(HSSFCell.CELL_TYPE_STRING); titleCell.setCellValue(filename); String[] rows = headerStr.split("\\&\\$\\&"); rowNum = 1; Map<String, Integer> map = new HashMap<String, Integer>(); for (int i = 0; i < depth; i++) { map.put("row"+i, rowNum+1); map.put("col"+i, 0); } //生成多行表头 for (int i = 0,l = rows.length;i<l;i++) { String row = rows[i]; rowNum ++; HSSFRow header = sheet.createRow(rowNum); String[] rs = row.split("\\!\\*\\!"); for (String strs : rs) { String[] o = strs.split("\\<\\*\\>"); if(!"true".equals(o[2])){ int child_len = Integer.parseInt(o[3]); if(child_len>0){ sheet.addMergedRegion(new Region(rowNum,(short)(int)map.get("col"+i),rowNum,(short)(int)(map.get("col"+i)+(child_len-1))));// 四个参数分别是:起始行,起始列,结束行,结束列 this.makeCell(header, (int) map.get("col"+i), o[1], o[0], styleLeft, styleCenter, styleRight); map.put("col"+i, map.get("col"+i)+child_len); }else{ if(i<depth){ int a = depth-i; sheet.addMergedRegion(new Region(rowNum,(short)(int)map.get("col"+i),rowNum+(a-1),(short)(int)map.get("col"+i)));// 四个参数分别是:起始行,起始列,结束行,结束列 this.makeCell(header, (int) map.get("col"+i), o[1], o[0], styleLeft, styleCenter, styleRight); for (int j = 0; j < a; j++) { map.put("col"+(i+j), map.get("col"+(i+j))+1); } } } } } } rowNum++; for(String[] rowArr : rowsList){ HSSFRow row = sheet.createRow(rowNum++); for (int i = 0; i < rowArr.length; i++) { this.makeCell(row, i, styleArray[i], rowArr[i], styleLeft, styleCenter, styleRight); } } } private HSSFCellStyle retrunStyle(String alignStr,HSSFCellStyle styleLeft,HSSFCellStyle styleCenter,HSSFCellStyle styleRight){ if("center".equalsIgnoreCase(alignStr)){ return styleCenter; }else if("right".equalsIgnoreCase(alignStr)){ return styleRight; }else{ return styleLeft; } } @SuppressWarnings("deprecation") private void makeCell(HSSFRow row, int column ,String alignStr, String value,HSSFCellStyle styleLeft,HSSFCellStyle styleCenter,HSSFCellStyle styleRight){ HSSFCell cell = row.createCell((short) column); cell.setCellType(HSSFCell.CELL_TYPE_STRING); cell.setCellStyle(retrunStyle(alignStr, styleLeft, styleCenter, styleRight)); cell.setCellValue(value); }
http://170728576.iteye.com/blog/1980236