33/*jshint funcscope:true */
44var XLS = { } ;
55( function ( XLS ) {
6- XLS . version = '0.6.14 ' ;
6+ XLS . version = '0.6.15 ' ;
77if ( 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("");};
209209function fill ( c , l ) { return new Array ( l + 1 ) . join ( c ) ; }
210210function pad ( v , d , c ) { var t = String ( v ) ; return t . length >= d ?t :( fill ( c || 0 , d - t . length ) + t ) ; }
211211function 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 */
214214var opts_fmt = { } ;
215215function 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 */
347351var 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 ( / ^ 0 0 , 0 0 0 \. ( [ # 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 ( / [ H h ] / ) ) bt = 1 ;
584+ if ( bt < 2 && out [ i ] . v . match ( / [ M m ] / ) ) bt = 2 ;
585+ if ( bt < 3 && out [ i ] . v . match ( / [ S s ] / ) ) 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