// JavaScript Document /** * allows for downloading of grid data (store) directly into excel * Method: extracts data of gridPanel store, uses columnModel to construct XML excel document, * converts to Base64, then loads everything into a data URL link. * * @author Animal * */ /** * base64 encode / decode * * @location http://www.webtoolkit.info/ * */ var Base64 = (function() { // Private property var keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; // Private method for UTF-8 encoding function utf8Encode(string) { string = string.replace(/\r\n/g,"\n"); var utftext = ""; for (var n = 0; n < string.length; n++) { var c = string.charCodeAt(n); if (c < 128) { utftext += String.fromCharCode(c); } else if((c > 127) && (c < 2048)) { utftext += String.fromCharCode((c >> 6) | 192); utftext += String.fromCharCode((c & 63) | 128); } else { utftext += String.fromCharCode((c >> 12) | 224); utftext += String.fromCharCode(((c >> 6) & 63) | 128); utftext += String.fromCharCode((c & 63) | 128); } } return utftext; } // Public method for encoding return { encode : (typeof btoa == 'function') ? function(input) { return btoa(utf8Encode(input)); } : function (input) { var output = ""; var chr1, chr2, chr3, enc1, enc2, enc3, enc4; var i = 0; input = utf8Encode(input); while (i < input.length) { chr1 = input.charCodeAt(i++); chr2 = input.charCodeAt(i++); chr3 = input.charCodeAt(i++); enc1 = chr1 >> 2; enc2 = ((chr1 & 3) << 4) | (chr2 >> 4); enc3 = ((chr2 & 15) << 2) | (chr3 >> 6); enc4 = chr3 & 63; if (isNaN(chr2)) { enc3 = enc4 = 64; } else if (isNaN(chr3)) { enc4 = 64; } output = output + keyStr.charAt(enc1) + keyStr.charAt(enc2) + keyStr.charAt(enc3) + keyStr.charAt(enc4); } return output; } }; })(); Ext.override(Ext.grid.GridPanel, { getExcelXml: function(title, includeHidden) { var worksheet = this.createWorksheet(title, includeHidden); return '' + '' + '' + '123' + '' + '' + '' + worksheet.height + '' + '' + worksheet.width + '' + 'False' + 'False' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + worksheet.xml + ''; }, createWorksheet: function(title, includeHidden) { var cellType = []; var cellTypeClass = []; var cm = this.columns; var totalWidthInPixels = 0; var colXml = ''; var headerXml = ''; var visibleColumnCountReduction = 0; var colCount = cm.length; for (var i = 0; i < colCount; i++) { cm[i].header = cm[i].header == null ? cm[i].text : cm[i].header; if ((cm[i].dataIndex != '') && (includeHidden || cm[i].width != 0)) { var w = cm[i].width; totalWidthInPixels += w; if (cm[i].header === ""){ cellType.push("None"); cellTypeClass.push(""); ++visibleColumnCountReduction; } else { colXml += ''; headerXml += '' + '' + cm[i].header + '' + ''; if(this.store.fields){ var fld = this.store.fields.get(cm[i].dataIndex); switch(fld.type) { case "int": cellType.push("Number"); cellTypeClass.push("int"); break; case "float": cellType.push("Number"); cellTypeClass.push("float"); break; case "bool": case "boolean": cellType.push("String"); cellTypeClass.push(""); break; case "date": /*cellType.push("DateTime"); cellTypeClass.push("date");*/ cellType.push("String"); cellTypeClass.push(""); break; default: cellType.push("String"); cellTypeClass.push(""); break; } } else { switch(cm[i].xtype) { case "numbercolumn": cellType.push("Number"); cellTypeClass.push("float"); break; case "booleancolumn": cellType.push("String"); cellTypeClass.push(""); break; case "datecolumn": /* cellType.push("DateTime"); cellTypeClass.push("date");*/ cellType.push("String"); cellTypeClass.push(""); break; default: cellType.push("String"); cellTypeClass.push(""); break; } } } } } var visibleColumnCount = cellType.length - visibleColumnCountReduction; var result = { height: 9000, width: Math.floor(totalWidthInPixels * 30) + 50 }; if(!title){ title = "优软ERP系统导出数据"; } var t = '' + '' + '' + '' + '' + colXml + '' + '' + '' + '' + title + '' + '' + '' + '' + headerXml + ''; for (var i = 0, it = this.store.data.items, l = it.length; i < l; i++) { t += ''; var cellClass = (i & 1) ? 'odd' : 'even'; r = it[i].data; var k = 0; for (var j = 0; j < colCount; j++) { if ((cm[j].dataIndex != '') && (includeHidden || cm[j].width != 0)) { var v = r[cm[j].dataIndex]; if (cellType[k] !== "None") { t += ''; if (cm[j].xtype == 'datecolumn') { if(v != null && v != '' && !v.toString().match(/^(\d{1,4})(-|\/)(\d{1,2})\2(\d{1,2})$/)){ t += Ext.Date.toString(new Date(v));//v.format('Y-m-d'); } else { t += v; } } else { t += v; } t +=''; } k++; } } t += ''; } result.xml = t + '' + '' + '' + '' + '' + '' + '' + '' + '' + 'Blank' + '1' + '32767' + '' + '600' + '' + '' + '' + 'False' + 'False' + '' + ''; return result; } });