(function(){ if(typeof Object.keys != 'function') { Object.keys = function(object) { var keys = [], property; for (property in object) { if (object.hasOwnProperty(property)) { keys.push(property); } } return keys; }; } if(typeof StringBuffer === 'undefined') { StringBuffer = function() { this.data = []; } StringBuffer.prototype.append = function(s) { var m = this; if(s instanceof StringBuffer) { for(var i = 0,l = s.data.length;i < l;i++ ) { m.data.push(s.data[i]); } } else m.data.push(s); return m; } StringBuffer.prototype.toString = function() { return this.data.join(""); }; } if(typeof $excel === 'undefined') { $excel = function(){ var self = this, config = function(cfg){ if(cfg) { for(var p in cfg) { self[p] = cfg[p]; if(p == 'headers') self.keys = Object.keys(self[p]); } } if(self.keys) { generalRowTpl(); } return self; }, generalRowTpl = function() { var tpl = new StringBuffer().append(''), reg = {}, exp = [], g; for(var i in self.keys) { k = self.keys[i]; t = self.types[k]; p = 'String'; y = 'Cell'; g = '!' + (k == '?' ? '#' : k) + '!';// error char ? if(t == 'yyyy-m-d') { y = 'Date'; p = 'DateTime'; } else if(t == 'yyyy-m-d hh:MM:ss') { y = 'DateTime'; p = 'DateTime'; } else if(t && t.substr(0, 1) == '0') { p = 'Number'; } tpl.append('' + g + ''); exp.push(g.replace(/\(|\)|\\|\^|\$|\[|\]|\.|\*|\+|\?|\||\<|\>|\-|\&/g, function(m){ return m == '?' ? '#' : ('\\' + m); })); reg[g] = k; } self.rowTpl = tpl.append('').toString(); self.rowReg = reg; self.rowExp = new RegExp(exp.join('|'), 'g'); }; config({ headers: [], widths: [], types: [], locks: [], combos: [], comboMaps: {}, sheets: 0, rowCount: 0, rowTpl: '', rowReg: {}, rowExp: '', xml: new StringBuffer() }); config(arguments[0]); return self; }; $excel.prototype.clear = function() { var self = this; delete self.xml; }; $excel.prototype.create = function() { var self = this; var url = URL.createObjectURL(self.getBlob()); self.clear(); return url; }; $excel.prototype.getBlob = function() { return new Blob([this.getXml().toString()], {type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8"}); }; $excel.prototype.getXml = function() { var self = this; if(self.sheets > 0) self.createOptions(); return new StringBuffer().append('\ufeff') .append('') .append('') .append('') .append('12.00') .append('') .append('') .append('7524') .append('17280') .append('360') .append('276') .append('1') .append('False') .append('False') .append('') .append('') .append('') .append('') .append('') .append('') .append('') .append('') .append('') .append('') .append(self.xml) .append(''); }; $excel.prototype.createSheet = function(count) { var self = this; if(self.sheets > 0) self.createOptions(); self.append(''); self.append(''); self.createHeader(); return self; }; $excel.prototype.createHeader = function() { var self = this, i = 0; for(var k in self.headers) { self.append(''); } self.append(''); for(var k in self.headers) { self.append('' + self.headers[k] + ''); } return self.append(''); }; $excel.prototype.parseComboValue = function(k, v) { var self = this, s = self.comboMaps[k + v]; if (s) return s; else s = v; if(self.combos) { var c; for(var i in self.combos) { c = self.combos[i]; if(k == c.dlc_fieldname && v == c.dlc_display) { s = c.dlc_value; break; } } } self.comboMaps[k + v] = s; return s; }; $excel.prototype.createRow = function(row) { var self = this, k, t, v, s = self.rowTpl.replace(self.rowExp, function(match){ k = self.rowReg[match]; t = self.types[k]; if(k) { v = row[k]; if(typeof v != 'undefined' && v != null) { if(t == 'yn') { v = [1, -1, '1', '-1'].indexOf(v) > -1 ? '是' : (0 == v ? '否' : ''); } else if(t == 'combo') { v = self.parseComboValue(k, v); } else if(t == 'yyyy-m-d') { v = v.substr(0, 10); } } else v = ''; } else v = ''; return v; }); // empty datefield return self.append(s.replace(/\\\<\/Data\>\<\/Cell\>/g, '')); }; $excel.prototype.addData = function(data) { var self = this; for(var i = 0,l = data.length;i < l;i++ ) { if(self.rowCount == 0 || self.rowCount >= 65534) { self.rowCount = 0; self.createSheet(l); } self.createRow(data[i]); self.rowCount += 1; } return self; }; $excel.prototype.append = function(s) { this.xml.append(s); return this; }; $excel.prototype.createOptions = function() { return this.append('
') .append('') .append('') .append('') .append('600') .append('600') .append('') .append('') .append('') .append('') .append('1') .append('1') .append('False') .append('False') .append('') .append('
'); }; } })(window);