Skip to content

Commit ba32384

Browse files
committed
updating to XLS 0.6.15, XLSX 0.5.14
1 parent aaeb4da commit ba32384

2 files changed

Lines changed: 259 additions & 47 deletions

File tree

assets/js/xls.js

Lines changed: 72 additions & 19 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.14';
6+
XLS.version = '0.6.15';
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.11';
212+
SSF.version = '0.6.1';
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];}
@@ -324,6 +324,10 @@ var parse_date_code = function parse_date_code(v,opts) {
324324
var dout=[], out={D:date, T:time, u:86400*(v-date)-time}; fixopts(opts = (opts||{}));
325325
if(opts.date1904) date += 1462;
326326
if(date > 2958465) return null;
327+
if(out.u > .999) {
328+
out.u = 0;
329+
if(++time == 86400) { time = 0; ++date; }
330+
}
327331
if(date === 60) {dout = [1900,2,29]; dow=3;}
328332
else if(date === 0) {dout = [1900,1,0]; dow=6;}
329333
else {
@@ -346,7 +350,7 @@ SSF.parse_date_code = parse_date_code;
346350
/*jshint -W086 */
347351
var write_date = function(type, fmt, val) {
348352
if(val < 0) return "";
349-
var o;
353+
var o, ss;
350354
switch(type) {
351355
case 'y': switch(fmt) { /* year */
352356
case 'y': case 'yy': return pad(val.y % 100,2);
@@ -381,11 +385,11 @@ var write_date = function(type, fmt, val) {
381385
default: throw 'bad minute format: ' + fmt;
382386
}
383387
case 's': switch(fmt) { /* seconds */
384-
case 's': return Math.round(val.S+val.u);
385-
case 'ss': return pad(Math.round(val.S+val.u), 2);
386-
case 'ss.0': o = pad(Math.round(10*(val.S+val.u)),3); return o.substr(0,2)+"." + o.substr(2);
387-
case 'ss.00': o = pad(Math.round(100*(val.S+val.u)),4); return o.substr(0,2)+"." + o.substr(2);
388-
case 'ss.000': o = pad(Math.round(1000*(val.S+val.u)),5); return o.substr(0,2)+"." + o.substr(2);
388+
case 's': ss=Math.round(val.S+val.u); return ss >= 60 ? 0 : ss;
389+
case 'ss': ss=Math.round(val.S+val.u); if(ss>=60) ss=0; return pad(ss,2);
390+
case 'ss.0': ss=Math.round(10*(val.S+val.u)); if(ss>=600) ss = 0; o = pad(ss,3); return o.substr(0,2)+"." + o.substr(2);
391+
case 'ss.00': ss=Math.round(100*(val.S+val.u)); if(ss>=6000) ss = 0; o = pad(ss,4); return o.substr(0,2)+"." + o.substr(2);
392+
case 'ss.000': ss=Math.round(1000*(val.S+val.u)); if(ss>=60000) ss = 0; o = pad(ss,5); return o.substr(0,2)+"." + o.substr(2);
389393
default: throw 'bad second format: ' + fmt;
390394
}
391395
case 'Z': switch(fmt) {
@@ -459,6 +463,7 @@ var write_num = function(type, fmt, val) {
459463
rr = Math.round((val-Math.floor(val))*Math.pow(10,r[1].length));
460464
return val < 0 ? "-" + write_num(type, fmt, -val) : commaify(String(Math.floor(val))) + "." + pad(rr,r[1].length,0);
461465
}
466+
if((r = fmt.match(/^#,#*,#0/))) return write_num(type,fmt.replace(/^#,#*,/,""),val);
462467
if((r = fmt.match(/^([?]+)([ ]?)\/([ ]?)([?]+)/))) {
463468
rr = Math.min(Math.max(r[1].length, r[4].length),7);
464469
ff = frac(aval, Math.pow(10,rr)-1, false);
@@ -469,6 +474,10 @@ var write_num = function(type, fmt, val) {
469474
ff = frac(aval, Math.pow(10,rr)-1, true);
470475
return sign + (ff[0]||(ff[1] ? "" : "0")) + " " + (ff[1] ? pad(ff[1],rr," ") + r[2] + "/" + r[3] + rpad(ff[2],rr," "): fill(" ", 2*rr+1 + r[2].length + r[3].length));
471476
}
477+
if((r = fmt.match(/^00,000\.([#0]*0)$/))) {
478+
rr = val == Math.floor(val) ? 0 : Math.round((val-Math.floor(val))*Math.pow(10,r[1].length));
479+
return val < 0 ? "-" + write_num(type, fmt, -val) : commaify(String(Math.floor(val))).replace(/^\d,\d{3}$/,"0$&").replace(/^\d*$/,function($$) { return "00," + ($$.length < 3 ? pad(0,3-$$.length) : "") + $$; }) + "." + pad(rr,r[1].length,0);
480+
}
472481
switch(fmt) {
473482
case "0": case "#0": return Math.round(val);
474483
case "#,###": var x = commaify(String(Math.round(aval))); return x !== "0" ? sign + x : "";
@@ -550,7 +559,7 @@ function eval_fmt(fmt, v, opts, flen) {
550559
case '?':
551560
o = fmt[i]; while(fmt[++i] === c) o+=c;
552561
q={t:c, v:o}; out.push(q); lst = c; break;
553-
case '*': ++i; if(fmt[i] == ' ') ++i; break; // **
562+
case '*': ++i; if(fmt[i] == ' ' || fmt[i] == '*') ++i; break; // **
554563
case '(': case ')': out.push({t:(flen===1?'t':c),v:c}); ++i; break;
555564
case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9':
556565
o = fmt[i]; while("0123456789".indexOf(fmt[++i]) > -1) o+=fmt[i];
@@ -562,22 +571,38 @@ function eval_fmt(fmt, v, opts, flen) {
562571
out.push({t:'t', v:c}); ++i; break;
563572
}
564573
}
565-
566-
/* walk backwards */
574+
var bt = 0;
567575
for(i=out.length-1, lst='t'; i >= 0; --i) {
568576
switch(out[i].t) {
569-
case 'h': case 'H': out[i].t = hr; lst='h'; break;
570-
case 'd': case 'y': case 's': case 'M': case 'e': lst=out[i].t; break;
571-
case 'm': if(lst === 's') out[i].t = 'M'; break;
577+
case 'h': case 'H': out[i].t = hr; lst='h'; if(bt < 1) bt = 1; break;
578+
case 's': if(bt < 3) bt = 3;
579+
/* falls through */
580+
case 'd': case 'y': case 'M': case 'e': lst=out[i].t; break;
581+
case 'm': if(lst === 's') { out[i].t = 'M'; if(bt < 2) bt = 2; } break;
582+
case 'Z':
583+
if(bt < 1 && out[i].v.match(/[Hh]/)) bt = 1;
584+
if(bt < 2 && out[i].v.match(/[Mm]/)) bt = 2;
585+
if(bt < 3 && out[i].v.match(/[Ss]/)) bt = 3;
572586
}
573587
}
574-
588+
switch(bt) {
589+
case 0: break;
590+
case 1:
591+
if(dt.u >= .5) { dt.u = 0; ++dt.S; }
592+
if(dt.S >= 60) { dt.S = 0; ++dt.M; }
593+
if(dt.M >= 60) { dt.M = 0; ++dt.H; }
594+
break;
595+
case 2:
596+
if(dt.u >= .5) { dt.u = 0; ++dt.S; }
597+
if(dt.S >= 60) { dt.S = 0; ++dt.M; }
598+
break;
599+
}
575600
/* replace fields */
576601
for(i=0; i < out.length; ++i) {
577602
switch(out[i].t) {
578603
case 't': case 'T': case ' ': case 'D': break;
579604
case 'd': case 'm': case 'y': case 'h': case 'H': case 'M': case 's': case 'e': case 'Z':
580-
out[i].v = write_date(out[i].t, out[i].v, dt);
605+
out[i].v = write_date(out[i].t, out[i].v, dt, bt);
581606
out[i].t = 't'; break;
582607
case 'n': case '(': case '?':
583608
var jj = i+1;
@@ -4798,6 +4823,13 @@ function parse_workbook(blob, options) {
47984823
case 'SXVS': break; // TODO
47994824
case 'DConRef': break; // TODO
48004825
case 'SXAddl': break; // TODO
4826+
case 'DConName': break; // TODO
4827+
case 'SXPI': break; // TODO
4828+
//case 'SxFormat': break; // TODO
4829+
//case 'SxRule': break; // TODO
4830+
//case 'SxFilt': break; // TODO
4831+
//case 'SxItm': break; // TODO
4832+
//case 'SxDXF': break; // TODO
48014833

48024834
/* Scenario Manager */
48034835
case 'ScenMan': break;
@@ -5501,6 +5533,7 @@ function parse_xlml_xml(d, opts) {
55015533
else if(Rn[1]==="/") Props[Rn[3]] = str.slice(pidx, Rn.index);
55025534
else pidx = Rn.index + Rn[0].length;
55035535
} break;
5536+
case 'Paragraphs': break;
55045537

55055538
/* OfficeDocumentSettings */
55065539
case 'AllowPNG': break;
@@ -5586,7 +5619,6 @@ function parse_xlml_xml(d, opts) {
55865619
case 'LeftColumnVisible': break;
55875620
case 'LeftColumnRightPane': break;
55885621
case 'FitToPage': break;
5589-
case 'FitHeight': break;
55905622
case 'RangeSelection': break;
55915623
case 'PaperSizeIndex': break;
55925624
case 'PageLayoutZoom': break;
@@ -5654,9 +5686,18 @@ function parse_xlml_xml(d, opts) {
56545686
case 'ConsolidationReference': break;
56555687
case 'FileName': break;
56565688
case 'Reference': break;
5689+
case 'NoColumnGrand': break;
56575690
case 'NoRowGrand': break;
56585691
case 'BlankLineAfterItems': break;
56595692
case 'DoNotCalculateBeforeSave': break;
5693+
case 'Hidden': break;
5694+
case 'Subtotal': break;
5695+
case 'BaseField': break;
5696+
case 'MapChildItems': break;
5697+
case 'Function': break;
5698+
case 'RefreshOnFileOpen': break;
5699+
case 'PrintSetTitles': break;
5700+
case 'MergeLabels': break;
56605701

56615702
/* PageBreaks */
56625703
case 'ColBreaks': break;
@@ -5723,6 +5764,7 @@ function parse_xlml_xml(d, opts) {
57235764
case 'Delimiters': break;
57245765
case 'Tab': break;
57255766
case 'Comma': break;
5767+
case 'AutoFormatName': break;
57265768

57275769
/* DataValidation */
57285770
case 'Type': break;
@@ -5751,8 +5793,18 @@ function parse_xlml_xml(d, opts) {
57515793
case 'Field': break;
57525794
case 'XSDType': break;
57535795
case 'Aggregate': break;
5796+
case 'ElementType': break;
5797+
case 'AttributeType': break;
57545798
/* These are from xsd (XML Schema Definition) */
5755-
case 'schema': case 'element': case 'complexType': case 'all': break;
5799+
case 'schema':
5800+
case 'element':
5801+
case 'complexType':
5802+
case 'datatype':
5803+
case 'all':
5804+
case 'attribute':
5805+
case 'extends': break;
5806+
5807+
case 'data': case 'row': break;
57565808

57575809
case 'Styles':
57585810
case 'Workbook': {
@@ -5764,6 +5816,7 @@ function parse_xlml_xml(d, opts) {
57645816
case 'CustomDocumentProperties':
57655817
case 'OfficeDocumentSettings':
57665818
case 'PivotTable':
5819+
case 'PivotCache':
57675820
case 'Names':
57685821
case 'MapInfo':
57695822
case 'PageBreaks':
@@ -5776,7 +5829,7 @@ function parse_xlml_xml(d, opts) {
57765829
if(Rn[1]==='/'){if((tmp=state.pop())[0]!==Rn[3]) throw "Bad state: "+tmp;}
57775830
else state.push([Rn[3], true]);
57785831
} break;
5779-
5832+
57805833
/* CustomDocumentProperties */
57815834
default:
57825835
if(!state[state.length-1][1]) throw 'Unrecognized tag: ' + Rn[3] + "|" + state.join("|");

0 commit comments

Comments
 (0)