(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);