Skip to content

Commit bf95b5a

Browse files
committed
updating to XLS 0.6.10, XLSX 0.5.11
1 parent 95a783c commit bf95b5a

File tree

2 files changed

+78
-25
lines changed

2 files changed

+78
-25
lines changed

xls.js

Lines changed: 24 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
/*jshint funcscope:true */
44
var XLS = {};
55
(function(XLS){
6-
XLS.version = '0.6.9-c';
6+
XLS.version = '0.6.10';
77
if(typeof module !== "undefined" && typeof require !== 'undefined') {
88
if(typeof cptable === 'undefined') var cptable = require('codepage');
99
var current_codepage = 1252, current_cptable = cptable[1252];
@@ -209,7 +209,7 @@ var _strrev = function(x) { return String(x).split("").reverse().join("");};
209209
function fill(c,l) { return new Array(l+1).join(c); }
210210
function pad(v,d,c){var t=String(v);return t.length>=d?t:(fill(c||0,d-t.length)+t);}
211211
function rpad(v,d,c){var t=String(v);return t.length>=d?t:(t+fill(c||0,d-t.length));}
212-
SSF.version = '0.5.8';
212+
SSF.version = '0.5.9';
213213
/* Options */
214214
var opts_fmt = {};
215215
function fixopts(o){for(var y in opts_fmt) if(o[y]===undefined) o[y]=opts_fmt[y];}
@@ -446,9 +446,10 @@ var write_num = function(type, fmt, val) {
446446
o = Math.round(val * Math.pow(10,r[1].length));
447447
return String(o/Math.pow(10,r[1].length)).replace(/^([^\.]+)$/,"$1."+r[1]).replace(/\.$/,"."+r[1]).replace(/\.([0-9]*)$/,function($$, $1) { return "." + $1 + fill("0", r[1].length-$1.length); });
448448
}
449+
fmt = fmt.replace(/^#+0/, "0");
449450
if((r = fmt.match(/^(0*)\.(#*)$/))) {
450-
o = Math.round(val*Math.pow(10,r[2].length));
451-
return String(o * Math.pow(10,-r[2].length)).replace(/\.(\d*[1-9])0*$/,".$1").replace(/^([-]?\d*)$/,"$1.").replace(/^0\./,r[1].length?"0.":".");
451+
o = Math.round(aval*Math.pow(10,r[2].length));
452+
return sign + String(o / Math.pow(10,r[2].length)).replace(/\.(\d*[1-9])0*$/,".$1").replace(/^([-]?\d*)$/,"$1.").replace(/^0\./,r[1].length?"0.":".");
452453
}
453454
if((r = fmt.match(/^#,##0([.]?)$/))) return sign + commaify(String(Math.round(aval)));
454455
if((r = fmt.match(/^#,##0\.([#0]*0)$/))) {
@@ -5275,6 +5276,7 @@ function matchtag(f,g) {return new RegExp('<'+f+'(?: xml:space="preserve")?>([^\
52755276

52765277
/* TODO: handle codepages */
52775278
function fixstr(str) {
5279+
str = str.replace(/&#([0-9]+);/g,function($$,$1) { return String.fromCharCode($1); });
52785280
if(typeof current_cptable === "undefined") return str;
52795281
return str;
52805282
}
@@ -5296,15 +5298,15 @@ var magic_formats = {
52965298
"Scientific": SSF._table[11],
52975299
"Yes/No": '"Yes";"Yes";"No";@',
52985300
"True/False": '"True";"True";"False";@',
5299-
"On/Off": '"Yes";"Yes";"No";@'
5301+
"On/Off": '"Yes";"Yes";"No";@',
53005302
};
53015303

53025304
function xlml_format(format, value) {
53035305
return SSF.format(magic_formats[format] || unescapexml(format), value);
53045306
}
53055307

53065308
/* TODO: there must exist some form of OSP-blessed spec */
5307-
function parse_xlml_data(xml, data, cell, base, styles, o) {
5309+
function parse_xlml_data(xml, ss, data, cell, base, styles, o) {
53085310
var nf = "General", sid = cell.StyleID; o = o || {};
53095311
while(styles[sid]) {
53105312
if(styles[sid].nf) nf = styles[sid].nf;
@@ -5314,10 +5316,13 @@ function parse_xlml_data(xml, data, cell, base, styles, o) {
53145316

53155317
switch(data.Type) {
53165318
case 'Boolean':
5317-
cell.t = 'b'; cell.v = parsexmlbool(xml);
5319+
cell.t = 'b';
5320+
cell.v = parsexmlbool(xml);
53185321
break;
53195322
case 'String':
5320-
cell.t = 'str'; cell.v = fixstr(unescapexml(xml)); break;
5323+
cell.t = 'str'; cell.r = fixstr(unescapexml(xml));
5324+
cell.v = xml.indexOf("<") > -1 ? ss : cell.r;
5325+
break;
53215326
case 'DateTime':
53225327
cell.v = (Date.parse(xml) - new Date(Date.UTC(1899, 11, 30))) / (24 * 60 * 60 * 1000);
53235328
if(cell.v !== cell.v) cell.v = unescapexml(xml);
@@ -5351,11 +5356,12 @@ function parse_xlml_xml(d, opts) {
53515356
var c = 0, r = 0;
53525357
var refguess = {s: {r:1000000, c:1000000}, e: {r:0, c:0} };
53535358
var styles = {}, stag = {};
5359+
var ss = "", fidx = 0;
53545360
while((Rn = re.exec(str))) switch(Rn[3]) {
53555361
case 'Data': {
53565362
if(state[state.length-1][1]) break;
5357-
if(Rn[1]==='/') parse_xlml_data(str.slice(didx, Rn.index), dtag, cell, {c:c,r:r}, styles, opts);
5358-
else { dtag = parsexmltag(Rn[0]); didx = Rn.index + Rn[0].length; }
5363+
if(Rn[1]==='/') parse_xlml_data(str.slice(didx, Rn.index), ss, dtag, cell, {c:c,r:r}, styles, opts);
5364+
else { ss = ""; dtag = parsexmltag(Rn[0]); didx = Rn.index + Rn[0].length; }
53595365
} break;
53605366
case 'Cell': {
53615367
if(Rn[0].match(/\/>$/)) ++c;
@@ -5423,7 +5429,11 @@ function parse_xlml_xml(d, opts) {
54235429
case 'Border': break;
54245430
case 'Alignment': break;
54255431
case 'Borders': break;
5426-
case 'Font': break;
5432+
case 'Font': {
5433+
if(Rn[0].match(/\/>$/)) break;
5434+
else if(Rn[1]==="/") ss += str.slice(fidx, Rn.index);
5435+
else fidx = Rn.index + Rn[0].length;
5436+
} break;
54275437
case 'Interior': break;
54285438
case 'Protection': break;
54295439

@@ -5524,10 +5534,11 @@ function parse_xlml_xml(d, opts) {
55245534
}
55255535

55265536
function parse_xlml(data, opts) {
5527-
switch((opts||{}).type||"base64") {
5537+
fixopts(opts=opts||{});
5538+
switch(opts.type||"base64") {
55285539
case "base64": return parse_xlml_xml(Base64.decode(data), opts);
55295540
case "binary": case "file": return parse_xlml_xml(data, opts);
5530-
case "array": return parse_xlml_xml(data.map(function(x) { return String.fromCharCode(x);}).join(""), opts)
5541+
case "array": return parse_xlml_xml(data.map(function(x) { return String.fromCharCode(x);}).join(""), opts);
55315542
default: throw "dafuq";
55325543
}
55335544
}

xlsx.js

Lines changed: 54 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ var _strrev = function(x) { return String(x).split("").reverse().join("");};
99
function fill(c,l) { return new Array(l+1).join(c); }
1010
function pad(v,d,c){var t=String(v);return t.length>=d?t:(fill(c||0,d-t.length)+t);}
1111
function rpad(v,d,c){var t=String(v);return t.length>=d?t:(t+fill(c||0,d-t.length));}
12-
SSF.version = '0.5.8';
12+
SSF.version = '0.5.9';
1313
/* Options */
1414
var opts_fmt = {};
1515
function fixopts(o){for(var y in opts_fmt) if(o[y]===undefined) o[y]=opts_fmt[y];}
@@ -246,9 +246,10 @@ var write_num = function(type, fmt, val) {
246246
o = Math.round(val * Math.pow(10,r[1].length));
247247
return String(o/Math.pow(10,r[1].length)).replace(/^([^\.]+)$/,"$1."+r[1]).replace(/\.$/,"."+r[1]).replace(/\.([0-9]*)$/,function($$, $1) { return "." + $1 + fill("0", r[1].length-$1.length); });
248248
}
249+
fmt = fmt.replace(/^#+0/, "0");
249250
if((r = fmt.match(/^(0*)\.(#*)$/))) {
250-
o = Math.round(val*Math.pow(10,r[2].length));
251-
return String(o * Math.pow(10,-r[2].length)).replace(/\.(\d*[1-9])0*$/,".$1").replace(/^([-]?\d*)$/,"$1.").replace(/^0\./,r[1].length?"0.":".");
251+
o = Math.round(aval*Math.pow(10,r[2].length));
252+
return sign + String(o / Math.pow(10,r[2].length)).replace(/\.(\d*[1-9])0*$/,".$1").replace(/^([-]?\d*)$/,"$1.").replace(/^0\./,r[1].length?"0.":".");
252253
}
253254
if((r = fmt.match(/^#,##0([.]?)$/))) return sign + commaify(String(Math.round(aval)));
254255
if((r = fmt.match(/^#,##0\.([#0]*0)$/))) {
@@ -423,7 +424,7 @@ SSF.load_table = function(tbl) { for(var i=0; i!=0x0188; ++i) if(tbl[i]) SSF.loa
423424
make_ssf(SSF);
424425
var XLSX = {};
425426
(function(XLSX){
426-
XLSX.version = '0.5.10-a';
427+
XLSX.version = '0.5.11';
427428
var current_codepage, current_cptable, cptable;
428429
if(typeof module !== "undefined" && typeof require !== 'undefined') {
429430
if(typeof cptable === 'undefined') cptable = require('codepage');
@@ -476,7 +477,7 @@ function parsexmltag(tag) {
476477
var z = {'0': words[0]};
477478
if(words.length === 1) return z;
478479
(tag.match(attregexg) || []).map(
479-
function(x){var y=x.match(attregex); z[y[1]] = y[2].substr(1,y[2].length-2); });
480+
function(x){var y=x.match(attregex); z[y[1].replace(/^[a-zA-Z]*:/,"")] = y[2].substr(1,y[2].length-2); });
480481
return z;
481482
}
482483

@@ -889,7 +890,9 @@ var parse_sst_bin = function(data) {
889890
case 'BrtBeginSst': s.Count = val[0]; s.Unique = val[1]; break;
890891
case 'BrtSSTItem': s.push(val); break;
891892
case 'BrtEndSst': return true;
892-
default: throw new Error("Unexpected record " + R.n);
893+
case 'BrtFRTBegin': pass = true; break;
894+
case 'BrtFRTEnd': pass = false; break;
895+
default: if(!pass) throw new Error("Unexpected record " + RT + " " + R.n);
893896
}
894897
});
895898
return s;
@@ -906,7 +909,7 @@ function parseNumFmts(t) {
906909
case '<numFmts': case '</numFmts>': case '<numFmts/>': break;
907910
case '<numFmt': {
908911
var f=unescapexml(y.formatCode), i=parseInt(y.numFmtId,10);
909-
styles.NumberFmt[i] = f; SSF.load(f,i);
912+
styles.NumberFmt[i] = f; if(i>0) SSF.load(f,i);
910913
} break;
911914
default: throw 'unrecognized ' + y[0] + ' in numFmts';
912915
}
@@ -1036,7 +1039,7 @@ function parse_sty_bin(data) {
10361039
case 'BrtEndColorPalette': state = ""; break;
10371040
case 'BrtFRTBegin': pass = true; break;
10381041
case 'BrtFRTEnd': pass = false; break;
1039-
//default: if(!pass) throw new Error("Unexpected record " + RT + " " + R.n);
1042+
default: if(!pass) throw new Error("Unexpected record " + RT + " " + R.n);
10401043
}
10411044
});
10421045
return styles;
@@ -1547,6 +1550,7 @@ var parse_ws_bin = function(data, opts) {
15471550
case 'BrtCellIsst':
15481551
case 'BrtCellReal':
15491552
case 'BrtCellRk':
1553+
case 'BrtCellSt':
15501554
p = {t:val[2]};
15511555
switch(val[2]) {
15521556
case 'n': p.v = val[1]; break;
@@ -1576,10 +1580,12 @@ var parse_ws_bin = function(data, opts) {
15761580
case 'BrtSheetCalcProp': break; // TODO
15771581
case 'BrtBeginWsViews': break; // TODO
15781582
case 'BrtBeginWsView': break; // TODO
1583+
case 'BrtPane': break; // TODO
1584+
case 'BrtSel': break; // TODO
15791585
case 'BrtEndWsView': break; // TODO
15801586
case 'BrtEndWsViews': break; // TODO
1581-
case 'BrtSel': break; // TODO
15821587
case 'BrtACBegin': break; // TODO
1588+
case 'BrtRwDescent': break; // TODO
15831589
case 'BrtACEnd': break; // TODO
15841590
case 'BrtWsFmtInfoEx14': break; // TODO
15851591
case 'BrtWsFmtInfo': break; // TODO
@@ -1598,8 +1604,44 @@ var parse_ws_bin = function(data, opts) {
15981604
case 'BrtBeginMergeCells': break; // TODO
15991605
case 'BrtMergeCell': break; // TODO
16001606
case 'BrtEndMergeCells': break; // TODO
1607+
case 'BrtHLink': break; // TODO
1608+
case 'BrtDrawing': break; // TODO
16011609
case 'BrtLegacyDrawing': break; // TODO
1602-
//default: if(!pass) throw new Error("Unexpected record " + R.n);
1610+
case 'BrtPhoneticInfo': break; // TODO
1611+
case 'BrtBeginHeaderFooter': break; // TODO
1612+
case 'BrtEndHeaderFooter': break; // TODO
1613+
case 'BrtBrk': break; // TODO
1614+
case 'BrtBeginRwBrk': break; // TODO
1615+
case 'BrtEndRwBrk': break; // TODO
1616+
case 'BrtBeginColBrk': break; // TODO
1617+
case 'BrtEndColBrk': break; // TODO
1618+
case 'BrtBeginUserShViews': break; // TODO
1619+
case 'BrtBeginUserShView': break; // TODO
1620+
case 'BrtEndUserShView': break; // TODO
1621+
case 'BrtEndUserShViews': break; // TODO
1622+
case 'BrtBkHim': break; // TODO
1623+
case 'BrtBeginOleObjects': break; // TODO
1624+
case 'BrtOleObject': break; // TODO
1625+
case 'BrtEndOleObjects': break; // TODO
1626+
case 'BrtBeginListParts': break; // TODO
1627+
case 'BrtListPart': break; // TODO
1628+
case 'BrtEndListParts': break; // TODO
1629+
case 'BrtBeginSortState': break; // TODO
1630+
case 'BrtBeginSortCond': break; // TODO
1631+
case 'BrtEndSortCond': break; // TODO
1632+
case 'BrtEndSortState': break; // TODO
1633+
case 'BrtBeginConditionalFormatting': break; // TODO
1634+
case 'BrtEndConditionalFormatting': break; // TODO
1635+
case 'BrtBeginCFRule': break; // TODO
1636+
case 'BrtEndCFRule': break; // TODO
1637+
case 'BrtBeginDVals': break; // TODO
1638+
case 'BrtDVal': break; // TODO
1639+
case 'BrtEndDVals': break; // TODO
1640+
case 'BrtRangeProtection': break; // TODO
1641+
case 'BrtBeginActiveXControls': break; // TODO
1642+
case 'BrtActiveX': break; // TODO
1643+
case 'BrtEndActiveXControls': break; // TODO
1644+
default: if(!pass) throw new Error("Unexpected record " + R.n);
16031645
}
16041646
}, opts);
16051647
s["!ref"] = encode_range(ref);
@@ -1873,7 +1915,7 @@ var parse_wb_bin = function(data) {
18731915
case 'BrtFRTBegin': pass = true; break;
18741916
case 'BrtFRTEnd': pass = false; break;
18751917
case 'BrtEndBook': break;
1876-
//default: if(!pass) throw new Error("Unexpected record " + R.n);
1918+
default: if(!pass) throw new Error("Unexpected record " + R.n);
18771919
}
18781920
});
18791921

@@ -2833,7 +2875,7 @@ function parseZip(zip, opts) {
28332875
Sheets: sheets,
28342876
SheetNames: props.SheetNames,
28352877
Strings: strs,
2836-
Styles: styles
2878+
Styles: styles,
28372879
};
28382880
if(opts.bookFiles) {
28392881
out.keys = keys;

0 commit comments

Comments
 (0)