2014-01-22 04:58:26 +00:00
/* xlsx.js (C) 2013-2014 SheetJS -- http://sheetjs.com */
2013-03-27 18:37:22 +00:00
/* vim: set ts=2: */
2014-04-15 09:04:03 +00:00
var XLSX = { } ;
( function ( XLSX ) {
2014-05-29 22:30:03 +00:00
XLSX . version = '0.7.4' ;
2014-05-03 18:51:10 +00:00
var current _codepage = 1252 , current _cptable ;
if ( typeof module !== "undefined" && typeof require !== 'undefined' ) {
2014-05-25 09:04:08 +00:00
if ( typeof cptable === 'undefined' ) cptable = require ( './dist/cpexcel' ) ;
2014-05-03 18:51:10 +00:00
current _cptable = cptable [ current _codepage ] ;
}
function reset _cp ( ) { set _cp ( 1252 ) ; }
function set _cp ( cp ) { current _codepage = cp ; if ( typeof cptable !== 'undefined' ) current _cptable = cptable [ cp ] ; }
var _getchar = function ( x ) { return String . fromCharCode ( x ) ; } ;
if ( typeof cptable !== 'undefined' ) _getchar = function ( x ) {
if ( current _codepage === 1200 ) return String . fromCharCode ( x ) ;
if ( current _cptable ) return current _cptable . dec [ x ] ;
return cptable . utils . decode ( current _codepage , [ x % 256 , x >> 8 ] ) [ 0 ] ;
} ;
2014-05-22 12:16:51 +00:00
function char _codes ( data ) { return data . split ( "" ) . map ( function ( x ) { return x . charCodeAt ( 0 ) ; } ) ; }
function debom _xml ( data ) {
if ( typeof cptable !== 'undefined' ) {
if ( data . charCodeAt ( 0 ) === 0xFF && data . charCodeAt ( 1 ) === 0xFE ) { return cptable . utils . decode ( 1200 , char _codes ( data . substr ( 2 ) ) ) ; }
}
return data ;
}
2014-01-23 06:20:19 +00:00
/* ssf.js (C) 2013-2014 SheetJS -- http://sheetjs.com */
2013-12-16 16:32:34 +00:00
var SSF = { } ;
var make _ssf = function ( SSF ) {
2014-01-22 04:58:26 +00:00
var _strrev = function ( x ) { return String ( x ) . split ( "" ) . reverse ( ) . join ( "" ) ; } ;
2013-03-26 23:54:14 +00:00
function fill ( c , l ) { return new Array ( l + 1 ) . join ( c ) ; }
2013-12-27 03:15:16 +00:00
function pad ( v , d , c ) { var t = String ( v ) ; return t . length >= d ? t : ( fill ( c || 0 , d - t . length ) + t ) ; }
function rpad ( v , d , c ) { var t = String ( v ) ; return t . length >= d ? t : ( t + fill ( c || 0 , d - t . length ) ) ; }
2014-05-22 12:16:51 +00:00
SSF . version = '0.7.0' ;
2013-03-26 23:54:14 +00:00
/* Options */
2014-05-03 18:51:10 +00:00
var opts _fmt = {
date1904 : 0 ,
output : "" ,
WTF : false
} ;
2013-04-17 01:32:20 +00:00
function fixopts ( o ) { for ( var y in opts _fmt ) if ( o [ y ] === undefined ) o [ y ] = opts _fmt [ y ] ; }
2013-03-26 23:54:14 +00:00
SSF . opts = opts _fmt ;
var table _fmt = {
2014-01-23 06:20:19 +00:00
0 : 'General' ,
2013-03-26 23:54:14 +00:00
1 : '0' ,
2 : '0.00' ,
3 : '#,##0' ,
4 : '#,##0.00' ,
9 : '0%' ,
10 : '0.00%' ,
11 : '0.00E+00' ,
12 : '# ?/?' ,
13 : '# ??/??' ,
2013-12-27 03:15:16 +00:00
14 : 'm/d/yy' ,
2013-03-26 23:54:14 +00:00
15 : 'd-mmm-yy' ,
16 : 'd-mmm' ,
17 : 'mmm-yy' ,
18 : 'h:mm AM/PM' ,
19 : 'h:mm:ss AM/PM' ,
20 : 'h:mm' ,
21 : 'h:mm:ss' ,
22 : 'm/d/yy h:mm' ,
37 : '#,##0 ;(#,##0)' ,
38 : '#,##0 ;[Red](#,##0)' ,
39 : '#,##0.00;(#,##0.00)' ,
40 : '#,##0.00;[Red](#,##0.00)' ,
45 : 'mm:ss' ,
46 : '[h]:mm:ss' ,
47 : 'mmss.0' ,
48 : '##0.0E+0' ,
2014-01-23 06:20:19 +00:00
49 : '@' ,
56 : '"上午/下午 "hh"時"mm"分"ss"秒 "' ,
65535 : 'General'
2013-03-26 23:54:14 +00:00
} ;
var days = [
[ 'Sun' , 'Sunday' ] ,
[ 'Mon' , 'Monday' ] ,
[ 'Tue' , 'Tuesday' ] ,
[ 'Wed' , 'Wednesday' ] ,
[ 'Thu' , 'Thursday' ] ,
[ 'Fri' , 'Friday' ] ,
[ 'Sat' , 'Saturday' ]
] ;
var months = [
[ 'J' , 'Jan' , 'January' ] ,
[ 'F' , 'Feb' , 'February' ] ,
[ 'M' , 'Mar' , 'March' ] ,
[ 'A' , 'Apr' , 'April' ] ,
[ 'M' , 'May' , 'May' ] ,
[ 'J' , 'Jun' , 'June' ] ,
[ 'J' , 'Jul' , 'July' ] ,
[ 'A' , 'Aug' , 'August' ] ,
[ 'S' , 'Sep' , 'September' ] ,
[ 'O' , 'Oct' , 'October' ] ,
[ 'N' , 'Nov' , 'November' ] ,
2013-04-17 01:32:20 +00:00
[ 'D' , 'Dec' , 'December' ]
2013-03-26 23:54:14 +00:00
] ;
2013-12-27 03:15:16 +00:00
var frac = function frac ( x , D , mixed ) {
var sgn = x < 0 ? - 1 : 1 ;
var B = x * sgn ;
var P _2 = 0 , P _1 = 1 , P = 0 ;
var Q _2 = 1 , Q _1 = 0 , Q = 0 ;
2014-01-23 06:20:19 +00:00
var A = Math . floor ( B ) ;
2013-12-27 03:15:16 +00:00
while ( Q _1 < D ) {
2014-01-23 06:20:19 +00:00
A = Math . floor ( B ) ;
2013-12-27 03:15:16 +00:00
P = A * P _1 + P _2 ;
Q = A * Q _1 + Q _2 ;
2014-01-23 06:20:19 +00:00
if ( ( B - A ) < 0.0000000005 ) break ;
2013-12-27 03:15:16 +00:00
B = 1 / ( B - A ) ;
P _2 = P _1 ; P _1 = P ;
Q _2 = Q _1 ; Q _1 = Q ;
}
if ( Q > D ) { Q = Q _1 ; P = P _1 ; }
if ( Q > D ) { Q = Q _2 ; P = P _2 ; }
if ( ! mixed ) return [ 0 , sgn * P , Q ] ;
2014-01-23 06:20:19 +00:00
if ( Q === 0 ) throw "Unexpected state: " + P + " " + P _1 + " " + P _2 + " " + Q + " " + Q _1 + " " + Q _2 ;
2013-12-27 03:15:16 +00:00
var q = Math . floor ( sgn * P / Q ) ;
return [ q , sgn * P - q * Q , Q ] ;
2013-12-16 16:32:34 +00:00
} ;
2014-05-03 18:51:10 +00:00
var general _fmt = function ( v , opts ) {
2013-03-26 23:54:14 +00:00
if ( typeof v === 'boolean' ) return v ? "TRUE" : "FALSE" ;
2013-12-27 03:15:16 +00:00
if ( typeof v === 'number' ) {
var o , V = v < 0 ? - v : v ;
if ( V >= 0.1 && V < 1 ) o = v . toPrecision ( 9 ) ;
else if ( V >= 0.01 && V < 0.1 ) o = v . toPrecision ( 8 ) ;
else if ( V >= 0.001 && V < 0.01 ) o = v . toPrecision ( 7 ) ;
else if ( V >= 0.0001 && V < 0.001 ) o = v . toPrecision ( 6 ) ;
else if ( V >= Math . pow ( 10 , 10 ) && V < Math . pow ( 10 , 11 ) ) o = v . toFixed ( 10 ) . substr ( 0 , 12 ) ;
else if ( V > Math . pow ( 10 , - 9 ) && V < Math . pow ( 10 , 11 ) ) {
2014-01-23 15:55:07 +00:00
o = v . toFixed ( 12 ) . replace ( /(\.[0-9]*[1-9])0*$/ , "$1" ) . replace ( /\.$/ , "" ) ;
2014-05-03 18:51:10 +00:00
if ( o . length > ( v < 0 ? 12 : 11 ) ) o = v . toPrecision ( 10 ) ;
if ( o . length > ( v < 0 ? 12 : 11 ) ) o = v . toExponential ( 5 ) ;
2014-01-23 15:55:07 +00:00
}
2013-12-27 03:15:16 +00:00
else {
o = v . toFixed ( 11 ) . replace ( /(\.[0-9]*[1-9])0*$/ , "$1" ) ;
2014-05-03 18:51:10 +00:00
if ( o . length > ( v < 0 ? 12 : 11 ) ) o = v . toPrecision ( 6 ) ;
2013-12-27 03:15:16 +00:00
}
o = o . replace ( /(\.[0-9]*[1-9])0+e/ , "$1e" ) . replace ( /\.0*e/ , "e" ) ;
return o . replace ( "e" , "E" ) . replace ( /\.0*$/ , "" ) . replace ( /\.([0-9]*[^0])0*$/ , ".$1" ) . replace ( /(E[+-])([0-9])$/ , "$1" + "0" + "$2" ) ;
}
if ( typeof v === 'string' ) return v ;
2014-02-17 08:44:22 +00:00
throw new Error ( "unsupported value in General format: " + v ) ;
2013-04-17 01:32:20 +00:00
} ;
2013-03-26 23:54:14 +00:00
SSF . _general = general _fmt ;
2014-05-03 18:51:10 +00:00
function fix _hijri ( date , o ) { return 0 ; }
2014-04-03 22:51:54 +00:00
var parse _date _code = function parse _date _code ( v , opts , b2 ) {
2014-01-23 06:20:19 +00:00
var date = Math . floor ( v ) , time = Math . floor ( 86400 * ( v - date ) + 1e-6 ) , dow = 0 ;
2014-05-03 18:51:10 +00:00
var dout = [ ] ;
var out = { D : date , T : time , u : 86400 * ( v - date ) - time , y : 0 , m : 0 , d : 0 , H : 0 , M : 0 , S : 0 , q : 0 } ;
fixopts ( opts = ( opts || { } ) ) ;
2013-03-26 23:54:14 +00:00
if ( opts . date1904 ) date += 1462 ;
2014-01-23 06:20:19 +00:00
if ( date > 2958465 ) return null ;
2014-03-29 22:53:15 +00:00
if ( out . u > 0.999 ) {
2014-03-29 02:05:50 +00:00
out . u = 0 ;
if ( ++ time == 86400 ) { time = 0 ; ++ date ; }
}
2014-04-03 22:51:54 +00:00
if ( date === 60 ) { dout = b2 ? [ 1317 , 10 , 29 ] : [ 1900 , 2 , 29 ] ; dow = 3 ; }
else if ( date === 0 ) { dout = b2 ? [ 1317 , 8 , 29 ] : [ 1900 , 1 , 0 ] ; dow = 6 ; }
2013-03-26 23:54:14 +00:00
else {
if ( date > 60 ) -- date ;
/* 1 = Jan 1 1900 */
var d = new Date ( 1900 , 0 , 1 ) ;
d . setDate ( d . getDate ( ) + date - 1 ) ;
dout = [ d . getFullYear ( ) , d . getMonth ( ) + 1 , d . getDate ( ) ] ;
dow = d . getDay ( ) ;
2014-04-03 22:51:54 +00:00
if ( date < 60 ) dow = ( dow + 6 ) % 7 ;
if ( b2 ) dow = fix _hijri ( d , dout ) ;
2013-03-26 23:54:14 +00:00
}
2013-10-30 22:26:31 +00:00
out . y = dout [ 0 ] ; out . m = dout [ 1 ] ; out . d = dout [ 2 ] ;
2013-03-26 23:54:14 +00:00
out . S = time % 60 ; time = Math . floor ( time / 60 ) ;
out . M = time % 60 ; time = Math . floor ( time / 60 ) ;
out . H = time ;
out . q = dow ;
return out ;
} ;
SSF . parse _date _code = parse _date _code ;
2014-01-22 04:58:26 +00:00
/*jshint -W086 */
2014-05-22 12:16:51 +00:00
var write _date = function ( type , fmt , val , ss0 ) {
var o , ss , tt , y = val . y , sss0 ;
2013-03-26 23:54:14 +00:00
switch ( type ) {
2014-04-03 22:51:54 +00:00
case 'b' : y = val . y + 543 ;
/* falls through */
case 'y' : switch ( fmt . length ) { /* year */
case 1 : case 2 : return pad ( y % 100 , 2 ) ;
default : return pad ( y % 10000 , 4 ) ;
2014-01-23 06:20:19 +00:00
}
2014-04-03 22:51:54 +00:00
case 'm' : switch ( fmt ) {
2013-03-26 23:54:14 +00:00
case 'm' : return val . m ;
case 'mm' : return pad ( val . m , 2 ) ;
case 'mmm' : return months [ val . m - 1 ] [ 1 ] ;
case 'mmmmm' : return months [ val . m - 1 ] [ 0 ] ;
2014-02-12 06:09:42 +00:00
default : return months [ val . m - 1 ] [ 2 ] ;
2014-01-23 06:20:19 +00:00
}
2013-03-26 23:54:14 +00:00
case 'd' : switch ( fmt ) { /* day */
case 'd' : return val . d ;
case 'dd' : return pad ( val . d , 2 ) ;
case 'ddd' : return days [ val . q ] [ 0 ] ;
2014-02-12 06:09:42 +00:00
default : return days [ val . q ] [ 1 ] ;
2014-01-23 06:20:19 +00:00
}
2013-03-26 23:54:14 +00:00
case 'h' : switch ( fmt ) { /* 12-hour */
case 'h' : return 1 + ( val . H + 11 ) % 12 ;
case 'hh' : return pad ( 1 + ( val . H + 11 ) % 12 , 2 ) ;
default : throw 'bad hour format: ' + fmt ;
2014-01-23 06:20:19 +00:00
}
2013-03-26 23:54:14 +00:00
case 'H' : switch ( fmt ) { /* 24-hour */
case 'h' : return val . H ;
case 'hh' : return pad ( val . H , 2 ) ;
default : throw 'bad hour format: ' + fmt ;
2014-01-23 06:20:19 +00:00
}
2013-03-26 23:54:14 +00:00
case 'M' : switch ( fmt ) { /* minutes */
case 'm' : return val . M ;
case 'mm' : return pad ( val . M , 2 ) ;
default : throw 'bad minute format: ' + fmt ;
2014-01-23 06:20:19 +00:00
}
2013-03-26 23:54:14 +00:00
case 's' : switch ( fmt ) { /* seconds */
2014-05-22 12:16:51 +00:00
case 's' : case 'ss' : case '.0' : case '.00' : case '.000' :
sss0 = ss0 || 0 ;
tt = Math . pow ( 10 , sss0 ) ;
ss = Math . round ( ( tt ) * ( val . S + val . u ) ) ;
if ( fmt === 's' ) return ss >= 60 * tt ? 0 : ss / tt ;
else if ( fmt === 'ss' ) { if ( ss >= 60 * tt ) ss = 0 ; return pad ( ss , ( 2 + sss0 ) ) . substr ( 0 , 2 ) ; }
if ( ss >= 60 * tt ) ss = 0 ;
o = pad ( ss , 2 + sss0 ) ;
return "." + o . substr ( 2 , fmt . length - 1 ) ;
2013-03-26 23:54:14 +00:00
default : throw 'bad second format: ' + fmt ;
2014-01-23 06:20:19 +00:00
}
2013-12-27 03:15:16 +00:00
case 'Z' : switch ( fmt ) {
2014-01-23 06:20:19 +00:00
case '[h]' : case '[hh]' : o = val . D * 24 + val . H ; break ;
case '[m]' : case '[mm]' : o = ( val . D * 24 + val . H ) * 60 + val . M ; break ;
case '[s]' : case '[ss]' : o = ( ( val . D * 24 + val . H ) * 60 + val . M ) * 60 + Math . round ( val . S + val . u ) ; break ;
2013-12-27 03:15:16 +00:00
default : throw 'bad abstime format: ' + fmt ;
2014-01-23 06:20:19 +00:00
} return fmt . length === 3 ? o : pad ( o , 2 ) ;
2013-04-03 23:03:39 +00:00
case 'e' : { return val . y ; } break ;
2013-03-26 23:54:14 +00:00
}
} ;
2014-01-22 04:58:26 +00:00
/*jshint +W086 */
var commaify = function ( s ) { return _strrev ( _strrev ( s ) . replace ( /.../g , "$&," ) ) . replace ( /^,/ , "" ) ; } ;
2013-12-16 16:32:34 +00:00
var write _num = function ( type , fmt , val ) {
2014-03-29 22:53:15 +00:00
if ( type === '(' && ! fmt . match ( /\).*[0#]/ ) ) {
2013-12-27 03:15:16 +00:00
var ffmt = fmt . replace ( /\( */ , "" ) . replace ( / \)/ , "" ) . replace ( /\)/ , "" ) ;
if ( val >= 0 ) return write _num ( 'n' , ffmt , val ) ;
return '(' + write _num ( 'n' , ffmt , - val ) + ')' ;
}
var mul = 0 , o ;
2014-03-29 22:53:15 +00:00
fmt = fmt . replace ( /%/g , function ( ) { mul ++ ; return "" ; } ) ;
2013-12-27 03:15:16 +00:00
if ( mul !== 0 ) return write _num ( type , fmt , val * Math . pow ( 10 , 2 * mul ) ) + fill ( "%" , mul ) ;
2014-03-29 02:05:50 +00:00
fmt = fmt . replace ( /(\.0+)(,+)$/g , function ( $$ , $1 , $2 ) { mul = $2 . length ; return $1 ; } ) ;
if ( mul !== 0 ) return write _num ( type , fmt , val / Math . pow ( 10 , 3 * mul ) ) ;
2013-12-27 03:15:16 +00:00
if ( fmt . indexOf ( "E" ) > - 1 ) {
var idx = fmt . indexOf ( "E" ) - fmt . indexOf ( "." ) - 1 ;
2014-02-12 06:09:42 +00:00
if ( fmt . match ( /^#+0.0E\+0$/ ) ) {
2014-04-23 01:37:08 +00:00
var period = fmt . indexOf ( "." ) ; if ( period === - 1 ) period = fmt . indexOf ( 'E' ) ;
2014-05-03 18:51:10 +00:00
var ee = ( Number ( val . toExponential ( 0 ) . substr ( 2 + ( val < 0 ? 1 : 0 ) ) ) ) % period ;
2014-02-12 06:09:42 +00:00
if ( ee < 0 ) ee += period ;
2014-01-23 06:20:19 +00:00
o = ( val / Math . pow ( 10 , ee ) ) . toPrecision ( idx + 1 + ( period + ee ) % period ) ;
if ( ! o . match ( /[Ee]/ ) ) {
2014-05-03 18:51:10 +00:00
var fakee = ( Number ( val . toExponential ( 0 ) . substr ( 2 + ( val < 0 ? 1 : 0 ) ) ) ) ;
2014-01-23 06:20:19 +00:00
if ( o . indexOf ( "." ) === - 1 ) o = o [ 0 ] + "." + o . substr ( 1 ) + "E+" + ( fakee - o . length + ee ) ;
2014-02-12 06:09:42 +00:00
else o += "E+" + ( fakee - ee ) ;
while ( o . substr ( 0 , 2 ) === "0." ) {
o = o [ 0 ] + o . substr ( 2 , period ) + "." + o . substr ( 2 + period ) ;
o = o . replace ( /^0+([1-9])/ , "$1" ) . replace ( /^0+\./ , "0." ) ;
}
o = o . replace ( /\+-/ , "-" ) ;
2014-01-23 06:20:19 +00:00
}
o = o . replace ( /^([+-]?)([0-9]*)\.([0-9]*)[Ee]/ , function ( $$ , $1 , $2 , $3 ) { return $1 + $2 + $3 . substr ( 0 , ( period + ee ) % period ) + "." + $3 . substr ( ee ) + "E" ; } ) ;
2013-12-27 03:15:16 +00:00
} else o = val . toExponential ( idx ) ;
if ( fmt . match ( /E\+00$/ ) && o . match ( /e[+-][0-9]$/ ) ) o = o . substr ( 0 , o . length - 1 ) + "0" + o [ o . length - 1 ] ;
if ( fmt . match ( /E\-/ ) && o . match ( /e\+/ ) ) o = o . replace ( /e\+/ , "e" ) ;
return o . replace ( "e" , "E" ) ;
}
2014-01-23 06:20:19 +00:00
if ( fmt [ 0 ] === "$" ) return "$" + write _num ( type , fmt . substr ( fmt [ 1 ] == ' ' ? 2 : 1 ) , val ) ;
2014-02-17 08:44:22 +00:00
var r , rr , ff , aval = val < 0 ? - val : val , sign = val < 0 ? "-" : "" ;
2014-01-23 06:20:19 +00:00
if ( ( r = fmt . match ( /# (\?+)([ ]?)\/([ ]?)(\d+)/ ) ) ) {
var den = Number ( r [ 4 ] ) , rnd = Math . round ( aval * den ) , base = Math . floor ( rnd / den ) ;
2013-12-27 03:15:16 +00:00
var myn = ( rnd - base * den ) , myd = den ;
2014-05-03 18:51:10 +00:00
return sign + String ( base || "" ) + " " + ( myn === 0 ? fill ( " " , r [ 1 ] . length + 1 + r [ 4 ] . length ) : pad ( myn , r [ 1 ] . length , " " ) + r [ 2 ] + "/" + r [ 3 ] + pad ( myd , r [ 4 ] . length ) ) ;
2014-01-23 06:20:19 +00:00
}
2014-02-12 06:09:42 +00:00
if ( fmt . match ( /^#+0+$/ ) ) fmt = fmt . replace ( /#/g , "" ) ;
2014-01-23 06:20:19 +00:00
if ( fmt . match ( /^00+$/ ) ) return ( val < 0 ? "-" : "" ) + pad ( Math . round ( aval ) , fmt . length ) ;
if ( fmt . match ( /^[#?]+$/ ) ) return String ( Math . round ( val ) ) . replace ( /^0$/ , "" ) ;
2014-03-29 02:05:50 +00:00
if ( ( r = fmt . match ( /^#*0*\.(0+)/ ) ) ) {
2014-01-23 06:20:19 +00:00
o = Math . round ( val * Math . pow ( 10 , r [ 1 ] . length ) ) ;
2014-03-29 02:05:50 +00:00
rr = 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 ) ; } ) ;
return fmt . match ( /0\./ ) ? rr : rr . replace ( /^0\./ , "." ) ;
2014-01-23 06:20:19 +00:00
}
2014-03-29 02:05:50 +00:00
fmt = fmt . replace ( /^#+([0.])/ , "$1" ) ;
2014-02-17 08:44:22 +00:00
if ( ( r = fmt . match ( /^(0*)\.(#*)$/ ) ) ) {
2014-03-19 17:53:20 +00:00
o = Math . round ( aval * Math . pow ( 10 , r [ 2 ] . length ) ) ;
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." : "." ) ;
2014-02-17 08:44:22 +00:00
}
if ( ( r = fmt . match ( /^#,##0([.]?)$/ ) ) ) return sign + commaify ( String ( Math . round ( aval ) ) ) ;
if ( ( r = fmt . match ( /^#,##0\.([#0]*0)$/ ) ) ) {
rr = Math . round ( ( val - Math . floor ( val ) ) * Math . pow ( 10 , r [ 1 ] . length ) ) ;
return val < 0 ? "-" + write _num ( type , fmt , - val ) : commaify ( String ( Math . floor ( val ) ) ) + "." + pad ( rr , r [ 1 ] . length , 0 ) ;
}
2014-03-29 02:05:50 +00:00
if ( ( r = fmt . match ( /^#,#*,#0/ ) ) ) return write _num ( type , fmt . replace ( /^#,#*,/ , "" ) , val ) ;
2014-05-03 18:51:10 +00:00
if ( ( r = fmt . match ( /^([0#]+)(\\?-([0#]+))+$/ ) ) ) {
ff = _strrev ( write _num ( type , fmt . replace ( /[\\-]/g , "" ) , val ) ) ;
rr = 0 ;
return _strrev ( _strrev ( fmt . replace ( /\\/g , "" ) ) . replace ( /[0#]/g , function ( x ) { return rr < ff . length ? ff [ rr ++ ] : x === '0' ? '0' : '' ; } ) ) ;
2014-03-29 22:53:15 +00:00
}
2014-04-03 22:51:54 +00:00
if ( fmt . match ( /\(###\) ###\\?-####/ ) ) {
2014-03-29 22:53:15 +00:00
ff = write _num ( type , "##########" , val ) ;
return "(" + ff . substr ( 0 , 3 ) + ") " + ff . substr ( 3 , 3 ) + "-" + ff . substr ( 6 ) ;
}
2014-03-29 02:05:50 +00:00
if ( ( r = fmt . match ( /^([?]+)([ ]?)\/([ ]?)([?]+)/ ) ) ) {
rr = Math . min ( Math . max ( r [ 1 ] . length , r [ 4 ] . length ) , 7 ) ;
ff = frac ( aval , Math . pow ( 10 , rr ) - 1 , false ) ;
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 ) ) ;
}
2014-01-29 06:00:09 +00:00
if ( ( r = fmt . match ( /^# ([?]+)([ ]?)\/([ ]?)([?]+)/ ) ) ) {
2014-02-17 08:44:22 +00:00
rr = Math . min ( Math . max ( r [ 1 ] . length , r [ 4 ] . length ) , 7 ) ;
2014-01-23 06:20:19 +00:00
ff = frac ( aval , Math . pow ( 10 , rr ) - 1 , true ) ;
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 ) ) ;
2013-12-27 03:15:16 +00:00
}
2014-05-22 12:16:51 +00:00
if ( ( r = fmt . match ( /^[#0]+$/ ) ) ) {
o = "" + Math . round ( val ) ;
if ( fmt . length <= o . length ) return o ;
return fmt . substr ( 0 , fmt . length - o . length ) . replace ( /#/g , "" ) + o ;
}
if ( ( r = fmt . match ( /^([#0]+)\.([#0]+)$/ ) ) ) {
o = "" + val . toFixed ( Math . min ( r [ 2 ] . length , 10 ) ) . replace ( /([^0])0+$/ , "$1" ) ;
rr = o . indexOf ( "." ) ;
var lres = fmt . indexOf ( "." ) - rr , rres = fmt . length - o . length - lres ;
return fmt . substr ( 0 , lres ) . replace ( /#/g , "" ) + o + fmt . substr ( fmt . length - rres ) . replace ( /#/g , "" ) ;
}
2014-03-29 02:05:50 +00:00
if ( ( r = fmt . match ( /^00,000\.([#0]*0)$/ ) ) ) {
rr = val == Math . floor ( val ) ? 0 : Math . round ( ( val - Math . floor ( val ) ) * Math . pow ( 10 , r [ 1 ] . length ) ) ;
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 ) ;
}
2013-12-27 03:15:16 +00:00
switch ( fmt ) {
2014-01-23 06:20:19 +00:00
case "#,###" : var x = commaify ( String ( Math . round ( aval ) ) ) ; return x !== "0" ? sign + x : "" ;
2013-12-27 03:15:16 +00:00
default :
}
throw new Error ( "unsupported format |" + fmt + "|" ) ;
2013-12-16 16:32:34 +00:00
} ;
2013-03-26 23:54:14 +00:00
function split _fmt ( fmt ) {
2013-12-27 03:15:16 +00:00
var out = [ ] ;
var in _str = - 1 ;
for ( var i = 0 , j = 0 ; i < fmt . length ; ++ i ) {
if ( in _str != - 1 ) { if ( fmt [ i ] == '"' ) in _str = - 1 ; continue ; }
if ( fmt [ i ] == "_" || fmt [ i ] == "*" || fmt [ i ] == "\\" ) { ++ i ; continue ; }
if ( fmt [ i ] == '"' ) { in _str = i ; continue ; }
if ( fmt [ i ] != ";" ) continue ;
out . push ( fmt . slice ( j , i ) ) ;
j = i + 1 ;
}
out . push ( fmt . slice ( j ) ) ;
2014-02-17 08:44:22 +00:00
if ( in _str != - 1 ) throw new Error ( "Format |" + fmt + "| unterminated string at " + in _str ) ;
2013-12-27 03:15:16 +00:00
return out ;
2013-03-26 23:54:14 +00:00
}
SSF . _split = split _fmt ;
2013-12-16 16:32:34 +00:00
function eval _fmt ( fmt , v , opts , flen ) {
2014-05-22 12:16:51 +00:00
var out = [ ] , o = "" , i = 0 , c = "" , lst = 't' , q , dt , j ;
2013-03-26 23:54:14 +00:00
fixopts ( opts = ( opts || { } ) ) ;
2013-04-17 01:32:20 +00:00
var hr = 'H' ;
2013-03-26 23:54:14 +00:00
/* Tokenize */
while ( i < fmt . length ) {
2013-04-17 01:32:20 +00:00
switch ( ( c = fmt [ i ] ) ) {
2014-01-23 06:20:19 +00:00
case 'G' : /* General */
2014-04-03 22:51:54 +00:00
if ( fmt . substr ( i , 7 ) . toLowerCase ( ) !== "general" )
2014-02-17 08:44:22 +00:00
throw new Error ( 'unrecognized character ' + fmt [ i ] + ' in ' + fmt ) ;
2014-01-23 06:20:19 +00:00
out . push ( { t : 'G' , v : 'General' } ) ; i += 7 ; break ;
2013-03-26 23:54:14 +00:00
case '"' : /* Literal text */
2013-12-31 16:42:46 +00:00
for ( o = "" ; fmt [ ++ i ] !== '"' && i < fmt . length ; ) o += fmt [ i ] ;
2013-12-27 03:15:16 +00:00
out . push ( { t : 't' , v : o } ) ; ++ i ; break ;
case '\\' : var w = fmt [ ++ i ] , t = "()" . indexOf ( w ) === - 1 ? 't' : w ;
out . push ( { t : t , v : w } ) ; ++ i ; break ;
case '_' : out . push ( { t : 't' , v : " " } ) ; i += 2 ; break ;
2013-03-26 23:54:14 +00:00
case '@' : /* Text Placeholder */
out . push ( { t : 'T' , v : v } ) ; ++ i ; break ;
2014-04-03 22:51:54 +00:00
case 'B' : case 'b' :
if ( fmt [ i + 1 ] === "1" || fmt [ i + 1 ] === "2" ) {
if ( ! dt ) dt = parse _date _code ( v , opts , fmt [ i + 1 ] === "2" ) ;
q = { t : 'X' , v : fmt . substr ( i , 2 ) } ; out . push ( q ) ; lst = c ; i += 2 ; break ;
}
/* falls through */
2014-01-23 06:20:19 +00:00
case 'M' : case 'D' : case 'Y' : case 'H' : case 'S' : case 'E' :
c = c . toLowerCase ( ) ;
/* falls through */
2014-03-29 02:05:50 +00:00
case 'm' : case 'd' : case 'y' : case 'h' : case 's' : case 'e' : case 'g' :
2013-12-27 03:15:16 +00:00
if ( v < 0 ) return "" ;
2013-03-26 23:54:14 +00:00
if ( ! dt ) dt = parse _date _code ( v , opts ) ;
2014-01-23 06:20:19 +00:00
if ( ! dt ) return "" ;
o = fmt [ i ] ; while ( ( fmt [ ++ i ] || "" ) . toLowerCase ( ) === c ) o += c ;
2013-03-26 23:54:14 +00:00
if ( c === 'm' && lst . toLowerCase ( ) === 'h' ) c = 'M' ; /* m = minute */
if ( c === 'h' ) c = hr ;
2014-01-23 06:20:19 +00:00
o = o . toLowerCase ( ) ;
2013-03-26 23:54:14 +00:00
q = { t : c , v : o } ; out . push ( q ) ; lst = c ; break ;
case 'A' :
2013-12-27 03:15:16 +00:00
if ( ! dt ) dt = parse _date _code ( v , opts ) ;
2014-01-23 06:20:19 +00:00
if ( ! dt ) return "" ;
2013-03-26 23:54:14 +00:00
q = { t : c , v : "A" } ;
2013-12-27 03:15:16 +00:00
if ( fmt . substr ( i , 3 ) === "A/P" ) { q . v = dt . H >= 12 ? "P" : "A" ; q . t = 'T' ; hr = 'h' ; i += 3 ; }
else if ( fmt . substr ( i , 5 ) === "AM/PM" ) { q . v = dt . H >= 12 ? "PM" : "AM" ; q . t = 'T' ; i += 5 ; hr = 'h' ; }
2014-01-23 06:20:19 +00:00
else { q . t = "t" ; i ++ ; }
2013-03-26 23:54:14 +00:00
out . push ( q ) ; lst = c ; break ;
2014-04-03 22:51:54 +00:00
case '[' :
2013-12-27 03:15:16 +00:00
o = c ;
2014-02-12 06:09:42 +00:00
while ( fmt [ i ++ ] !== ']' && i < fmt . length ) o += fmt [ i ] ;
if ( o . substr ( - 1 ) !== ']' ) throw 'unterminated "[" block: |' + o + '|' ;
2014-01-23 06:20:19 +00:00
if ( o . match ( /\[[HhMmSs]*\]/ ) ) {
if ( ! dt ) dt = parse _date _code ( v , opts ) ;
if ( ! dt ) return "" ;
out . push ( { t : 'Z' , v : o . toLowerCase ( ) } ) ;
} else { o = "" ; }
2013-12-27 03:15:16 +00:00
break ;
/* Numbers */
2014-05-22 12:16:51 +00:00
case '.' :
if ( dt ) {
o = c ; while ( ( c = fmt [ ++ i ] ) === "0" ) o += c ;
out . push ( { t : 's' , v : o } ) ; break ;
}
/* falls through */
case '0' : case '#' :
2014-04-03 22:51:54 +00:00
o = c ; while ( "0#?.,E+-%" . indexOf ( c = fmt [ ++ i ] ) > - 1 || c == '\\' && fmt [ i + 1 ] == "-" && "0#" . indexOf ( fmt [ i + 2 ] ) > - 1 ) o += c ;
2013-12-27 03:15:16 +00:00
out . push ( { t : 'n' , v : o } ) ; break ;
case '?' :
o = fmt [ i ] ; while ( fmt [ ++ i ] === c ) o += c ;
q = { t : c , v : o } ; out . push ( q ) ; lst = c ; break ;
2014-03-29 02:05:50 +00:00
case '*' : ++ i ; if ( fmt [ i ] == ' ' || fmt [ i ] == '*' ) ++ i ; break ; // **
2013-12-27 03:15:16 +00:00
case '(' : case ')' : out . push ( { t : ( flen === 1 ? 't' : c ) , v : c } ) ; ++ i ; break ;
case '1' : case '2' : case '3' : case '4' : case '5' : case '6' : case '7' : case '8' : case '9' :
o = fmt [ i ] ; while ( "0123456789" . indexOf ( fmt [ ++ i ] ) > - 1 ) o += fmt [ i ] ;
out . push ( { t : 'D' , v : o } ) ; break ;
case ' ' : out . push ( { t : c , v : c } ) ; ++ i ; break ;
2013-03-26 23:54:14 +00:00
default :
2014-04-03 22:51:54 +00:00
if ( ",$-+/():!^&'~{}<>=€acfijklopqrtuvwxz" . indexOf ( c ) === - 1 )
2013-03-26 23:54:14 +00:00
throw 'unrecognized character ' + fmt [ i ] + ' in ' + fmt ;
out . push ( { t : 't' , v : c } ) ; ++ i ; break ;
}
}
2014-05-22 12:16:51 +00:00
var bt = 0 , ss0 = 0 , ssm ;
2013-03-26 23:54:14 +00:00
for ( i = out . length - 1 , lst = 't' ; i >= 0 ; -- i ) {
switch ( out [ i ] . t ) {
2014-03-29 02:05:50 +00:00
case 'h' : case 'H' : out [ i ] . t = hr ; lst = 'h' ; if ( bt < 1 ) bt = 1 ; break ;
2014-05-22 12:16:51 +00:00
case 's' :
if ( ( ssm = out [ i ] . v . match ( /\.0+$/ ) ) ) ss0 = Math . max ( ss0 , ssm [ 0 ] . length - 1 ) ;
if ( bt < 3 ) bt = 3 ;
2014-03-29 02:05:50 +00:00
/* falls through */
case 'd' : case 'y' : case 'M' : case 'e' : lst = out [ i ] . t ; break ;
case 'm' : if ( lst === 's' ) { out [ i ] . t = 'M' ; if ( bt < 2 ) bt = 2 ; } break ;
2014-04-03 22:51:54 +00:00
case 'X' : if ( out [ i ] . v === "B2" ) ;
break ;
2014-03-29 02:05:50 +00:00
case 'Z' :
if ( bt < 1 && out [ i ] . v . match ( /[Hh]/ ) ) bt = 1 ;
if ( bt < 2 && out [ i ] . v . match ( /[Mm]/ ) ) bt = 2 ;
if ( bt < 3 && out [ i ] . v . match ( /[Ss]/ ) ) bt = 3 ;
2013-03-26 23:54:14 +00:00
}
}
2014-03-29 02:05:50 +00:00
switch ( bt ) {
case 0 : break ;
case 1 :
2014-03-29 22:53:15 +00:00
if ( dt . u >= 0.5 ) { dt . u = 0 ; ++ dt . S ; }
2014-03-29 02:05:50 +00:00
if ( dt . S >= 60 ) { dt . S = 0 ; ++ dt . M ; }
if ( dt . M >= 60 ) { dt . M = 0 ; ++ dt . H ; }
break ;
case 2 :
2014-03-29 22:53:15 +00:00
if ( dt . u >= 0.5 ) { dt . u = 0 ; ++ dt . S ; }
2014-03-29 02:05:50 +00:00
if ( dt . S >= 60 ) { dt . S = 0 ; ++ dt . M ; }
break ;
}
2013-03-26 23:54:14 +00:00
/* replace fields */
2014-05-22 12:16:51 +00:00
var nstr = "" , jj ;
2013-03-26 23:54:14 +00:00
for ( i = 0 ; i < out . length ; ++ i ) {
switch ( out [ i ] . t ) {
2014-02-12 06:09:42 +00:00
case 't' : case 'T' : case ' ' : case 'D' : break ;
2014-04-03 22:51:54 +00:00
case 'X' : delete out [ i ] ; break ;
case 'd' : case 'm' : case 'y' : case 'h' : case 'H' : case 'M' : case 's' : case 'e' : case 'b' : case 'Z' :
2014-05-22 12:16:51 +00:00
out [ i ] . v = write _date ( out [ i ] . t , out [ i ] . v , dt , ss0 ) ;
2013-03-26 23:54:14 +00:00
out [ i ] . t = 't' ; break ;
2014-01-23 06:20:19 +00:00
case 'n' : case '(' : case '?' :
2014-05-22 12:16:51 +00:00
jj = i + 1 ;
2014-03-29 22:53:15 +00:00
while ( out [ jj ] && ( "?D" . indexOf ( out [ jj ] . t ) > - 1 || ( " t" . indexOf ( out [ jj ] . t ) > - 1 && "?t" . indexOf ( ( out [ jj + 1 ] || { } ) . t ) > - 1 && ( out [ jj + 1 ] . t == '?' || out [ jj + 1 ] . v == '/' ) ) || out [ i ] . t == '(' && ( ")n " . indexOf ( out [ jj ] . t ) > - 1 ) || out [ jj ] . t == 't' && ( out [ jj ] . v == '/' || '$€' . indexOf ( out [ jj ] . v ) > - 1 || ( out [ jj ] . v == ' ' && ( out [ jj + 1 ] || { } ) . t == '?' ) ) ) ) {
2014-01-23 06:20:19 +00:00
out [ i ] . v += out [ jj ] . v ;
2013-12-27 03:15:16 +00:00
delete out [ jj ] ; ++ jj ;
}
2014-05-22 12:16:51 +00:00
nstr += out [ i ] . v ;
2014-01-23 06:20:19 +00:00
i = jj - 1 ; break ;
case 'G' : out [ i ] . t = 't' ; out [ i ] . v = general _fmt ( v , opts ) ; break ;
2013-03-26 23:54:14 +00:00
}
}
2014-05-22 12:16:51 +00:00
if ( nstr ) {
var ostr = write _num ( nstr [ 0 ] == '(' ? '(' : 'n' , nstr , ( v < 0 && nstr [ 0 ] == "-" ? - v : v ) ) ;
jj = ostr . length - 1 ;
var decpt = out . length ;
for ( i = 0 ; i < out . length ; ++ i ) if ( out [ i ] && out [ i ] . v . indexOf ( "." ) > - 1 ) { decpt = i ; break ; }
var lasti = out . length , vv ;
if ( decpt === out . length && ! ostr . match ( /E/ ) ) {
for ( i = out . length - 1 ; i >= 0 ; -- i ) {
if ( ! out [ i ] || 'n?(' . indexOf ( out [ i ] . t ) === - 1 ) continue ;
vv = out [ i ] . v . split ( "" ) ;
for ( j = vv . length - 1 ; j >= 0 ; -- j ) {
if ( jj >= 0 ) vv [ j ] = ostr [ jj -- ] ;
else vv [ j ] = "" ;
}
out [ i ] . v = vv . join ( "" ) ;
out [ i ] . t = 't' ;
lasti = i ;
}
if ( jj >= 0 && lasti < out . length ) out [ lasti ] . v = ostr . substr ( 0 , jj + 1 ) + out [ lasti ] . v ;
}
else if ( decpt !== out . length && ! ostr . match ( /E/ ) ) {
jj = ostr . indexOf ( "." ) - 1 ;
for ( i = decpt ; i >= 0 ; -- i ) {
if ( ! out [ i ] || 'n?(' . indexOf ( out [ i ] . t ) === - 1 ) continue ;
vv = out [ i ] . v . split ( "" ) ;
for ( j = out [ i ] . v . indexOf ( "." ) > - 1 && i == decpt ? out [ i ] . v . indexOf ( "." ) - 1 : vv . length - 1 ; j >= 0 ; -- j ) {
if ( jj >= 0 && "0#" . indexOf ( vv [ j ] ) > - 1 ) vv [ j ] = ostr [ jj -- ] ;
else vv [ j ] = "" ;
}
out [ i ] . v = vv . join ( "" ) ;
out [ i ] . t = 't' ;
lasti = i ;
}
if ( jj >= 0 && lasti < out . length ) out [ lasti ] . v = ostr . substr ( 0 , jj + 1 ) + out [ lasti ] . v ;
jj = ostr . indexOf ( "." ) + 1 ;
for ( i = decpt ; i < out . length ; ++ i ) {
if ( ! out [ i ] || 'n?(' . indexOf ( out [ i ] . t ) === - 1 && i != decpt ) continue ;
vv = out [ i ] . v . split ( "" ) ;
for ( j = out [ i ] . v . indexOf ( "." ) > - 1 && i == decpt ? out [ i ] . v . indexOf ( "." ) + 1 : 0 ; j < vv . length ; ++ j ) {
if ( jj < ostr . length ) vv [ j ] = ostr [ jj ++ ] ;
else vv [ j ] = "" ;
}
out [ i ] . v = vv . join ( "" ) ;
out [ i ] . t = 't' ;
lasti = i ;
}
}
}
for ( i = 0 ; i < out . length ; ++ i ) if ( out [ i ] && 'n(?' . indexOf ( out [ i ] . t ) > - 1 ) {
out [ i ] . v = write _num ( out [ i ] . t , out [ i ] . v , ( flen > 1 && v < 0 && i > 0 && out [ i - 1 ] . v == "-" ? - v : v ) ) ;
out [ i ] . t = 't' ;
}
2013-04-17 01:32:20 +00:00
return out . map ( function ( x ) { return x . v ; } ) . join ( "" ) ;
2013-03-26 23:54:14 +00:00
}
SSF . _eval = eval _fmt ;
2013-12-16 16:32:34 +00:00
function choose _fmt ( fmt , v , o ) {
2014-01-23 06:20:19 +00:00
if ( typeof fmt === 'number' ) fmt = ( ( o && o . table ) ? o . table : table _fmt ) [ fmt ] ;
2013-03-26 23:54:14 +00:00
if ( typeof fmt === "string" ) fmt = split _fmt ( fmt ) ;
2013-12-27 03:15:16 +00:00
var l = fmt . length ;
2014-02-12 06:09:42 +00:00
if ( l < 4 && fmt [ l - 1 ] . indexOf ( "@" ) > - 1 ) -- l ;
2013-12-27 03:15:16 +00:00
switch ( fmt . length ) {
2014-01-23 06:20:19 +00:00
case 1 : fmt = fmt [ 0 ] . indexOf ( "@" ) > - 1 ? [ "General" , "General" , "General" , fmt [ 0 ] ] : [ fmt [ 0 ] , fmt [ 0 ] , fmt [ 0 ] , "@" ] ; break ;
case 2 : fmt = fmt [ 1 ] . indexOf ( "@" ) > - 1 ? [ fmt [ 0 ] , fmt [ 0 ] , fmt [ 0 ] , fmt [ 1 ] ] : [ fmt [ 0 ] , fmt [ 1 ] , fmt [ 0 ] , "@" ] ; break ;
case 3 : fmt = fmt [ 2 ] . indexOf ( "@" ) > - 1 ? [ fmt [ 0 ] , fmt [ 1 ] , fmt [ 0 ] , fmt [ 2 ] ] : [ fmt [ 0 ] , fmt [ 1 ] , fmt [ 2 ] , "@" ] ; break ;
2013-12-27 03:15:16 +00:00
case 4 : break ;
default : throw "cannot find right format for |" + fmt + "|" ;
}
if ( typeof v !== "number" ) return [ fmt . length , fmt [ 3 ] ] ;
2014-03-29 22:53:15 +00:00
var ff = v > 0 ? fmt [ 0 ] : v < 0 ? fmt [ 1 ] : fmt [ 2 ] ;
if ( fmt [ 0 ] . match ( /\[[=<>]/ ) || fmt [ 1 ] . match ( /\[[=<>]/ ) ) {
var chk = function ( v , rr , out ) {
if ( ! rr ) return null ;
var found = false ;
var thresh = Number ( rr [ 2 ] ) ;
switch ( rr [ 1 ] ) {
case "=" : if ( v == thresh ) found = true ; break ;
case ">" : if ( v > thresh ) found = true ; break ;
case "<" : if ( v < thresh ) found = true ; break ;
case "<>" : if ( v != thresh ) found = true ; break ;
case ">=" : if ( v >= thresh ) found = true ; break ;
case "<=" : if ( v <= thresh ) found = true ; break ;
}
return found ? out : null ;
} ;
var m1 = fmt [ 0 ] . match ( /\[([=<>]*)([-]?\d+)\]/ ) ;
var m2 = fmt [ 1 ] . match ( /\[([=<>]*)([-]?\d+)\]/ ) ;
return chk ( v , m1 , [ l , fmt [ 0 ] ] ) || chk ( v , m2 , [ l , fmt [ 1 ] ] ) || [ l , fmt [ m1 && m2 ? 2 : 1 ] ] ;
}
return [ l , ff ] ;
2013-03-26 23:54:14 +00:00
}
var format = function format ( fmt , v , o ) {
fixopts ( o = ( o || { } ) ) ;
2014-01-23 06:20:19 +00:00
if ( typeof fmt === "string" && fmt . toLowerCase ( ) === "general" ) return general _fmt ( v , o ) ;
if ( typeof fmt === 'number' ) fmt = ( o . table || table _fmt ) [ fmt ] ;
2013-03-26 23:54:14 +00:00
var f = choose _fmt ( fmt , v , o ) ;
2014-01-23 06:20:19 +00:00
if ( f [ 1 ] . toLowerCase ( ) === "general" ) return general _fmt ( v , o ) ;
if ( v === true ) v = "TRUE" ; if ( v === false ) v = "FALSE" ;
2014-01-29 06:00:09 +00:00
if ( v === "" || typeof v === "undefined" ) return "" ;
2013-12-27 03:15:16 +00:00
return eval _fmt ( f [ 1 ] , v , o , f [ 0 ] ) ;
2013-04-17 01:32:20 +00:00
} ;
2013-03-26 23:54:14 +00:00
SSF . _choose = choose _fmt ;
SSF . _table = table _fmt ;
SSF . load = function ( fmt , idx ) { table _fmt [ idx ] = fmt ; } ;
SSF . format = format ;
2014-01-22 04:58:26 +00:00
SSF . get _table = function ( ) { return table _fmt ; } ;
SSF . load _table = function ( tbl ) { for ( var i = 0 ; i != 0x0188 ; ++ i ) if ( tbl [ i ] ) SSF . load ( tbl [ i ] , i ) ; } ;
2013-12-16 16:32:34 +00:00
} ;
make _ssf ( SSF ) ;
2014-05-16 00:33:34 +00:00
function isval ( x ) { return typeof x !== "undefined" && x !== null ; }
function keys ( o ) { return Object . keys ( o ) . filter ( function ( x ) { return o . hasOwnProperty ( x ) ; } ) ; }
function evert ( obj , arr ) {
var o = { } ;
keys ( obj ) . forEach ( function ( k ) {
if ( ! obj . hasOwnProperty ( k ) ) return ;
2014-05-29 22:30:03 +00:00
if ( arr && typeof arr === "string" ) o [ obj [ k ] [ arr ] ] = k ;
2014-05-16 00:33:34 +00:00
if ( ! arr ) o [ obj [ k ] ] = k ;
else ( o [ obj [ k ] ] = o [ obj [ k ] ] || [ ] ) . push ( k ) ;
} ) ;
return o ;
}
2014-05-22 12:16:51 +00:00
/* TODO: date1904 logic */
function datenum ( v , date1904 ) {
if ( date1904 ) v += 1462 ;
var epoch = Date . parse ( v ) ;
return ( epoch - new Date ( Date . UTC ( 1899 , 11 , 30 ) ) ) / ( 24 * 60 * 60 * 1000 ) ;
}
2014-01-28 16:38:02 +00:00
function getdata ( data ) {
if ( ! data ) return null ;
2014-05-22 12:16:51 +00:00
if ( data . data ) return data . name . substr ( - 4 ) !== ".bin" ? debom _xml ( data . data ) : data . data . split ( "" ) . map ( function ( x ) { return x . charCodeAt ( 0 ) ; } ) ;
2014-01-30 03:06:14 +00:00
if ( data . asNodeBuffer && typeof Buffer !== 'undefined' && data . name . substr ( - 4 ) === ".bin" ) return data . asNodeBuffer ( ) ;
2014-05-22 12:16:51 +00:00
if ( data . asBinary && data . name . substr ( - 4 ) !== ".bin" ) return debom _xml ( data . asBinary ( ) ) ;
2014-01-28 16:38:02 +00:00
if ( data . _data && data . _data . getContent ) {
/* TODO: something far more intelligent */
if ( data . name . substr ( - 4 ) === ".bin" ) return Array . prototype . slice . call ( data . _data . getContent ( ) ) ;
return Array . prototype . slice . call ( data . _data . getContent ( ) , 0 ) . map ( function ( x ) { return String . fromCharCode ( x ) ; } ) . join ( "" ) ;
}
return null ;
}
function getzipfile ( zip , file ) {
var f = file ; if ( zip . files [ f ] ) return zip . files [ f ] ;
f = file . toLowerCase ( ) ; if ( zip . files [ f ] ) return zip . files [ f ] ;
f = f . replace ( /\//g , '\\' ) ; if ( zip . files [ f ] ) return zip . files [ f ] ;
throw new Error ( "Cannot find file " + file + " in zip" ) ;
}
2014-02-15 05:08:18 +00:00
function getzipdata ( zip , file , safe ) {
if ( ! safe ) return getdata ( getzipfile ( zip , file ) ) ;
if ( ! file ) return null ;
try { return getzipdata ( zip , file ) ; } catch ( e ) { return null ; }
}
2014-01-28 16:38:02 +00:00
var _fs , jszip ;
if ( typeof JSZip !== 'undefined' ) jszip = JSZip ;
if ( typeof exports !== 'undefined' ) {
if ( typeof module !== 'undefined' && module . exports ) {
2014-01-30 03:06:14 +00:00
if ( typeof Buffer !== 'undefined' && typeof jszip === 'undefined' ) jszip = require ( 'jszip' ) ;
2014-01-28 16:38:02 +00:00
if ( typeof jszip === 'undefined' ) jszip = require ( './jszip' ) . JSZip ;
_fs = require ( 'fs' ) ;
}
}
2014-05-03 18:51:10 +00:00
var _chr = function ( c ) { return String . fromCharCode ( c ) ; } ;
2014-05-16 00:33:34 +00:00
var _ord = function ( c ) { return c . charCodeAt ( 0 ) ; } ;
2014-04-03 22:51:54 +00:00
var attregexg = /([\w:]+)=((?:")([^"]*)(?:")|(?:')([^']*)(?:'))/g ;
var attregex = /([\w:]+)=((?:")(?:[^"]*)(?:")|(?:')(?:[^']*)(?:'))/ ;
2013-05-02 16:59:27 +00:00
function parsexmltag ( tag ) {
var words = tag . split ( /\s+/ ) ;
var z = { '0' : words [ 0 ] } ;
if ( words . length === 1 ) return z ;
2014-04-03 22:51:54 +00:00
( tag . match ( attregexg ) || [ ] ) . map ( function ( x ) {
var y = x . match ( attregex ) ;
y [ 1 ] = y [ 1 ] . replace ( /xmlns:/ , "xmlns" ) ;
z [ y [ 1 ] . replace ( /^[a-zA-Z]*:/ , "" ) ] = y [ 2 ] . substr ( 1 , y [ 2 ] . length - 2 ) ;
} ) ;
2013-05-02 16:59:27 +00:00
return z ;
}
var encodings = {
'"' : '"' ,
''' : "'" ,
'>' : '>' ,
'<' : '<' ,
'&' : '&'
} ;
2014-01-29 06:00:09 +00:00
var rencoding = evert ( encodings ) ;
2014-01-28 16:38:02 +00:00
var rencstr = "&<>'\"" . split ( "" ) ;
2014-01-29 06:00:09 +00:00
2013-05-02 16:59:27 +00:00
// TODO: CP remap (need to read file version to determine OS)
function unescapexml ( text ) {
var s = text + '' ;
2014-05-25 09:04:08 +00:00
s = s . replace ( /"/g , '"' ) . replace ( /'/g , "'" ) . replace ( />/g , ">" ) . replace ( /</g , "<" ) . replace ( /&/g , "&" ) ;
2013-05-02 16:59:27 +00:00
return s . replace ( /_x([0-9a-fA-F]*)_/g , function ( m , c ) { return _chr ( parseInt ( c , 16 ) ) ; } ) ;
}
2014-01-28 16:38:02 +00:00
function escapexml ( text ) {
var s = text + '' ;
rencstr . forEach ( function ( y ) { s = s . replace ( new RegExp ( y , 'g' ) , rencoding [ y ] ) ; } ) ;
2014-05-29 22:30:03 +00:00
s = s . replace ( /[\u0000-\u0008\u000b-\u001f]/g , function ( s ) { return "_x" + ( "0000" + _ord ( s ) . toString ( 16 ) ) . substr ( - 4 ) + "_" ; } ) ;
2014-01-28 16:38:02 +00:00
return s ;
}
2013-05-02 16:59:27 +00:00
function parsexmlbool ( value , tag ) {
switch ( value ) {
case '0' : case 0 : case 'false' : case 'FALSE' : return false ;
case '1' : case 1 : case 'true' : case 'TRUE' : return true ;
default : throw "bad boolean value " + value + " in " + ( tag || "?" ) ;
}
}
var utf8read = function ( orig ) {
2014-02-22 21:36:28 +00:00
var out = [ ] , i = 0 , c = 0 , c1 = 0 , c2 = 0 , c3 = 0 ;
2014-05-25 09:04:08 +00:00
if ( ! orig . match ( /[\u0080-\uffff]/ ) ) return orig ;
2013-05-02 16:59:27 +00:00
while ( i < orig . length ) {
c = orig . charCodeAt ( i ++ ) ;
2014-02-22 21:36:28 +00:00
if ( c < 128 ) out . push ( _chr ( c ) ) ;
2013-05-02 16:59:27 +00:00
else {
c2 = orig . charCodeAt ( i ++ ) ;
2014-02-22 21:36:28 +00:00
if ( c > 191 && c < 224 ) out . push ( _chr ( ( c & 31 ) << 6 | c2 & 63 ) ) ;
2013-05-02 16:59:27 +00:00
else {
c3 = orig . charCodeAt ( i ++ ) ;
2014-02-22 21:36:28 +00:00
out . push ( _chr ( ( c & 15 ) << 12 | ( c2 & 63 ) << 6 | c3 & 63 ) ) ;
2013-05-02 16:59:27 +00:00
}
}
}
2014-02-22 21:36:28 +00:00
return out . join ( "" ) ;
2013-05-02 16:59:27 +00:00
} ;
// matches <foo>...</foo> extracts content
2014-04-15 09:04:03 +00:00
function matchtag ( f , g ) { return new RegExp ( '<(?:\\w+:)?' + f + '(?: xml:space="preserve")?(?:[^>]*)>([^\u2603]*)</(?:\\w+:)?' + f + '>' , ( g || "" ) + "m" ) ; }
2013-05-02 16:59:27 +00:00
function parseVector ( data ) {
var h = parsexmltag ( data ) ;
2013-11-06 06:05:32 +00:00
var matches = data . match ( new RegExp ( "<vt:" + h . baseType + ">(.*?)</vt:" + h . baseType + ">" , 'g' ) ) || [ ] ;
2013-05-02 16:59:27 +00:00
if ( matches . length != h . size ) throw "unexpected vector length " + matches . length + " != " + h . size ;
var res = [ ] ;
matches . forEach ( function ( x ) {
var v = x . replace ( /<[/]?vt:variant>/g , "" ) . match ( /<vt:([^>]*)>(.*)</ ) ;
res . push ( { v : v [ 2 ] , t : v [ 1 ] } ) ;
} ) ;
return res ;
}
2014-05-16 00:33:34 +00:00
function writetag ( f , g ) { return '<' + f + ( g . match ( /(^\s|\s$|\n)/ ) ? ' xml:space="preserve"' : "" ) + '>' + g + '</' + f + '>' ; }
2014-05-29 22:30:03 +00:00
function writextag ( f , g , h ) { return '<' + f + ( h !== null && h !== undefined ? keys ( h ) . map ( function ( k ) { return " " + k + '="' + h [ k ] + '"' ; } ) . join ( "" ) : "" ) + ( g === null || g === undefined ? "/" : ( g . match ( /(^\s|\s$|\n)/ ) ? ' xml:space="preserve"' : "" ) + '>' + g + '</' + f ) + '>' ; }
2014-05-16 00:33:34 +00:00
function write _w3cdtf ( d , t ) { try { return d . toISOString ( ) . replace ( /\.\d*/ , "" ) ; } catch ( e ) { if ( t ) throw e ; } }
function write _vt ( s ) {
if ( typeof s == 'string' ) return writextag ( 'vt:lpwstr' , s ) ;
if ( typeof s == 'number' ) return writextag ( ( s | 0 ) == s ? 'vt:i4' : 'vt:r8' , String ( s ) ) ;
if ( typeof s == 'boolean' ) return writextag ( 'vt:bool' , s ? 'true' : 'false' ) ;
if ( s instanceof Date ) return writextag ( 'vt:filetime' , write _w3cdtf ( s ) ) ;
throw new Error ( "Unable to serialize " + s ) ;
}
var XML _HEADER = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>\r\n' ;
var XMLNS = {
'dc' : 'http://purl.org/dc/elements/1.1/' ,
'dcterms' : 'http://purl.org/dc/terms/' ,
'dcmitype' : 'http://purl.org/dc/dcmitype/' ,
'mx' : 'http://schemas.microsoft.com/office/mac/excel/2008/main' ,
'r' : 'http://schemas.openxmlformats.org/officeDocument/2006/relationships' ,
'sjs' : 'http://schemas.openxmlformats.org/package/2006/sheetjs/core-properties' ,
'vt' : 'http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes' ,
'xsi' : 'http://www.w3.org/2001/XMLSchema-instance' ,
'xsd' : 'http://www.w3.org/2001/XMLSchema'
} ;
XMLNS . main = [
'http://schemas.openxmlformats.org/spreadsheetml/2006/main' ,
'http://purl.oclc.org/ooxml/spreadsheetml/main' ,
'http://schemas.microsoft.com/office/excel/2006/main' ,
'http://schemas.microsoft.com/office/excel/2006/2'
] ;
2014-01-28 16:38:02 +00:00
function readIEEE754 ( buf , idx , isLE , nl , ml ) {
if ( isLE === undefined ) isLE = true ;
if ( ! nl ) nl = 8 ;
if ( ! ml && nl === 8 ) ml = 52 ;
var e , m , el = nl * 8 - ml - 1 , eMax = ( 1 << el ) - 1 , eBias = eMax >> 1 ;
var bits = - 7 , d = isLE ? - 1 : 1 , i = isLE ? ( nl - 1 ) : 0 , s = buf [ idx + i ] ;
i += d ;
e = s & ( ( 1 << ( - bits ) ) - 1 ) ; s >>>= ( - bits ) ; bits += el ;
for ( ; bits > 0 ; e = e * 256 + buf [ idx + i ] , i += d , bits -= 8 ) ;
m = e & ( ( 1 << ( - bits ) ) - 1 ) ; e >>>= ( - bits ) ; bits += ml ;
for ( ; bits > 0 ; m = m * 256 + buf [ idx + i ] , i += d , bits -= 8 ) ;
if ( e === eMax ) return m ? NaN : ( ( s ? - 1 : 1 ) * Infinity ) ;
else if ( e === 0 ) e = 1 - eBias ;
else { m = m + Math . pow ( 2 , ml ) ; e = e - eBias ; }
return ( s ? - 1 : 1 ) * m * Math . pow ( 2 , e - ml ) ;
}
2014-05-29 22:30:03 +00:00
var _ _toBuffer , _ _ _toBuffer ;
_ _toBuffer = _ _ _toBuffer = function ( bufs ) {
var x = [ ] ;
for ( var i = 0 ; i != bufs [ 0 ] . length ; ++ i ) { x = x . concat ( bufs [ 0 ] [ i ] ) ; }
return x ;
} ;
2014-01-28 16:38:02 +00:00
if ( typeof Buffer !== "undefined" ) {
Buffer . prototype . hexlify = function ( ) { return this . toString ( 'hex' ) ; } ;
2014-05-29 22:30:03 +00:00
_ _toBuffer = function ( bufs ) { try { return Buffer . concat ( bufs [ 0 ] ) ; } catch ( e ) { return _ _ _toBuffer ( bufs ) ; } } ;
2014-01-28 16:38:02 +00:00
}
var _ _readUInt8 = function ( b , idx ) { return b . readUInt8 ? b . readUInt8 ( idx ) : b [ idx ] ; } ;
var _ _readUInt16LE = function ( b , idx ) { return b . readUInt16LE ? b . readUInt16LE ( idx ) : b [ idx + 1 ] * ( 1 << 8 ) + b [ idx ] ; } ;
var _ _readInt16LE = function ( b , idx ) { var u = _ _readUInt16LE ( b , idx ) ; if ( ! ( u & 0x8000 ) ) return u ; return ( 0xffff - u + 1 ) * - 1 ; } ;
var _ _readUInt32LE = function ( b , idx ) { return b . readUInt32LE ? b . readUInt32LE ( idx ) : b [ idx + 3 ] * ( 1 << 24 ) + b [ idx + 2 ] * ( 1 << 16 ) + b [ idx + 1 ] * ( 1 << 8 ) + b [ idx ] ; } ;
var _ _readInt32LE = function ( b , idx ) { if ( b . readInt32LE ) return b . readInt32LE ( idx ) ; var u = _ _readUInt32LE ( b , idx ) ; if ( ! ( u & 0x80000000 ) ) return u ; return ( 0xffffffff - u + 1 ) * - 1 ; } ;
var _ _readDoubleLE = function ( b , idx ) { return b . readDoubleLE ? b . readDoubleLE ( idx ) : readIEEE754 ( b , idx || 0 ) ; } ;
2014-05-29 22:30:03 +00:00
var _ _hexlify = function ( b , l ) { if ( b . hexlify ) return b . hexlify ( ( b . l || 0 ) , ( b . l || 0 ) + l ) ; return b . slice ( b . l || 0 , ( b . l || 0 ) + 16 ) . map ( function ( x ) { return ( x < 16 ? "0" : "" ) + x . toString ( 16 ) ; } ) . join ( "" ) ; } ;
2014-01-28 16:38:02 +00:00
function ReadShift ( size , t ) {
2014-05-29 22:30:03 +00:00
var o = "" , oo = [ ] , w , vv , i , loc ; t = t || 'u' ;
2014-01-28 16:38:02 +00:00
if ( size === 'ieee754' ) { size = 8 ; t = 'f' ; }
switch ( size ) {
case 1 : o = _ _readUInt8 ( this , this . l ) ; break ;
case 2 : o = ( t === 'u' ? _ _readUInt16LE : _ _readInt16LE ) ( this , this . l ) ; break ;
case 4 : o = _ _readUInt32LE ( this , this . l ) ; break ;
case 8 : if ( t === 'f' ) { o = _ _readDoubleLE ( this , this . l ) ; break ; }
/* falls through */
2014-05-29 22:30:03 +00:00
case 16 : o = _ _hexlify ( this , 16 ) ; break ;
2014-01-28 16:38:02 +00:00
2014-02-22 21:36:28 +00:00
case 'dbcs' : size = 2 * t ; loc = this . l ;
2014-01-28 16:38:02 +00:00
for ( i = 0 ; i != t ; ++ i ) {
2014-02-22 21:36:28 +00:00
oo . push ( _getchar ( _ _readUInt16LE ( this , loc ) ) ) ;
2014-01-28 16:38:02 +00:00
loc += 2 ;
2014-02-22 21:36:28 +00:00
} o = oo . join ( "" ) ; break ;
2014-01-28 16:38:02 +00:00
}
this . l += size ; return o ;
}
2014-05-29 22:30:03 +00:00
function WriteShift ( t , val , f ) {
var size , i ;
if ( t === 'ieee754' ) { f = 'f' ; t = 8 ; }
switch ( t ) {
case 1 : size = 1 ; this . writeUInt8 ( val , this . l ) ; break ;
case 4 : size = 4 ; this . writeUInt32LE ( val , this . l ) ; break ;
case 8 : size = 8 ; if ( f === 'f' ) { this . writeDoubleLE ( val , this . l ) ; break ; }
/* falls through */
case 16 : break ;
case - 4 : size = 4 ; this . writeInt32LE ( val , this . l ) ; break ;
case 'dbcs' :
for ( i = 0 ; i != val . length ; ++ i ) this . writeUInt16LE ( val . charCodeAt ( i ) , this . l + 2 * i ) ;
size = 2 * val . length ;
break ;
}
this . l += size ; return this ;
}
function prep _blob ( blob , pos , w ) {
2014-01-28 16:38:02 +00:00
blob . l = pos || 0 ;
2014-05-29 22:30:03 +00:00
if ( w ) {
var write = WriteShift . bind ( blob ) ;
blob . write _shift = write ;
return [ write ] ;
} else {
var read = ReadShift . bind ( blob ) ;
blob . read _shift = read ;
return [ read ] ;
}
2014-01-28 16:38:02 +00:00
}
function parsenoop ( blob , length ) { blob . l += length ; }
2014-05-29 22:30:03 +00:00
function writenoop ( blob , length ) { blob . l += length ; }
var new _buf = function ( sz ) {
var o = typeof Buffer !== 'undefined' ? new Buffer ( sz ) : new Array ( sz ) ;
prep _blob ( o , 0 , true ) ;
return o ;
} ;
var is _buf = function ( a ) { return ( typeof Buffer !== 'undefined' && a instanceof Buffer ) || Array . isArray ( a ) ; } ;
2014-01-28 16:38:02 +00:00
/* [MS-XLSB] 2.1.4 Record */
2014-02-13 06:22:42 +00:00
var recordhopper = function ( data , cb , opts ) {
2014-01-29 06:00:09 +00:00
var tmpbyte , cntbyte , length ;
2014-01-28 16:38:02 +00:00
prep _blob ( data , data . l || 0 ) ;
while ( data . l < data . length ) {
var RT = data . read _shift ( 1 ) ;
if ( RT & 0x80 ) RT = ( RT & 0x7F ) + ( ( data . read _shift ( 1 ) & 0x7F ) << 7 ) ;
var R = RecordEnum [ RT ] || RecordEnum [ 0xFFFF ] ;
2014-02-12 06:09:42 +00:00
tmpbyte = data . read _shift ( 1 ) ;
length = tmpbyte & 0x7F ;
2014-01-28 16:38:02 +00:00
for ( cntbyte = 1 ; cntbyte < 4 && ( tmpbyte & 0x80 ) ; ++ cntbyte ) length += ( ( tmpbyte = data . read _shift ( 1 ) ) & 0x7F ) << ( 7 * cntbyte ) ;
2014-02-13 06:22:42 +00:00
var d = R . f ( data , length , opts ) ;
2014-01-31 11:52:18 +00:00
if ( cb ( d , R , RT ) ) return ;
2014-01-28 16:38:02 +00:00
}
} ;
2014-02-12 06:09:42 +00:00
2014-05-16 00:33:34 +00:00
/* control buffer usage for fixed-length buffers */
2014-05-29 22:30:03 +00:00
var buf _array = function ( ) {
var bufs = [ ] , blksz = 2048 ;
var newblk = function ( sz ) {
var o = new _buf ( sz || blksz ) ;
prep _blob ( o , 0 , true ) ;
return o ;
} ;
var curbuf = newblk ( ) ;
var endbuf = function ( ) {
curbuf . length = curbuf . l ;
if ( curbuf . length > 0 ) bufs . push ( curbuf ) ;
curbuf = null ;
} ;
var next = function ( sz ) {
if ( sz < curbuf . length - curbuf . l ) return curbuf ;
endbuf ( ) ;
return ( curbuf = newblk ( Math . max ( sz + 1 , blksz ) ) ) ;
} ;
var end = function ( ) {
endbuf ( ) ;
return _ _toBuffer ( [ bufs ] ) ;
} ;
var push = function ( buf ) { endbuf ( ) ; curbuf = buf ; next ( ) ; } ;
return { next : next , push : push , end : end , _bufs : bufs } ;
} ;
var write _record = function ( ba , type , payload , length ) {
var t = evert _RE [ type ] , l ;
if ( ! length ) length = RecordEnum [ t ] . p || ( payload || [ ] ) . length || 0 ;
l = 1 + ( t >= 0x80 ? 1 : 0 ) + 1 + length ;
if ( length >= 0x80 ) ++ l ; if ( length >= 0x4000 ) ++ l ; if ( length >= 0x200000 ) ++ l ;
var o = ba . next ( l ) ;
if ( t <= 0x7F ) o . write _shift ( 1 , t ) ;
else {
o . write _shift ( 1 , ( t & 0x7F ) + 0x80 ) ;
o . write _shift ( 1 , ( t >> 7 ) ) ;
}
for ( var i = 0 ; i != 4 ; ++ i ) {
if ( length >= 0x80 ) { o . write _shift ( 1 , ( length & 0x7F ) + 0x80 ) ; length >>= 7 ; }
else { o . write _shift ( 1 , length ) ; break ; }
}
if ( length > 0 && is _buf ( payload ) ) ba . push ( payload ) ;
2014-05-16 00:33:34 +00:00
} ;
2014-02-12 06:09:42 +00:00
/* [MS-XLSB] 2.5.143 */
var parse _StrRun = function ( data , length ) {
return { ich : data . read _shift ( 2 ) , ifnt : data . read _shift ( 2 ) } ;
2014-02-13 08:48:41 +00:00
} ;
2014-02-12 06:09:42 +00:00
2014-01-28 16:38:02 +00:00
/* [MS-XLSB] 2.1.7.121 */
var parse _RichStr = function ( data , length ) {
var start = data . l ;
var flags = data . read _shift ( 1 ) ;
var fRichStr = flags & 1 , fExtStr = flags & 2 ;
var str = parse _XLWideString ( data ) ;
2014-02-12 06:09:42 +00:00
var rgsStrRun = [ ] ;
2014-01-29 06:00:09 +00:00
var z = {
2014-01-28 16:38:02 +00:00
t : str ,
2014-02-05 13:39:21 +00:00
r : "<t>" + escapexml ( str ) + "</t>" ,
h : str
2014-01-29 06:00:09 +00:00
} ;
2014-01-28 16:38:02 +00:00
if ( fRichStr ) {
/* TODO: formatted string */
var dwSizeStrRun = data . read _shift ( 4 ) ;
2014-02-12 06:09:42 +00:00
for ( var i = 0 ; i != dwSizeStrRun ; ++ i ) rgsStrRun . push ( parse _StrRun ( data ) ) ;
2014-03-29 02:05:50 +00:00
z . r = JSON . stringify ( rgsStrRun ) ;
2014-01-28 16:38:02 +00:00
}
if ( fExtStr ) {
/* TODO: phonetic string */
}
data . l = start + length ;
return z ;
} ;
/* [MS-XLSB] 2.5.9 */
function parse _Cell ( data ) {
var col = data . read _shift ( 4 ) ;
var iStyleRef = data . read _shift ( 2 ) ;
iStyleRef += data . read _shift ( 1 ) << 16 ;
var fPhShow = data . read _shift ( 1 ) ;
2014-01-31 11:52:18 +00:00
return { c : col , iStyleRef : iStyleRef } ;
2014-01-28 16:38:02 +00:00
}
/* [MS-XLSB] 2.5.21 */
var parse _CodeName = function ( data , length ) { return parse _XLWideString ( data , length ) ; } ;
2014-05-29 22:30:03 +00:00
/* [MS-XLSB] 2.5.166 */
var parse _XLNullableWideString = function ( data ) {
var cchCharacters = data . read _shift ( 4 ) ;
return cchCharacters === 0 || cchCharacters === 0xFFFFFFFF ? "" : data . read _shift ( 'dbcs' , cchCharacters ) ;
} ;
var write _XLNullableWideString = function ( data , o ) {
if ( ! o ) o = new _buf ( 127 ) ;
o . write _shift ( 4 , data . length || 0xFFFFFFFF ) ;
if ( data . length > 0 ) o . write _shift ( 'dbcs' , data ) ;
return o ;
} ;
/* [MS-XLSB] 2.5.168 */
var parse _XLWideString = function ( data ) {
var cchCharacters = data . read _shift ( 4 ) ;
return cchCharacters === 0 ? "" : data . read _shift ( 'dbcs' , cchCharacters ) ;
} ;
var write _XLWideString = function ( data , o ) {
if ( ! o ) o = new _buf ( 127 ) ;
o . write _shift ( 4 , data . length ) ;
if ( data . length > 0 ) o . write _shift ( 'dbcs' , data ) ;
return o ;
} ;
2014-01-28 16:38:02 +00:00
/* [MS-XLSB] 2.5.114 */
2014-05-29 22:30:03 +00:00
var parse _RelID = parse _XLNullableWideString ;
var write _RelID = write _XLNullableWideString ;
2014-01-28 16:38:02 +00:00
/* [MS-XLSB] 2.5.122 */
function parse _RkNumber ( data ) {
var b = data . slice ( data . l , data . l + 4 ) ;
var fX100 = b [ 0 ] & 1 , fInt = b [ 0 ] & 2 ;
data . l += 4 ;
b [ 0 ] &= ~ 3 ;
var RK = fInt === 0 ? _ _readDoubleLE ( [ 0 , 0 , 0 , 0 , b [ 0 ] , b [ 1 ] , b [ 2 ] , b [ 3 ] ] , 0 ) : _ _readInt32LE ( b , 0 ) >> 2 ;
return fX100 ? RK / 100 : RK ;
}
/* [MS-XLSB] 2.5.153 */
var parse _UncheckedRfX = function ( data ) {
var cell = { s : { } , e : { } } ;
cell . s . r = data . read _shift ( 4 ) ;
cell . e . r = data . read _shift ( 4 ) ;
cell . s . c = data . read _shift ( 4 ) ;
cell . e . c = data . read _shift ( 4 ) ;
return cell ;
2014-01-29 06:00:09 +00:00
} ;
2014-01-28 16:38:02 +00:00
2014-05-29 22:30:03 +00:00
var write _UncheckedRfX = function ( r , o ) {
if ( ! o ) o = new _buf ( 16 ) ;
o . write _shift ( 4 , r . s . r ) ;
o . write _shift ( 4 , r . e . r ) ;
o . write _shift ( 4 , r . s . c ) ;
o . write _shift ( 4 , r . e . c ) ;
return o ;
2014-01-28 16:38:02 +00:00
} ;
/* [MS-XLSB] 2.5.171 */
function parse _Xnum ( data , length ) { return data . read _shift ( 'ieee754' ) ; }
2014-05-29 22:30:03 +00:00
function write _Xnum ( data , o ) { return ( o || new _buf ( 8 ) ) . write _shift ( 'ieee754' , data ) ; }
2014-01-28 16:38:02 +00:00
/* [MS-XLSB] 2.5.198.2 */
var BErr = {
0x00 : "#NULL!" ,
0x07 : "#DIV/0!" ,
0x0F : "#VALUE!" ,
0x17 : "#REF!" ,
0x1D : "#NAME?" ,
0x24 : "#NUM!" ,
0x2A : "#N/A" ,
0x2B : "#GETTING_DATA" ,
0xFF : "#WTF?"
} ;
var RBErr = evert ( BErr ) ;
2014-03-29 02:05:50 +00:00
/* [MS-XLSB] 2.4.321 BrtColor */
function parse _BrtColor ( data , length ) {
var read = data . read _shift . bind ( data ) ;
var out = { } ;
var d = read ( 1 ) ;
out . fValidRGB = d & 1 ;
out . xColorType = d >>> 1 ;
2014-03-29 22:53:15 +00:00
out . index = read ( 1 ) ;
2014-03-29 02:05:50 +00:00
out . nTintAndShade = read ( 2 , 'i' ) ;
out . bRed = read ( 1 ) ;
out . bGreen = read ( 1 ) ;
out . bBlue = read ( 1 ) ;
out . bAlpha = read ( 1 ) ;
}
2014-05-29 22:30:03 +00:00
/* [MS-XLSB] 2.5.52 */
2014-03-29 02:05:50 +00:00
function parse _FontFlags ( data , length ) {
var d = data . read _shift ( 1 ) ;
data . l ++ ;
var out = {
fItalic : d & 0x2 ,
fStrikeout : d & 0x8 ,
fOutline : d & 0x10 ,
fShadow : d & 0x20 ,
fCondense : d & 0x40 ,
2014-05-17 18:57:29 +00:00
fExtend : d & 0x80
2014-03-29 02:05:50 +00:00
} ;
return out ;
}
2014-05-16 00:33:34 +00:00
/* Parts enumerated in OPC spec, MS-XLSB and MS-XLSX */
/* 12.3 Part Summary <SpreadsheetML> */
/* 14.2 Part Summary <DrawingML> */
/* [MS-XLSX] 2.1 Part Enumerations */
/* [MS-XLSB] 2.1.7 Part Enumeration */
var ct2type = {
/* Workbook */
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml" : "workbooks" ,
2014-04-23 01:37:08 +00:00
2014-05-16 00:33:34 +00:00
/* Worksheet */
"application/vnd.ms-excel.binIndexWs" : "TODO" , /* Binary Index */
2014-01-18 13:45:49 +00:00
2014-05-16 00:33:34 +00:00
/* Chartsheet */
"application/vnd.ms-excel.chartsheet" : "TODO" ,
"application/vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml" : "TODO" ,
2014-01-18 13:45:49 +00:00
2014-05-16 00:33:34 +00:00
/* Dialogsheet */
"application/vnd.ms-excel.dialogsheet" : "TODO" ,
"application/vnd.openxmlformats-officedocument.spreadsheetml.dialogsheet+xml" : "TODO" ,
2014-01-18 13:45:49 +00:00
2014-05-16 00:33:34 +00:00
/* Macrosheet */
"application/vnd.ms-excel.macrosheet" : "TODO" ,
"application/vnd.ms-excel.macrosheet+xml" : "TODO" ,
"application/vnd.ms-excel.intlmacrosheet" : "TODO" ,
"application/vnd.ms-excel.binIndexMs" : "TODO" , /* Binary Index */
2014-01-18 13:45:49 +00:00
2014-05-16 00:33:34 +00:00
/* File Properties */
"application/vnd.openxmlformats-package.core-properties+xml" : "coreprops" ,
"application/vnd.openxmlformats-officedocument.custom-properties+xml" : "custprops" ,
"application/vnd.openxmlformats-officedocument.extended-properties+xml" : "extprops" ,
2014-01-18 13:45:49 +00:00
2014-05-16 00:33:34 +00:00
/* Custom Data Properties */
"application/vnd.openxmlformats-officedocument.customXmlProperties+xml" : "TODO" ,
2014-01-18 13:45:49 +00:00
2014-05-16 00:33:34 +00:00
/* Comments */
"application/vnd.ms-excel.comments" : "comments" ,
"application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml" : "comments" ,
2014-01-18 13:45:49 +00:00
2014-05-16 00:33:34 +00:00
/* PivotTable */
"application/vnd.ms-excel.pivotTable" : "TODO" ,
"application/vnd.openxmlformats-officedocument.spreadsheetml.pivotTable+xml" : "TODO" ,
2014-01-18 13:45:49 +00:00
2014-05-16 00:33:34 +00:00
/* Calculation Chain */
"application/vnd.ms-excel.calcChain" : "calcchains" ,
"application/vnd.openxmlformats-officedocument.spreadsheetml.calcChain+xml" : "calcchains" ,
2014-01-18 13:45:49 +00:00
2014-05-16 00:33:34 +00:00
/* Printer Settings */
"application/vnd.openxmlformats-officedocument.spreadsheetml.printerSettings" : "TODO" ,
2014-01-18 13:45:49 +00:00
2014-05-16 00:33:34 +00:00
/* ActiveX */
"application/vnd.ms-office.activeX" : "TODO" ,
"application/vnd.ms-office.activeX+xml" : "TODO" ,
2014-01-18 13:45:49 +00:00
2014-05-16 00:33:34 +00:00
/* Custom Toolbars */
"application/vnd.ms-excel.attachedToolbars" : "TODO" ,
2014-01-18 13:45:49 +00:00
2014-05-16 00:33:34 +00:00
/* External Data Connections */
"application/vnd.ms-excel.connections" : "TODO" ,
"application/vnd.openxmlformats-officedocument.spreadsheetml.connections+xml" : "TODO" ,
2014-01-18 13:45:49 +00:00
2014-05-16 00:33:34 +00:00
/* External Links */
"application/vnd.ms-excel.externalLink" : "TODO" ,
"application/vnd.openxmlformats-officedocument.spreadsheetml.externalLink+xml" : "TODO" ,
2013-05-02 16:59:27 +00:00
2014-05-16 00:33:34 +00:00
/* Metadata */
"application/vnd.ms-excel.sheetMetadata" : "TODO" ,
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheetMetadata+xml" : "TODO" ,
2014-01-18 13:45:49 +00:00
2014-05-16 00:33:34 +00:00
/* PivotCache */
"application/vnd.ms-excel.pivotCacheDefinition" : "TODO" ,
"application/vnd.ms-excel.pivotCacheRecords" : "TODO" ,
"application/vnd.openxmlformats-officedocument.spreadsheetml.pivotCacheDefinition+xml" : "TODO" ,
"application/vnd.openxmlformats-officedocument.spreadsheetml.pivotCacheRecords+xml" : "TODO" ,
2014-04-23 01:37:08 +00:00
2014-05-16 00:33:34 +00:00
/* Query Table */
"application/vnd.ms-excel.queryTable" : "TODO" ,
"application/vnd.openxmlformats-officedocument.spreadsheetml.queryTable+xml" : "TODO" ,
2013-05-02 16:59:27 +00:00
2014-05-16 00:33:34 +00:00
/* Shared Workbook */
"application/vnd.ms-excel.userNames" : "TODO" ,
"application/vnd.ms-excel.revisionHeaders" : "TODO" ,
"application/vnd.ms-excel.revisionLog" : "TODO" ,
"application/vnd.openxmlformats-officedocument.spreadsheetml.revisionHeaders+xml" : "TODO" ,
"application/vnd.openxmlformats-officedocument.spreadsheetml.revisionLog+xml" : "TODO" ,
"application/vnd.openxmlformats-officedocument.spreadsheetml.userNames+xml" : "TODO" ,
2014-01-18 13:45:49 +00:00
2014-05-16 00:33:34 +00:00
/* Single Cell Table */
"application/vnd.ms-excel.tableSingleCells" : "TODO" ,
"application/vnd.openxmlformats-officedocument.spreadsheetml.tableSingleCells+xml" : "TODO" ,
2012-12-04 19:27:20 +00:00
2014-05-16 00:33:34 +00:00
/* Slicer */
"application/vnd.ms-excel.slicer" : "TODO" ,
"application/vnd.ms-excel.slicerCache" : "TODO" ,
"application/vnd.ms-excel.slicer+xml" : "TODO" ,
"application/vnd.ms-excel.slicerCache+xml" : "TODO" ,
2014-04-03 22:51:54 +00:00
/* Sort Map */
"application/vnd.ms-excel.wsSortMap" : "TODO" ,
/* Table */
"application/vnd.ms-excel.table" : "TODO" ,
"application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml" : "TODO" ,
/* Themes */
"application/vnd.openxmlformats-officedocument.theme+xml" : "themes" ,
/* Timeline */
"application/vnd.ms-excel.Timeline+xml" : "TODO" , /* verify */
"application/vnd.ms-excel.TimelineCache+xml" : "TODO" , /* verify */
/* VBA */
"application/vnd.ms-office.vbaProject" : "vba" ,
"application/vnd.ms-office.vbaProjectSignature" : "vba" ,
/* Volatile Dependencies */
"application/vnd.ms-office.volatileDependencies" : "TODO" ,
"application/vnd.openxmlformats-officedocument.spreadsheetml.volatileDependencies+xml" : "TODO" ,
/* Control Properties */
"application/vnd.ms-excel.controlproperties+xml" : "TODO" ,
/* Data Model */
"application/vnd.openxmlformats-officedocument.model+data" : "TODO" ,
/* Survey */
"application/vnd.ms-excel.Survey+xml" : "TODO" ,
/* Drawing */
"application/vnd.openxmlformats-officedocument.drawing+xml" : "TODO" ,
"application/vnd.openxmlformats-officedocument.drawingml.chart+xml" : "TODO" ,
"application/vnd.openxmlformats-officedocument.drawingml.chartshapes+xml" : "TODO" ,
"application/vnd.openxmlformats-officedocument.drawingml.diagramColors+xml" : "TODO" ,
"application/vnd.openxmlformats-officedocument.drawingml.diagramData+xml" : "TODO" ,
"application/vnd.openxmlformats-officedocument.drawingml.diagramLayout+xml" : "TODO" ,
"application/vnd.openxmlformats-officedocument.drawingml.diagramStyle+xml" : "TODO" ,
2014-05-16 00:33:34 +00:00
/* VML */
"application/vnd.openxmlformats-officedocument.vmlDrawing" : "TODO" ,
"application/vnd.openxmlformats-package.relationships+xml" : "rels" ,
"application/vnd.openxmlformats-officedocument.oleObject" : "TODO" ,
"sheet" : "js"
} ;
var CT _LIST = ( function ( ) {
var o = {
workbooks : {
xlsx : "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml" ,
xlsm : "application/vnd.ms-excel.sheet.macroEnabled.main+xml" ,
xlsb : "application/vnd.ms-excel.sheet.binary.macroEnabled.main" ,
xltx : "application/vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml"
} ,
strs : { /* Shared Strings */
xlsx : "application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml" ,
xlsb : "application/vnd.ms-excel.sharedStrings"
} ,
sheets : {
xlsx : "application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml" ,
xlsb : "application/vnd.ms-excel.worksheet"
} ,
styles : { /* Styles */
xlsx : "application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml" ,
xlsb : "application/vnd.ms-excel.styles"
}
} ;
keys ( o ) . forEach ( function ( k ) { if ( ! o [ k ] . xlsm ) o [ k ] . xlsm = o [ k ] . xlsx ; } ) ;
keys ( o ) . forEach ( function ( k ) { keys ( o [ k ] ) . forEach ( function ( v ) { ct2type [ o [ k ] [ v ] ] = k ; } ) ; } ) ;
return o ;
} ) ( ) ;
var type2ct = evert ( ct2type , true ) ;
XMLNS . CT = 'http://schemas.openxmlformats.org/package/2006/content-types' ;
function parse _ct ( data , opts ) {
var ctext = { } ;
if ( ! data || ! data . match ) return data ;
var ct = { workbooks : [ ] , sheets : [ ] , calcchains : [ ] , themes : [ ] , styles : [ ] ,
coreprops : [ ] , extprops : [ ] , custprops : [ ] , strs : [ ] , comments : [ ] , vba : [ ] ,
TODO : [ ] , rels : [ ] , xmlns : "" } ;
( data . match ( /<[^>]*>/g ) || [ ] ) . forEach ( function ( x ) {
var y = parsexmltag ( x ) ;
2014-05-22 12:16:51 +00:00
switch ( y [ 0 ] . replace ( /<\w*:/ , "<" ) ) {
2014-05-16 00:33:34 +00:00
case '<?xml' : break ;
2014-05-22 12:16:51 +00:00
case '<Types' : ct . xmlns = y [ 'xmlns' + ( y [ 0 ] . match ( /<(\w+):/ ) || [ "" , "" ] ) [ 1 ] ] ; break ;
2014-05-16 00:33:34 +00:00
case '<Default' : ctext [ y . Extension ] = y . ContentType ; break ;
case '<Override' :
if ( y . ContentType in ct2type ) ct [ ct2type [ y . ContentType ] ] . push ( y . PartName ) ;
else if ( opts . WTF ) console . error ( y ) ;
break ;
}
} ) ;
if ( ct . xmlns !== XMLNS . CT ) throw new Error ( "Unknown Namespace: " + ct . xmlns ) ;
ct . calcchain = ct . calcchains . length > 0 ? ct . calcchains [ 0 ] : "" ;
ct . sst = ct . strs . length > 0 ? ct . strs [ 0 ] : "" ;
ct . style = ct . styles . length > 0 ? ct . styles [ 0 ] : "" ;
ct . defaults = ctext ;
delete ct . calcchains ;
return ct ;
}
var CTYPE _XML _ROOT = writextag ( 'Types' , null , {
'xmlns' : XMLNS . CT ,
'xmlns:xsd' : XMLNS . xsd ,
'xmlns:xsi' : XMLNS . xsi
} ) ;
var CTYPE _DEFAULTS = [
[ 'xml' , 'application/xml' ] ,
2014-05-29 22:30:03 +00:00
[ 'bin' , 'application/vnd.ms-excel.sheet.binary.macroEnabled.main' ] ,
2014-05-16 00:33:34 +00:00
[ 'rels' , type2ct . rels [ 0 ] ]
] . map ( function ( x ) {
return writextag ( 'Default' , null , { 'Extension' : x [ 0 ] , 'ContentType' : x [ 1 ] } ) ;
} ) ;
function write _ct ( ct , opts ) {
var o = [ ] , v ;
o . push ( XML _HEADER ) ;
o . push ( CTYPE _XML _ROOT ) ;
o = o . concat ( CTYPE _DEFAULTS ) ;
var f1 = function ( w ) {
if ( ct [ w ] && ct [ w ] . length > 0 ) {
v = ct [ w ] [ 0 ] ;
o . push ( writextag ( 'Override' , null , {
'PartName' : ( v [ 0 ] == '/' ? "" : "/" ) + v ,
2014-05-16 00:50:55 +00:00
'ContentType' : CT _LIST [ w ] [ opts . bookType || 'xlsx' ]
2014-05-16 00:33:34 +00:00
} ) ) ;
}
} ;
var f2 = function ( w ) {
ct [ w ] . forEach ( function ( v ) {
o . push ( writextag ( 'Override' , null , {
'PartName' : ( v [ 0 ] == '/' ? "" : "/" ) + v ,
2014-05-16 00:50:55 +00:00
'ContentType' : CT _LIST [ w ] [ opts . bookType || 'xlsx' ]
2014-05-16 00:33:34 +00:00
} ) ) ;
} ) ;
} ;
var f3 = function ( t ) {
( ct [ t ] || [ ] ) . forEach ( function ( v ) {
o . push ( writextag ( 'Override' , null , {
'PartName' : ( v [ 0 ] == '/' ? "" : "/" ) + v ,
'ContentType' : type2ct [ t ] [ 0 ]
} ) ) ;
} ) ;
} ;
f1 ( 'workbooks' ) ;
f2 ( 'sheets' ) ;
2014-05-16 00:50:55 +00:00
f3 ( 'themes' ) ;
2014-05-16 00:33:34 +00:00
[ 'strs' , 'styles' ] . forEach ( f1 ) ;
[ 'coreprops' , 'extprops' , 'custprops' ] . forEach ( f3 ) ;
if ( o . length > 2 ) { o . push ( '</Types>' ) ; o [ 1 ] = o [ 1 ] . replace ( "/>" , ">" ) ; }
return o . join ( "" ) ;
}
/* 9.3.2 OPC Relationships Markup */
var RELS = {
WB : "http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument" ,
SHEET : "http://sheetjs.openxmlformats.org/officeDocument/2006/relationships/officeDocument"
} ;
function parse _rels ( data , currentFilePath ) {
if ( ! data ) return data ;
if ( currentFilePath . charAt ( 0 ) !== '/' ) {
currentFilePath = '/' + currentFilePath ;
}
var rels = { } ;
var hash = { } ;
var resolveRelativePathIntoAbsolute = function ( to ) {
var toksFrom = currentFilePath . split ( '/' ) ;
toksFrom . pop ( ) ; // folder path
var toksTo = to . split ( '/' ) ;
var reversed = [ ] ;
while ( toksTo . length !== 0 ) {
var tokTo = toksTo . shift ( ) ;
if ( tokTo === '..' ) {
toksFrom . pop ( ) ;
} else if ( tokTo !== '.' ) {
toksFrom . push ( tokTo ) ;
}
}
return toksFrom . join ( '/' ) ;
} ;
data . match ( /<[^>]*>/g ) . forEach ( function ( x ) {
var y = parsexmltag ( x ) ;
/* 9.3.2.2 OPC_Relationships */
if ( y [ 0 ] === '<Relationship' ) {
var rel = { } ; rel . Type = y . Type ; rel . Target = y . Target ; rel . Id = y . Id ; rel . TargetMode = y . TargetMode ;
var canonictarget = y . TargetMode === 'External' ? y . Target : resolveRelativePathIntoAbsolute ( y . Target ) ;
rels [ canonictarget ] = rel ;
hash [ y . Id ] = rel ;
}
} ) ;
rels [ "!id" ] = hash ;
return rels ;
}
XMLNS . RELS = 'http://schemas.openxmlformats.org/package/2006/relationships' ;
var RELS _ROOT = writextag ( 'Relationships' , null , {
//'xmlns:ns0': XMLNS.RELS,
'xmlns' : XMLNS . RELS
} ) ;
/* TODO */
function write _rels ( rels ) {
var o = [ ] ;
o . push ( XML _HEADER ) ;
o . push ( RELS _ROOT ) ;
keys ( rels [ '!id' ] ) . forEach ( function ( rid ) { var rel = rels [ '!id' ] [ rid ] ;
o . push ( writextag ( 'Relationship' , null , rel ) ) ;
} ) ;
if ( o . length > 2 ) { o . push ( '</Relationships>' ) ; o [ 1 ] = o [ 1 ] . replace ( "/>" , ">" ) ; }
return o . join ( "" ) ;
}
/* ECMA-376 Part II 11.1 Core Properties Part */
/* [MS-OSHARED] 2.3.3.2.[1-2].1 (PIDSI/PIDDSI) */
var CORE _PROPS = [
[ "cp:category" , "Category" ] ,
[ "cp:contentStatus" , "ContentStatus" ] ,
[ "cp:keywords" , "Keywords" ] ,
[ "cp:lastModifiedBy" , "LastAuthor" ] ,
[ "cp:lastPrinted" , "LastPrinted" ] ,
[ "cp:revision" , "RevNumber" ] ,
[ "cp:version" , "Version" ] ,
[ "dc:creator" , "Author" ] ,
[ "dc:description" , "Comments" ] ,
[ "dc:identifier" , "Identifier" ] ,
[ "dc:language" , "Language" ] ,
[ "dc:subject" , "Subject" ] ,
[ "dc:title" , "Title" ] ,
[ "dcterms:created" , "CreatedDate" , 'date' ] ,
[ "dcterms:modified" , "ModifiedDate" , 'date' ]
] ;
XMLNS . CORE _PROPS = "http://schemas.openxmlformats.org/package/2006/metadata/core-properties" ;
RELS . CORE _PROPS = 'http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties' ;
function parse _core _props ( data ) {
var p = { } ;
CORE _PROPS . forEach ( function ( f ) {
var g = "(?:" + f [ 0 ] . substr ( 0 , f [ 0 ] . indexOf ( ":" ) ) + ":)" + f [ 0 ] . substr ( f [ 0 ] . indexOf ( ":" ) + 1 ) ;
var cur = data . match ( new RegExp ( "<" + g + "[^>]*>(.*)<\/" + g + ">" ) ) ;
if ( cur && cur . length > 0 ) p [ f [ 1 ] ] = cur [ 1 ] ;
if ( f [ 2 ] === 'date' && p [ f [ 1 ] ] ) p [ f [ 1 ] ] = new Date ( p [ f [ 1 ] ] ) ;
} ) ;
return p ;
}
var CORE _PROPS _XML _ROOT = writextag ( 'cp:coreProperties' , null , {
//'xmlns': XMLNS.CORE_PROPS,
'xmlns:cp' : XMLNS . CORE _PROPS ,
'xmlns:dc' : XMLNS . dc ,
'xmlns:dcterms' : XMLNS . dcterms ,
'xmlns:dcmitype' : XMLNS . dcmitype ,
'xmlns:xsi' : XMLNS . xsi
} ) ;
function write _core _props ( cp , opts ) {
var o = [ ] , p = { } ;
o . push ( XML _HEADER ) ;
o . push ( CORE _PROPS _XML _ROOT ) ;
if ( ! cp ) return o . join ( "" ) ;
var doit = function ( f , g , h ) {
if ( p [ f ] || typeof g === 'undefined' || g === "" ) return ;
if ( typeof g !== 'string' ) g = String ( g ) ; /* TODO: remove */
p [ f ] = g ;
o . push ( h ? writextag ( f , g , h ) : writetag ( f , g ) ) ;
} ;
2014-05-22 12:16:51 +00:00
if ( typeof cp . CreatedDate !== 'undefined' ) doit ( "dcterms:created" , typeof cp . CreatedDate === "string" ? cp . CreatedDate : write _w3cdtf ( cp . CreatedDate , opts . WTF ) , { "xsi:type" : "dcterms:W3CDTF" } ) ;
if ( typeof cp . ModifiedDate !== 'undefined' ) doit ( "dcterms:modified" , typeof cp . ModifiedDate === "string" ? cp . ModifiedDate : write _w3cdtf ( cp . ModifiedDate , opts . WTF ) , { "xsi:type" : "dcterms:W3CDTF" } ) ;
2014-05-16 00:33:34 +00:00
CORE _PROPS . forEach ( function ( f ) { doit ( f [ 0 ] , cp [ f [ 1 ] ] ) ; } ) ;
if ( o . length > 2 ) { o . push ( '</cp:coreProperties>' ) ; o [ 1 ] = o [ 1 ] . replace ( "/>" , ">" ) ; }
return o . join ( "" ) ;
}
/* 15.2.12.3 Extended File Properties Part */
/* [MS-OSHARED] 2.3.3.2.[1-2].1 (PIDSI/PIDDSI) */
var EXT _PROPS = [
[ "Application" , "Application" , "string" ] ,
[ "AppVersion" , "AppVersion" , "string" ] ,
[ "Company" , "Company" , "string" ] ,
[ "DocSecurity" , "DocSecurity" , "string" ] ,
[ "Manager" , "Manager" , "string" ] ,
[ "HyperlinksChanged" , "HyperlinksChanged" , "bool" ] ,
[ "SharedDoc" , "SharedDoc" , "bool" ] ,
[ "LinksUpToDate" , "LinksUpToDate" , "bool" ] ,
[ "ScaleCrop" , "ScaleCrop" , "bool" ] ,
[ "HeadingPairs" , "HeadingPairs" , "raw" ] ,
[ "TitlesOfParts" , "TitlesOfParts" , "raw" ] ,
] ;
2014-04-03 22:51:54 +00:00
2014-05-16 00:33:34 +00:00
XMLNS . EXT _PROPS = "http://schemas.openxmlformats.org/officeDocument/2006/extended-properties" ;
RELS . EXT _PROPS = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties' ;
2014-03-29 02:05:50 +00:00
2014-05-16 00:33:34 +00:00
function parse _ext _props ( data , p ) {
var q = { } ; if ( ! p ) p = { } ;
2014-01-28 16:38:02 +00:00
2014-05-16 00:33:34 +00:00
EXT _PROPS . forEach ( function ( f ) {
switch ( f [ 2 ] ) {
case "string" : p [ f [ 1 ] ] = ( data . match ( matchtag ( f [ 0 ] ) ) || [ ] ) [ 1 ] ; break ;
case "bool" : p [ f [ 1 ] ] = ( data . match ( matchtag ( f [ 0 ] ) ) || [ ] ) [ 1 ] === "true" ; break ;
case "raw" :
var cur = data . match ( new RegExp ( "<" + f [ 0 ] + "[^>]*>(.*)<\/" + f [ 0 ] + ">" ) ) ;
if ( cur && cur . length > 0 ) q [ f [ 1 ] ] = cur [ 1 ] ;
break ;
}
2013-02-18 03:16:38 +00:00
} ) ;
2012-12-04 19:27:20 +00:00
2013-04-17 01:32:20 +00:00
if ( q . HeadingPairs && q . TitlesOfParts ) {
var v = parseVector ( q . HeadingPairs ) ;
2013-03-05 22:01:01 +00:00
var j = 0 , widx = 0 ;
for ( var i = 0 ; i !== v . length ; ++ i ) {
switch ( v [ i ] . v ) {
2014-01-28 16:38:02 +00:00
case "Worksheets" : widx = j ; p . Worksheets = + ( v [ ++ i ] . v ) ; break ;
2013-03-05 22:01:01 +00:00
case "Named Ranges" : ++ i ; break ; // TODO: Handle Named Ranges
}
}
2014-01-28 16:38:02 +00:00
var parts = parseVector ( q . TitlesOfParts ) . map ( function ( x ) { return utf8read ( x . v ) ; } ) ;
2013-04-17 01:32:20 +00:00
p . SheetNames = parts . slice ( widx , widx + p . Worksheets ) ;
2013-03-05 22:01:01 +00:00
}
2012-12-04 19:27:20 +00:00
return p ;
}
2014-05-16 00:33:34 +00:00
var EXT _PROPS _XML _ROOT = writextag ( 'Properties' , null , {
'xmlns' : XMLNS . EXT _PROPS ,
'xmlns:vt' : XMLNS . vt
} ) ;
function write _ext _props ( cp , opts ) {
var o = [ ] , p = { } , W = writextag ;
2014-05-22 12:16:51 +00:00
if ( ! cp ) cp = { } ;
cp . Application = "SheetJS" ;
2014-05-16 00:33:34 +00:00
o . push ( XML _HEADER ) ;
o . push ( EXT _PROPS _XML _ROOT ) ;
EXT _PROPS . forEach ( function ( f ) {
if ( typeof cp [ f [ 1 ] ] === 'undefined' ) return ;
var v ;
switch ( f [ 2 ] ) {
case 'string' : v = cp [ f [ 1 ] ] ; break ;
case 'bool' : v = cp [ f [ 1 ] ] ? 'true' : 'false' ; break ;
}
if ( typeof v !== 'undefined' ) o . push ( W ( f [ 0 ] , v ) ) ;
} ) ;
/* TODO: HeadingPairs, TitlesOfParts */
o . push ( W ( 'HeadingPairs' , W ( 'vt:vector' , W ( 'vt:variant' , '<vt:lpstr>Worksheets</vt:lpstr>' ) + W ( 'vt:variant' , W ( 'vt:i4' , String ( cp . Worksheets ) ) ) , { size : 2 , baseType : "variant" } ) ) ) ;
o . push ( W ( 'TitlesOfParts' , W ( 'vt:vector' , cp . SheetNames . map ( function ( s ) { return "<vt:lpstr>" + s + "</vt:lpstr>" ; } ) . join ( "" ) , { size : cp . Worksheets , baseType : "lpstr" } ) ) ) ;
if ( o . length > 2 ) { o . push ( '</Properties>' ) ; o [ 1 ] = o [ 1 ] . replace ( "/>" , ">" ) ; }
return o . join ( "" ) ;
}
2014-02-14 03:39:03 +00:00
/* 15.2.12.2 Custom File Properties Part */
2014-05-16 00:33:34 +00:00
XMLNS . CUST _PROPS = "http://schemas.openxmlformats.org/officeDocument/2006/custom-properties" ;
RELS . CUST _PROPS = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/custom-properties' ;
function parse _cust _props ( data , opts ) {
2014-02-14 03:39:03 +00:00
var p = { } , name ;
data . match ( /<[^>]+>([^<]*)/g ) . forEach ( function ( x ) {
var y = parsexmltag ( x ) ;
switch ( y [ 0 ] ) {
2014-05-16 00:33:34 +00:00
case '<?xml' : break ;
case '<Properties' :
if ( y . xmlns !== XMLNS . CUST _PROPS ) throw "unrecognized xmlns " + y . xmlns ;
if ( y . xmlnsvt && y . xmlnsvt !== XMLNS . vt ) throw "unrecognized vt " + y . xmlnsvt ;
break ;
2014-02-14 03:39:03 +00:00
case '<property' : name = y . name ; break ;
case '</property>' : name = null ; break ;
default : if ( x . indexOf ( '<vt:' ) === 0 ) {
var toks = x . split ( '>' ) ;
var type = toks [ 0 ] . substring ( 4 ) , text = toks [ 1 ] ;
/* 22.4.2.32 (CT_Variant). Omit the binary types from 22.4 (Variant Types) */
switch ( type ) {
case 'lpstr' : case 'lpwstr' : case 'bstr' : case 'lpwstr' :
p [ name ] = unescapexml ( text ) ;
break ;
case 'bool' :
p [ name ] = parsexmlbool ( text , '<vt:bool>' ) ;
break ;
case 'i1' : case 'i2' : case 'i4' : case 'i8' : case 'int' : case 'uint' :
p [ name ] = parseInt ( text , 10 ) ;
break ;
case 'r4' : case 'r8' : case 'decimal' :
p [ name ] = parseFloat ( text ) ;
break ;
case 'filetime' : case 'date' :
2014-05-16 00:33:34 +00:00
p [ name ] = new Date ( text ) ;
2014-02-14 03:39:03 +00:00
break ;
case 'cy' : case 'error' :
p [ name ] = unescapexml ( text ) ;
break ;
default :
console . warn ( 'Unexpected' , x , type , toks ) ;
}
2014-05-16 00:33:34 +00:00
} else if ( x . substr ( 0 , 2 ) === "</" ) {
} else if ( opts . WTF ) throw new Error ( x ) ;
2014-02-14 03:39:03 +00:00
}
} ) ;
return p ;
}
2014-05-16 00:33:34 +00:00
var CUST _PROPS _XML _ROOT = writextag ( 'Properties' , null , {
'xmlns' : XMLNS . CUST _PROPS ,
'xmlns:vt' : XMLNS . vt
} ) ;
function write _cust _props ( cp , opts ) {
var o = [ ] , p = { } ;
o . push ( XML _HEADER ) ;
o . push ( CUST _PROPS _XML _ROOT ) ;
if ( ! cp ) return o . join ( "" ) ;
var pid = 1 ;
2014-05-16 00:50:55 +00:00
keys ( cp ) . forEach ( function ( k ) { ++ pid ;
2014-05-16 00:33:34 +00:00
o . push ( writextag ( 'property' , write _vt ( cp [ k ] ) , {
'fmtid' : '{D5CDD505-2E9C-101B-9397-08002B2CF9AE}' ,
'pid' : pid ,
'name' : k
} ) ) ;
} ) ;
if ( o . length > 2 ) { o . push ( '</Properties>' ) ; o [ 1 ] = o [ 1 ] . replace ( "/>" , ">" ) ; }
return o . join ( "" ) ;
}
/* 18.4.1 charset to codepage mapping */
var CS2CP = {
0 : 1252 , /* ANSI */
1 : 65001 , /* DEFAULT */
2 : 65001 , /* SYMBOL */
77 : 10000 , /* MAC */
128 : 932 , /* SHIFTJIS */
129 : 949 , /* HANGUL */
130 : 1361 , /* JOHAB */
134 : 936 , /* GB2312 */
136 : 950 , /* CHINESEBIG5 */
161 : 1253 , /* GREEK */
162 : 1254 , /* TURKISH */
163 : 1258 , /* VIETNAMESE */
177 : 1255 , /* HEBREW */
178 : 1256 , /* ARABIC */
186 : 1257 , /* BALTIC */
204 : 1251 , /* RUSSIAN */
222 : 874 , /* THAI */
238 : 1250 , /* EASTEUROPE */
255 : 1252 , /* OEM */
69 : 6969 /* MISC */
} ;
/* Parse a list of <r> tags */
var parse _rs = ( function ( ) {
var tregex = matchtag ( "t" ) , rpregex = matchtag ( "rPr" ) ;
/* 18.4.7 rPr CT_RPrElt */
var parse _rpr = function ( rpr , intro , outro ) {
var font = { } , cp = 65001 ;
( rpr . match ( /<[^>]*>/g ) || [ ] ) . forEach ( function ( x ) {
var y = parsexmltag ( x ) ;
switch ( y [ 0 ] ) {
/* 18.8.12 condense CT_BooleanProperty */
/* ** not required . */
case '<condense' : break ;
/* 18.8.17 extend CT_BooleanProperty */
/* ** not required . */
case '<extend' : break ;
/* 18.8.36 shadow CT_BooleanProperty */
/* ** not required . */
case '<shadow' :
/* falls through */
case '<shadow/>' : break ;
/* 18.4.1 charset CT_IntProperty TODO */
case '<charset' :
if ( y . val == '1' ) break ;
cp = CS2CP [ parseInt ( y . val , 10 ) ] ;
break ;
/* 18.4.2 outline CT_BooleanProperty TODO */
case '<outline' :
/* falls through */
case '<outline/>' : break ;
/* 18.4.5 rFont CT_FontName */
case '<rFont' : font . name = y . val ; break ;
/* 18.4.11 sz CT_FontSize */
case '<sz' : font . sz = y . val ; break ;
/* 18.4.10 strike CT_BooleanProperty */
case '<strike' :
if ( ! y . val ) break ;
/* falls through */
case '<strike/>' : font . strike = 1 ; break ;
case '</strike>' : break ;
/* 18.4.13 u CT_UnderlineProperty */
case '<u' :
if ( ! y . val ) break ;
/* falls through */
case '<u/>' : font . u = 1 ; break ;
case '</u>' : break ;
/* 18.8.2 b */
case '<b' :
if ( ! y . val ) break ;
/* falls through */
case '<b/>' : font . b = 1 ; break ;
case '</b>' : break ;
/* 18.8.26 i */
case '<i' :
if ( ! y . val ) break ;
/* falls through */
case '<i/>' : font . i = 1 ; break ;
case '</i>' : break ;
/* 18.3.1.15 color CT_Color TODO: tint, theme, auto, indexed */
case '<color' :
if ( y . rgb ) font . color = y . rgb . substr ( 2 , 6 ) ;
break ;
/* 18.8.18 family ST_FontFamily */
case '<family' : font . family = y . val ; break ;
/* 18.4.14 vertAlign CT_VerticalAlignFontProperty TODO */
case '<vertAlign' : break ;
/* 18.8.35 scheme CT_FontScheme TODO */
case '<scheme' : break ;
default :
if ( y [ 0 ] [ 2 ] !== '/' ) throw 'Unrecognized rich format ' + y [ 0 ] ;
}
} ) ;
/* TODO: These should be generated styles, not inline */
var style = [ ] ;
if ( font . b ) style . push ( "font-weight: bold;" ) ;
if ( font . i ) style . push ( "font-style: italic;" ) ;
intro . push ( '<span style="' + style . join ( "" ) + '">' ) ;
outro . push ( "</span>" ) ;
return cp ;
} ;
/* 18.4.4 r CT_RElt */
function parse _r ( r ) {
var terms = [ [ ] , "" , [ ] ] ;
/* 18.4.12 t ST_Xstring */
var t = r . match ( tregex ) , cp = 65001 ;
if ( ! isval ( t ) ) return "" ;
terms [ 1 ] = t [ 1 ] ;
var rpr = r . match ( rpregex ) ;
if ( isval ( rpr ) ) cp = parse _rpr ( rpr [ 1 ] , terms [ 0 ] , terms [ 2 ] ) ;
return terms [ 0 ] . join ( "" ) + terms [ 1 ] . replace ( /\r\n/g , '<br/>' ) + terms [ 2 ] . join ( "" ) ;
}
return function ( rs ) {
return rs . replace ( /<r>/g , "" ) . split ( /<\/r>/ ) . map ( parse _r ) . join ( "" ) ;
} ;
} ) ( ) ;
/* 18.4.8 si CT_Rst */
var parse _si = function ( x , opts ) {
var html = opts ? opts . cellHTML : true ;
var z = { } ;
if ( ! x ) return null ;
var y ;
/* 18.4.12 t ST_Xstring (Plaintext String) */
if ( x [ 1 ] === 't' ) {
z . t = utf8read ( unescapexml ( x . substr ( x . indexOf ( ">" ) + 1 ) . split ( /<\/t>/ ) [ 0 ] ) ) ;
z . r = x ;
if ( html ) z . h = z . t ;
}
/* 18.4.4 r CT_RElt (Rich Text Run) */
else if ( ( y = x . match ( /<r>/ ) ) ) {
z . r = x ;
/* TODO: properly parse (note: no other valid child can have body text) */
z . t = utf8read ( unescapexml ( x . replace ( /<[^>]*>/gm , "" ) ) ) ;
if ( html ) z . h = parse _rs ( x ) ;
}
/* 18.4.3 phoneticPr CT_PhoneticPr (TODO: needed for Asian support) */
/* 18.4.6 rPh CT_PhoneticRun (TODO: needed for Asian support) */
return z ;
} ;
/* 18.4 Shared String Table */
var parse _sst _xml = function ( data , opts ) {
var s = [ ] ;
/* 18.4.9 sst CT_Sst */
var sst = data . match ( new RegExp ( "<sst([^>]*)>([\\s\\S]*)<\/sst>" , "m" ) ) ;
if ( isval ( sst ) ) {
s = sst [ 2 ] . replace ( /<(?:si|sstItem)>/g , "" ) . split ( /<\/(?:si|sstItem)>/ ) . map ( function ( x ) { return parse _si ( x , opts ) ; } ) . filter ( function ( x ) { return x ; } ) ;
sst = parsexmltag ( sst [ 1 ] ) ; s . Count = sst . count ; s . Unique = sst . uniqueCount ;
}
return s ;
} ;
RELS . SST = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings" ;
var write _sst _xml = function ( sst , opts ) {
if ( ! opts . bookSST ) return "" ;
var o = [ ] ;
o . push ( XML _HEADER ) ;
o . push ( writextag ( 'sst' , null , {
xmlns : XMLNS . main [ 0 ] ,
count : sst . Count ,
uniqueCount : sst . Unique
} ) ) ;
2014-05-22 12:16:51 +00:00
sst . forEach ( function ( s ) {
var sitag = "<si>" ;
if ( s . r ) sitag += s . r ;
else {
sitag += "<t" ;
if ( s . t . match ( /^\s|\s$|[\t\n\r]/ ) ) sitag += ' xml:space="preserve"' ;
sitag += ">" ;
sitag += escapexml ( s . t ) ;
sitag += "</t>" ;
}
sitag += "</si>" ;
o . push ( sitag ) ;
} ) ;
2014-05-16 00:33:34 +00:00
if ( o . length > 2 ) { o . push ( '</sst>' ) ; o [ 1 ] = o [ 1 ] . replace ( "/>" , ">" ) ; }
return o . join ( "" ) ;
} ;
/* [MS-XLSB] 2.4.219 BrtBeginSst */
var parse _BrtBeginSst = function ( data , length ) {
return [ data . read _shift ( 4 ) , data . read _shift ( 4 ) ] ;
} ;
/* [MS-XLSB] 2.1.7.45 Shared Strings */
var parse _sst _bin = function ( data , opts ) {
var s = [ ] ;
var pass = false ;
recordhopper ( data , function ( val , R , RT ) {
switch ( R . n ) {
case 'BrtBeginSst' : s . Count = val [ 0 ] ; s . Unique = val [ 1 ] ; break ;
case 'BrtSSTItem' : s . push ( val ) ; break ;
case 'BrtEndSst' : return true ;
/* TODO: produce a test case with a future record */
case 'BrtFRTBegin' : pass = true ; break ;
case 'BrtFRTEnd' : pass = false ; break ;
default : if ( ! pass || opts . WTF ) throw new Error ( "Unexpected record " + RT + " " + R . n ) ;
}
} ) ;
return s ;
} ;
var write _sst _bin = function ( sst , opts ) { } ;
var styles = { } ; // shared styles
2014-05-29 06:18:23 +00:00
var themes = { } ; // shared themes
/* 18.8.21 fills CT_Fills */
function parse _fills ( t , opts ) {
styles . Fills = [ ] ;
var fill = { } ;
t [ 0 ] . match ( /<[^>]*>/g ) . forEach ( function ( x ) {
var y = parsexmltag ( x ) ;
switch ( y [ 0 ] ) {
case '<fills' : case '<fills>' : case '</fills>' : break ;
/* 18.8.20 fill CT_Fill */
case '<fill>' : break ;
case '</fill>' : styles . Fills . push ( fill ) ; fill = { } ; break ;
/* 18.8.32 patternFill CT_PatternFill */
case '<patternFill' :
if ( y . patternType ) fill . patternType = y . patternType ;
break ;
2014-05-29 22:30:03 +00:00
case '<patternFill/>' : case '</patternFill>' : break ;
2014-05-29 06:18:23 +00:00
/* 18.8.3 bgColor CT_Color */
case '<bgColor' :
if ( ! fill . bgColor ) fill . bgColor = { } ;
if ( y . indexed ) fill . bgColor . indexed = parseInt ( y . indexed ) ;
if ( y . theme ) fill . bgColor . theme = parseInt ( y . theme ) ;
if ( y . tint ) fill . bgColor . tint = Number ( y . tint ) ;
2014-05-29 22:30:03 +00:00
/* Excel uses ARGB strings */
2014-05-29 06:18:23 +00:00
if ( y . rgb ) fill . bgColor . rgb = y . rgb . substring ( y . rgb . length - 6 ) ;
break ;
case '</bgColor>' : break ;
/* 18.8.19 fgColor CT_Color */
case '<fgColor' :
if ( ! fill . fgColor ) fill . fgColor = { } ;
if ( y . theme ) fill . fgColor . theme = parseInt ( y . theme ) ;
if ( y . tint ) fill . fgColor . tint = Number ( y . tint ) ;
2014-05-29 22:30:03 +00:00
/* Excel uses ARGB strings */
2014-05-29 06:18:23 +00:00
if ( y . rgb ) fill . fgColor . rgb = y . rgb . substring ( y . rgb . length - 6 ) ;
break ;
case '</fgColor>' : break ;
default : if ( opts . WTF ) throw 'unrecognized ' + y [ 0 ] + ' in fills' ;
}
} ) ;
}
2014-05-16 00:33:34 +00:00
/* 18.8.31 numFmts CT_NumFmts */
function parse _numFmts ( t , opts ) {
styles . NumberFmt = [ ] ;
for ( var y in SSF . _table ) styles . NumberFmt [ y ] = SSF . _table [ y ] ;
t [ 0 ] . match ( /<[^>]*>/g ) . forEach ( function ( x ) {
2012-12-04 19:27:20 +00:00
var y = parsexmltag ( x ) ;
switch ( y [ 0 ] ) {
2014-05-22 12:16:51 +00:00
case '<numFmts' : case '</numFmts>' : case '<numFmts/>' : case '<numFmts>' : break ;
2014-05-16 00:33:34 +00:00
case '<numFmt' : {
2014-05-22 12:16:51 +00:00
var f = unescapexml ( y . formatCode ) , i = parseInt ( y . numFmtId , 10 ) ;
2014-05-16 00:33:34 +00:00
styles . NumberFmt [ i ] = f ; if ( i > 0 ) SSF . load ( f , i ) ;
} break ;
default : if ( opts . WTF ) throw 'unrecognized ' + y [ 0 ] + ' in numFmts' ;
}
} ) ;
}
function write _numFmts ( NF , opts ) {
var o = [ ] ;
o . push ( "<numFmts>" ) ;
[ [ 5 , 8 ] , [ 23 , 26 ] , [ 41 , 44 ] , [ 63 , 66 ] , [ 164 , 392 ] ] . forEach ( function ( r ) {
2014-05-16 00:50:55 +00:00
for ( var i = r [ 0 ] ; i <= r [ 1 ] ; ++ i ) if ( NF [ i ] ) o . push ( writextag ( 'numFmt' , null , { numFmtId : i , formatCode : escapexml ( NF [ i ] ) } ) ) ;
2014-05-16 00:33:34 +00:00
} ) ;
o . push ( "</numFmts>" ) ;
if ( o . length === 2 ) return "" ;
o [ 0 ] = writextag ( 'numFmts' , null , { count : o . length - 2 } ) . replace ( "/>" , ">" ) ;
return o . join ( "" ) ;
}
/* 18.8.10 cellXfs CT_CellXfs */
function parse _cellXfs ( t , opts ) {
styles . CellXf = [ ] ;
t [ 0 ] . match ( /<[^>]*>/g ) . forEach ( function ( x ) {
var y = parsexmltag ( x ) ;
switch ( y [ 0 ] ) {
2014-05-22 12:16:51 +00:00
case '<cellXfs' : case '<cellXfs>' : case '<cellXfs/>' : case '</cellXfs>' : break ;
2014-05-16 00:33:34 +00:00
/* 18.8.45 xf CT_Xf */
case '<xf' : delete y [ 0 ] ;
if ( y . numFmtId ) y . numFmtId = parseInt ( y . numFmtId , 10 ) ;
2014-05-29 06:18:23 +00:00
if ( y . fillId ) y . fillId = parseInt ( y . fillId , 10 ) ;
2014-05-16 00:33:34 +00:00
styles . CellXf . push ( y ) ; break ;
case '</xf>' : break ;
/* 18.8.1 alignment CT_CellAlignment */
case '<alignment' : case '<alignment/>' : break ;
/* 18.8.33 protection CT_CellProtection */
case '<protection' : case '</protection>' : case '<protection/>' : break ;
case '<extLst' : case '</extLst>' : break ;
case '<ext' : break ;
default : if ( opts . WTF ) throw 'unrecognized ' + y [ 0 ] + ' in cellXfs' ;
2012-12-04 19:27:20 +00:00
}
} ) ;
}
2014-05-16 00:33:34 +00:00
function write _cellXfs ( cellXfs ) {
var o = [ ] ;
o . push ( writextag ( 'cellXfs' , null ) ) ;
cellXfs . forEach ( function ( c ) { o . push ( writextag ( 'xf' , null , c ) ) ; } ) ;
o . push ( "</cellXfs>" ) ;
if ( o . length === 2 ) return "" ;
o [ 0 ] = writextag ( 'cellXfs' , null , { count : o . length - 2 } ) . replace ( "/>" , ">" ) ;
return o . join ( "" ) ;
}
2012-12-04 19:27:20 +00:00
2014-05-16 00:33:34 +00:00
/* 18.8 Styles CT_Stylesheet*/
function parse _sty _xml ( data , opts ) {
/* 18.8.39 styleSheet CT_Stylesheet */
var t ;
2013-03-26 23:54:14 +00:00
2014-05-16 00:33:34 +00:00
/* numFmts CT_NumFmts ? */
if ( ( t = data . match ( /<numFmts([^>]*)>.*<\/numFmts>/ ) ) ) parse _numFmts ( t , opts ) ;
2014-01-15 07:26:00 +00:00
2014-05-16 00:33:34 +00:00
/* fonts CT_Fonts ? */
2014-05-29 06:18:23 +00:00
/* fills CT_Fills */
if ( ( t = data . match ( /<fills([^>]*)>.*<\/fills>/ ) ) ) parse _fills ( t , opts ) ;
2014-05-16 00:33:34 +00:00
/* borders CT_Borders ? */
/* cellStyleXfs CT_CellStyleXfs ? */
/* cellXfs CT_CellXfs ? */
if ( ( t = data . match ( /<cellXfs([^>]*)>.*<\/cellXfs>/ ) ) ) parse _cellXfs ( t , opts ) ;
/* dxfs CT_Dxfs ? */
/* tableStyles CT_TableStyles ? */
/* colors CT_Colors ? */
/* extLst CT_ExtensionList ? */
return styles ;
}
var STYLES _XML _ROOT = writextag ( 'styleSheet' , null , {
'xmlns' : XMLNS . main [ 0 ] ,
'xmlns:vt' : XMLNS . vt
} ) ;
RELS . STY = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles" ;
function write _sty _xml ( wb , opts ) {
var o = [ ] , p = { } , W = writextag , w ;
o . push ( XML _HEADER ) ;
o . push ( STYLES _XML _ROOT ) ;
if ( ( w = write _numFmts ( wb . SSF ) ) ) o . push ( w ) ;
2014-05-29 22:30:03 +00:00
o . push ( '<fonts count="1"><font><sz val="12"/><color theme="1"/><name val="Calibri"/><family val="2"/><scheme val="minor"/></font></fonts>' ) ;
o . push ( '<fills count="2"><fill><patternFill patternType="none"/></fill><fill><patternFill patternType="gray125"/></fill></fills>' ) ;
2014-05-16 00:33:34 +00:00
o . push ( '<borders count="1"><border><left/><right/><top/><bottom/><diagonal/></border></borders>' ) ;
o . push ( '<cellStyleXfs count="1"><xf numFmtId="0" fontId="0" fillId="0" borderId="0"/></cellStyleXfs>' ) ;
if ( ( w = write _cellXfs ( opts . cellXfs ) ) ) o . push ( w ) ;
o . push ( '<cellStyles count="1"><cellStyle name="Normal" xfId="0" builtinId="0"/></cellStyles>' ) ;
o . push ( '<dxfs count="0"/>' ) ;
o . push ( '<tableStyles count="0" defaultTableStyle="TableStyleMedium9" defaultPivotStyle="PivotStyleMedium4"/>' ) ;
if ( o . length > 2 ) { o . push ( '</styleSheet>' ) ; o [ 1 ] = o [ 1 ] . replace ( "/>" , ">" ) ; }
return o . join ( "" ) ;
}
/* [MS-XLSB] 2.4.651 BrtFmt */
function parse _BrtFmt ( data , length ) {
var ifmt = data . read _shift ( 2 ) ;
var stFmtCode = parse _XLWideString ( data , length - 2 ) ;
return [ ifmt , stFmtCode ] ;
}
/* [MS-XLSB] 2.4.653 BrtFont TODO */
function parse _BrtFont ( data , length ) {
var read = data . read _shift . bind ( data ) ;
var out = { flags : { } } ;
out . dyHeight = read ( 2 ) ;
out . grbit = parse _FontFlags ( data , 2 ) ;
out . bls = read ( 2 ) ;
out . sss = read ( 2 ) ;
out . uls = read ( 1 ) ;
out . bFamily = read ( 1 ) ;
out . bCharSet = read ( 1 ) ;
data . l ++ ;
out . brtColor = parse _BrtColor ( data , 8 ) ;
out . bFontScheme = read ( 1 ) ;
out . name = parse _XLWideString ( data , length - 21 ) ;
out . flags . Bold = out . bls === 0x02BC ;
out . flags . Italic = out . grbit . fItalic ;
out . flags . Strikeout = out . grbit . fStrikeout ;
out . flags . Outline = out . grbit . fOutline ;
out . flags . Shadow = out . grbit . fShadow ;
out . flags . Condense = out . grbit . fCondense ;
out . flags . Extend = out . grbit . fExtend ;
out . flags . Sub = out . sss & 0x2 ;
out . flags . Sup = out . sss & 0x1 ;
return out ;
}
/* [MS-XLSB] 2.4.816 BrtXF */
function parse _BrtXF ( data , length ) {
var ixfeParent = data . read _shift ( 2 ) ;
var ifmt = data . read _shift ( 2 ) ;
parsenoop ( data , length - 4 ) ;
return { ixfe : ixfeParent , ifmt : ifmt } ;
}
/* [MS-XLSB] 2.1.7.50 Styles */
function parse _sty _bin ( data , opts ) {
styles . NumberFmt = [ ] ;
for ( var y in SSF . _table ) styles . NumberFmt [ y ] = SSF . _table [ y ] ;
styles . CellXf = [ ] ;
var state = "" ; /* TODO: this should be a stack */
var pass = false ;
recordhopper ( data , function ( val , R , RT ) {
switch ( R . n ) {
case 'BrtFmt' :
styles . NumberFmt [ val [ 0 ] ] = val [ 1 ] ; SSF . load ( val [ 1 ] , val [ 0 ] ) ;
break ;
case 'BrtFont' : break ; /* TODO */
case 'BrtKnownFonts' : break ; /* TODO */
case 'BrtFill' : break ; /* TODO */
case 'BrtBorder' : break ; /* TODO */
case 'BrtXF' :
if ( state === "CELLXFS" ) {
styles . CellXf . push ( val ) ;
}
break ; /* TODO */
case 'BrtStyle' : break ; /* TODO */
case 'BrtDXF' : break ; /* TODO */
case 'BrtMRUColor' : break ; /* TODO */
case 'BrtIndexedColor' : break ; /* TODO */
case 'BrtBeginStyleSheet' : break ;
case 'BrtEndStyleSheet' : break ;
case 'BrtBeginTableStyle' : break ;
case 'BrtTableStyleElement' : break ;
case 'BrtEndTableStyle' : break ;
case 'BrtBeginFmts' : state = "FMTS" ; break ;
case 'BrtEndFmts' : state = "" ; break ;
case 'BrtBeginFonts' : state = "FONTS" ; break ;
case 'BrtEndFonts' : state = "" ; break ;
case 'BrtACBegin' : state = "ACFONTS" ; break ;
case 'BrtACEnd' : state = "" ; break ;
case 'BrtBeginFills' : state = "FILLS" ; break ;
case 'BrtEndFills' : state = "" ; break ;
case 'BrtBeginBorders' : state = "BORDERS" ; break ;
case 'BrtEndBorders' : state = "" ; break ;
case 'BrtBeginCellStyleXFs' : state = "CELLSTYLEXFS" ; break ;
case 'BrtEndCellStyleXFs' : state = "" ; break ;
case 'BrtBeginCellXFs' : state = "CELLXFS" ; break ;
case 'BrtEndCellXFs' : state = "" ; break ;
case 'BrtBeginStyles' : state = "STYLES" ; break ;
case 'BrtEndStyles' : state = "" ; break ;
case 'BrtBeginDXFs' : state = "DXFS" ; break ;
case 'BrtEndDXFs' : state = "" ; break ;
case 'BrtBeginTableStyles' : state = "TABLESTYLES" ; break ;
case 'BrtEndTableStyles' : state = "" ; break ;
case 'BrtBeginColorPalette' : state = "COLORPALETTE" ; break ;
case 'BrtEndColorPalette' : state = "" ; break ;
case 'BrtBeginIndexedColors' : state = "INDEXEDCOLORS" ; break ;
case 'BrtEndIndexedColors' : state = "" ; break ;
case 'BrtBeginMRUColors' : state = "MRUCOLORS" ; break ;
case 'BrtEndMRUColors' : state = "" ; break ;
case 'BrtFRTBegin' : pass = true ; break ;
case 'BrtFRTEnd' : pass = false ; break ;
case 'BrtBeginStyleSheetExt14' : break ;
case 'BrtBeginSlicerStyles' : break ;
case 'BrtEndSlicerStyles' : break ;
case 'BrtBeginTimelineStylesheetExt15' : break ;
case 'BrtEndTimelineStylesheetExt15' : break ;
case 'BrtBeginTimelineStyles' : break ;
case 'BrtEndTimelineStyles' : break ;
case 'BrtEndStyleSheetExt14' : break ;
default : if ( ! pass || opts . WTF ) throw new Error ( "Unexpected record " + RT + " " + R . n ) ;
2014-01-15 07:26:00 +00:00
}
} ) ;
2014-05-16 00:33:34 +00:00
return styles ;
2014-01-15 07:26:00 +00:00
}
2014-05-29 22:30:03 +00:00
function write _sty _bin ( data , opts ) { }
2014-05-16 00:33:34 +00:00
RELS . THEME = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme" ;
2014-01-15 07:26:00 +00:00
2014-05-29 06:18:23 +00:00
/* Various RGB/HSL utility functions - might want to put these elsewhere. */
/* From http://www.javascripter.net/faq/hextorgb.htm, usage: var X = hexToX('FFFFFF') */
function cutHex ( h ) { return ( h . charAt ( 0 ) == "#" ) ? h . substring ( 1 , 7 ) : h }
function hexToR ( h ) { return parseInt ( ( cutHex ( h ) ) . substring ( 0 , 2 ) , 16 ) }
function hexToG ( h ) { return parseInt ( ( cutHex ( h ) ) . substring ( 2 , 4 ) , 16 ) }
function hexToB ( h ) { return parseInt ( ( cutHex ( h ) ) . substring ( 4 , 6 ) , 16 ) }
/* From http://www.javascripter.net/faq/rgbtohex.htm, usage: var RGB = rgbToHex(R, G, B) */
function toHex ( n ) {
n = parseInt ( n , 10 ) ;
if ( isNaN ( n ) ) return "00" ;
n = Math . max ( 0 , Math . min ( n , 255 ) ) ;
return "0123456789ABCDEF" . charAt ( ( n - n % 16 ) / 16 )
+ "0123456789ABCDEF" . charAt ( n % 16 ) ;
}
function rgbToHex ( R , G , B ) { return toHex ( R ) + toHex ( G ) + toHex ( B ) }
/* From the specification. */
var HLSMAX = 255 ;
/* From https://gist.github.com/mjackson/5311256 via http://stackoverflow.com/a/9493060 */
/ * *
* Converts an RGB color value to HSL . Conversion formula
* adapted from http : //en.wikipedia.org/wiki/HSL_color_space.
* Assumes r , g , and b are contained in the set [ 0 , 255 ] and
* returns h , s , and l in the set [ 0 , 1 ] .
*
* @ param Number r The red color value
* @ param Number g The green color value
* @ param Number b The blue color value
* @ return Array The HSL representation
* /
function rgbToHsl ( r , g , b ) {
r /= 255 , g /= 255 , b /= 255 ;
var max = Math . max ( r , g , b ) , min = Math . min ( r , g , b ) ;
var h , s , l = ( max + min ) / 2 ;
if ( max == min ) {
h = s = 0 ; // achromatic
} else {
var d = max - min ;
s = l > 0.5 ? d / ( 2 - max - min ) : d / ( max + min ) ;
switch ( max ) {
case r : h = ( g - b ) / d + ( g < b ? 6 : 0 ) ; break ;
case g : h = ( b - r ) / d + 2 ; break ;
case b : h = ( r - g ) / d + 4 ; break ;
}
h /= 6 ;
}
return [ h , s , l ] ;
}
/ * *
* Converts an HSL color value to RGB . Conversion formula
* adapted from http : //en.wikipedia.org/wiki/HSL_color_space.
* Assumes h , s , and l are contained in the set [ 0 , 1 ] and
* returns r , g , and b in the set [ 0 , 255 ] .
*
* @ param Number h The hue
* @ param Number s The saturation
* @ param Number l The lightness
* @ return Array The RGB representation
* /
function hslToRgb ( h , s , l ) {
var r , g , b ;
if ( s == 0 ) {
r = g = b = l ; // achromatic
} else {
function hue2rgb ( p , q , t ) {
if ( t < 0 ) t += 1 ;
if ( t > 1 ) t -= 1 ;
if ( t < 1 / 6 ) return p + ( q - p ) * 6 * t ;
if ( t < 1 / 2 ) return q ;
if ( t < 2 / 3 ) return p + ( q - p ) * ( 2 / 3 - t ) * 6 ;
return p ;
}
var q = l < 0.5 ? l * ( 1 + s ) : l + s - l * s ;
var p = 2 * l - q ;
r = hue2rgb ( p , q , h + 1 / 3 ) ;
g = hue2rgb ( p , q , h ) ;
b = hue2rgb ( p , q , h - 1 / 3 ) ;
}
return [ Math . round ( r * 255 ) , Math . round ( g * 255 ) , Math . round ( b * 255 ) ] ;
}
/* Utility function to apply tint to an RGB color. */
function rgb _tint ( rgb , tint ) {
var r = hexToR ( rgb ) ,
g = hexToG ( rgb ) ,
b = hexToB ( rgb ) ,
hsl = rgbToHsl ( r , g , b ) ;
/* Apply tint as described in pages 1757-1758 of the ECMA Office Open XML specification. */
/* NOTE: This is totally messed up... see http://social.msdn.microsoft.com/Forums/en-US/e9d8c136-6d62-4098-9b1b-dac786149f43/excel-color-tint-algorithm-incorrect */
if ( tint < 0 ) {
hsl [ 2 ] = hsl [ 2 ] * ( 1.0 + tint ) ;
} else if ( tint > 0 ) {
hsl [ 2 ] = hsl [ 2 ] * ( 1.0 + tint ) ;
// XXX This doesn't work...
//hsl[2] = hsl[2] * (1.0 - tint) + (HLSMAX - HLSMAX * (1.0 - tint));
}
rgb = hslToRgb ( hsl [ 0 ] , hsl [ 1 ] , hsl [ 2 ] ) ;
return rgbToHex ( rgb [ 0 ] , rgb [ 1 ] , rgb [ 2 ] ) ;
}
function parse _clrScheme ( t , opts ) {
themes . themeElements . clrScheme = [ ] ;
var color = { } ;
t [ 0 ] . match ( /<[^>]*>/g ) . forEach ( function ( x ) {
var y = parsexmltag ( x ) ;
switch ( y [ 0 ] ) {
2014-05-29 22:30:03 +00:00
case '<a:clrScheme' : case '</a:clrScheme>' : break ;
2014-05-29 06:18:23 +00:00
/* 20.1.2.3.32 srgbClr CT_SRgbColor */
case '<a:srgbClr' : color . rgb = y . val ; break ;
/* 20.1.2.3.33 sysClr CT_SystemColor */
case '<a:sysClr' : color . rgb = y . lastClr ; break ;
/* 20.1.4.1.9 dk1 (Dark 1) */
case '<a:dk1>' :
case '</a:dk1>' :
/* 20.1.4.1.10 dk2 (Dark 2) */
case '<a:dk2>' :
case '</a:dk2>' :
/* 20.1.4.1.22 lt1 (Light 1) */
case '<a:lt1>' :
case '</a:lt1>' :
/* 20.1.4.1.23 lt2 (Light 2) */
case '<a:lt2>' :
case '</a:lt2>' :
/* 20.1.4.1.1 accent1 (Accent 1) */
case '<a:accent1>' :
case '</a:accent1>' :
/* 20.1.4.1.2 accent2 (Accent 2) */
case '<a:accent2>' :
case '</a:accent2>' :
/* 20.1.4.1.3 accent3 (Accent 3) */
case '<a:accent3>' :
case '</a:accent3>' :
/* 20.1.4.1.4 accent4 (Accent 4) */
case '<a:accent4>' :
case '</a:accent4>' :
/* 20.1.4.1.5 accent5 (Accent 5) */
case '<a:accent5>' :
case '</a:accent5>' :
/* 20.1.4.1.6 accent6 (Accent 6) */
case '<a:accent6>' :
case '</a:accent6>' :
/* 20.1.4.1.19 hlink (Hyperlink) */
case '<a:hlink>' :
case '</a:hlink>' :
/* 20.1.4.1.15 folHlink (Followed Hyperlink) */
case '<a:folHlink>' :
case '</a:folHlink>' :
if ( y [ 0 ] [ 1 ] === '/' ) {
themes . themeElements . clrScheme . push ( color ) ;
color = { } ;
} else {
color . name = y [ 0 ] . substring ( 3 , y [ 0 ] . length - 1 ) ;
}
break ;
default : if ( opts . WTF ) throw 'unrecognized ' + y [ 0 ] + ' in clrScheme' ;
}
} ) ;
}
/* 14.2.7 Theme Part */
function parse _theme _xml ( data , opts ) {
themes . themeElements = { } ;
var t ;
/* clrScheme */
if ( ( t = data . match ( /<a:clrScheme([^>]*)>.*<\/a:clrScheme>/ ) ) ) parse _clrScheme ( t , opts ) ;
return themes ;
}
2014-05-16 00:33:34 +00:00
function write _theme ( ) { return ' < ? xml version = "1.0" encoding = "UTF-8" standalone = "yes" ? > \ n < a : theme xmlns : a = "http://schemas.openxmlformats.org/drawingml/2006/main" name = "Office Theme" > < a : themeElements > < a : clrScheme name = "Office" > < a : dk1 > < a : sysClr val = "windowText" lastClr = "000000" / > < /a:dk1><a:lt1><a:sysClr val="window" lastClr="FFFFFF"/ > < /a:lt1><a:dk2><a:srgbClr val="1F497D"/ > < /a:dk2><a:lt2><a:srgbClr val="EEECE1"/ > < /a:lt2><a:accent1><a:srgbClr val="4F81BD"/ > < /a:accent1><a:accent2><a:srgbClr val="C0504D"/ > < /a:accent2><a:accent3><a:srgbClr val="9BBB59"/ > < /a:accent3><a:accent4><a:srgbClr val="8064A2"/ > < /a:accent4><a:accent5><a:srgbClr val="4BACC6"/ > < /a:accent5><a:accent6><a:srgbClr val="F79646"/ > < /a:accent6><a:hlink><a:srgbClr val="0000FF"/ > < /a:hlink><a:folHlink><a:srgbClr val="800080"/ > < / a : f o l H l i n k > < / a : c l r S c h e m e > < a : f o n t S c h e m e n a m e = " O f f i c e " > < a : m a j o r F o n t > < a : l a t i n t y p e f a c e = " C a m b r i a " / > < a : e a t y p e f a c e = " " / > < a : c s t y p e f a c e = " " / > < a : f o n t s c r i p t = " J p a n " t y p e f a c e = " M S P ゴ シ ッ ク " / > < a : f o n t s c r i p t = " H a n g " t y p e f a c e = " 맑 은 고 딕 " / > < a : f o n t s c r i p t = " H a n s " t y p e f a c e = " 宋 体 " / > < a : f o n t s c r i p t = " H a n t " t y p e f a c e = " 新 細 明 體 " / > < a : f o n t s c r i p t = " A r a b " t y p e f a c e = " T i m e s N e w R o m a n " / > < a : f o n t s c r i p t = " H e b r " t y p e f a c e = " T i m e s N e w R o m a n " / > < a : f o n t s c r i p t = " T h a i " t y p e f a c e = " T a h o m a " / > < a : f o n t s c r i p t = " E t h i " t y p e f a c e = " N y a l a " / > < a : f o n t s c r i p t = " B e n g " t y p e f a c e = " V r i n d a " / > < a : f o n t s c r i p t = " G u j r " t y p e f a c e = " S h r u t i " / > < a : f o n t s c r i p t = " K h m r " t y p e f a c e = " M o o l B o r a n " / > < a : f o n t s c r i p t = " K n d a " t y p e f a c e = " T u n g a " / > < a : f o n t s c r i p t = " G u r u " t y p e f a c e = " R a a v i " / > < a : f o n t s c r i p t = " C a n s " t y p e f a c e = " E u p h e m i a " / > < a : f o n t s c r i p t = " C h e r " t y p e f a c e = " P l a n t a g e n e t C h e r o k e e " / > < a : f o n t s c r i p t = " Y i i i " t y p e f a c e = " M i c r o s o f t Y i B a i t i " / > < a : f o n t s c r i p t = " T i b t " t y p e f a c e = " M i c r o s o f t H i m a l a y a " / > < a : f o n t s c r i p t = " T h a a " t y p e f a c e = " M V B o l i " / > < a : f o n t s c r i p t = " D e v a " t y p e f a c e = " M a n g a l " / > < a : f o n t s c r i p t = " T e l u " t y p e f a c e = " G a u t a m i " / > < a : f o n t s c r i p t = " T a m l " t y p e f a c e = " L a t h a " / > < a : f o n t s c r i p t = " S y r c " t y p e f a c e = " E s t r a n g e l o E d e s s a " / > < a : f o n t s c r i p t = " O r y a " t y p e f a c e = " K a l i n g a " / > < a : f o n t s c r i p t = " M l y m " t y p e f a c e = " K a r t i k a " / > < a : f o n t s c r i p t = " L a o o " t y p e f a c e = " D o k C h a m p a " / > < a : f o n t s c r i p t = " S i n h " t y p e f a c e = " I s k o o l a P o t a " / > < a : f o n t s c r i p t = " M o n g " t y p e f a c e = " M o n g o l i a n B a i t i " / > < a : f o n t s c r i p t = " V i e t " t y p e f a c e = " T i m e s N e w R o m a n " / > < a : f o n t s c r i p t = " U i g h " t y p e f a c e = " M i c r o s o f t U i g h u r " / > < a : f o n t s c r i p t = " G e o r " t y p e f a c e = " S y l f a e n " / > < / a : m a j o r F o n t > < a : m i n o r F o n t > < a : l a t i n t y p e f a c e = " C a l i b r i " / > < a : e a t y p e f a c e = " " / > < a : c s t y p e f a c e = " " / > < a : f o n t s c r i p t = " J p a n " t y p e f a c e = " M S P ゴ シ ッ ク " / > < a : f o n t s c r i p t = " H a n g " t y p e f a c e = " 맑 은 고 딕 " / > < a : f o n t s c r i p t = " H a n s " t y p e f a c e = " 宋 体 " / > < a : f o n t s c r i p t = " H a n t " t y p e f a c e = " 新 細 明 體 " / > < a : f o n t s c r i p t = " A r a b " t y p e f a c e = " A r i a l " / > < a : f o n t s c r i p t = " H e b r " t y p e f a c e = " A r i a l " / > < a : f o n t s c r i p t = " T h a i " t y p e f a c e = " T a h o m a " / > < a : f o n t s c r i p t = " E t h i " t y p e f a c e = " N y a l a " / > < a : f o n t s c r i p t = " B e n g " t y p e f a c e = " V r i n d a " / > < a : f o n t s c r i p t = " G u j r " t y p e f a c e = " S h r u t i " / > < a : f o n t s c r i p t = " K h m r " t y p e f a c e = " D a u n P e n h " / > < a : f o n t s c r i p t = " K n d a " t y p e f a c e = " T u n g a " / > < a : f o n t s c r i p t = " G u r u " t y p e f a c e = " R a a v i " / > < a : f o n t s c r i p t = " C a n s " t y p e f a c e = " E u p h e m i a " / > < a : f o n t s c r i p t = " C h e r " t y p e f a c e = " P l a n t a g e n e t C h e r o k e e " / > < a : f o n t s c r i p t = " Y i i i " t y p e f a c e = " M i c r o s o f t Y i B a i t i " / > < a : f o n t s c r i p t = " T i b t " t y p e f a c e = " M i c r o s o f t H i m a l a y a " / > < a : f o n t s c r i p t = " T h a a " t y p e f a c e = " M V B o l i " / > < a : f o n t s c r i p t = " D e v a " t y p e f a c e = " M a n g a l " / > < a : f o n t s c r i p t = " T e l u " t y p e f a c e = " G a u t a m i " / > < a : f o n t s c r i p t = " T a m l " t y p e f a c e = " L a t h a " / > < a : f o n t s c r i p t = " S y r c " t y p e f a c e = " E s t r a n g e l o E d e s s a " / > < a : f o n t s c r i p t = " O r y a " t y p e f a c e = " K a l i n g a " / > < a : f o n t s c r i p t = " M l y m " t y p e f a c e = " K a r t i k a " / > < a : f o n t s c r i p t = " L a o o " t y p e f a c e = " D o k C h a m p a " / > < a : f o n t s c r i p t = " S i n h " t y p e f a c e = " I s k o o l a P o t a " / > < a : f o n t s c r i p t = " M o n g " t y p e f a c e = " M o n g o l i a n B a i t i " / > < a : f o n t s c r i p t = " V i e t " t y p e f a c e = " A r i a l " / > < a : f o n t s c r i p t = " U i g h " t y p e f a c e = " M i c r o s o f t U i g h u r " / > < a : f o n t s c r i p t = " G e o r " t y p e f a c e = " S y l f a e n " / > < / a : m i n o r F o n t > < / a : f o n t S c h e m e > < a : f m t S c h e m e n a m e = " O f f i c e " > < a : f i l l S t y l e L s t > < a : s o l i d F i l l > < a : s c h e m e C l r v a l = " p h C l r " / > < / a : s o l i d F i l l > < a : g r a d F i l l r o t W i t h S h a p e = " 1 " > < a : g s L s t > < a : g s p o s = " 0 " > < a : s c h e m e C l r v a l = " p h C l r " > < a : t i n t v a l = " 5 0 0 0 0 " / > < a : s a t M o d v a l = " 3 0 0 0 0 0 " / > < / a : s c h e m e C l r > < / a : g s > < a : g s p o s = " 3 5 0 0 0 " > < a : s c h e m e C l r v a l = " p h C l r " > < a : t i n t v a l = " 3 7 0 0 0 " / > < a : s a t M o d v a l = " 3 0 0 0 0 0 " / > < / a : s c h e m e C
2014-03-29 22:53:15 +00:00
/* 18.6 Calculation Chain */
function parse _cc _xml ( data , opts ) {
var d = [ ] ;
var l = 0 , i = 1 ;
( data . match ( /<[^>]*>/g ) || [ ] ) . forEach ( function ( x ) {
var y = parsexmltag ( x ) ;
switch ( y [ 0 ] ) {
case '<?xml' : break ;
/* 18.6.2 calcChain CT_CalcChain 1 */
case '<calcChain' : case '<calcChain>' : case '</calcChain>' : break ;
/* 18.6.1 c CT_CalcCell 1 */
case '<c' : delete y [ 0 ] ; if ( y . i ) i = y . i ; else y . i = i ; d . push ( y ) ; break ;
}
} ) ;
return d ;
}
2014-05-29 22:30:03 +00:00
function write _cc _xml ( data , opts ) { }
2014-03-29 22:53:15 +00:00
/* [MS-XLSB] 2.6.4.1 */
var parse _BrtCalcChainItem$ = function ( data , length ) {
var out = { } ;
out . i = data . read _shift ( 4 ) ;
var cell = { } ;
cell . r = data . read _shift ( 4 ) ;
cell . c = data . read _shift ( 4 ) ;
out . r = encode _cell ( cell ) ;
var flags = data . read _shift ( 1 ) ;
if ( flags & 0x2 ) out . l = '1' ;
if ( flags & 0x8 ) out . a = '1' ;
return out ;
} ;
/* 18.6 Calculation Chain */
function parse _cc _bin ( data , opts ) {
var out = [ ] ;
var pass = false ;
recordhopper ( data , function ( val , R , RT ) {
switch ( R . n ) {
case 'BrtCalcChainItem$' : out . push ( val ) ; break ;
case 'BrtBeginCalcChain$' : break ;
case 'BrtEndCalcChain$' : break ;
default : if ( ! pass || opts . WTF ) throw new Error ( "Unexpected record " + RT + " " + R . n ) ;
}
} ) ;
return out ;
}
2014-05-29 22:30:03 +00:00
function write _cc _bin ( data , opts ) { }
2014-01-15 07:26:00 +00:00
/* 18.7.3 CT_Comment */
2014-02-12 06:09:42 +00:00
function parse _comments _xml ( data , opts ) {
2014-04-03 22:51:54 +00:00
if ( data . match ( /<(?:\w+:)?comments *\/>/ ) ) return [ ] ;
2014-01-15 07:26:00 +00:00
var authors = [ ] ;
var commentList = [ ] ;
2014-04-03 22:51:54 +00:00
data . match ( /<(?:\w+:)?authors>([^\u2603]*)<\/(?:\w+:)?authors>/m ) [ 1 ] . split ( /<\/(?:\w+:)?author>/ ) . forEach ( function ( x ) {
2014-01-15 07:26:00 +00:00
if ( x === "" || x . trim ( ) === "" ) return ;
2014-04-03 22:51:54 +00:00
authors . push ( x . match ( /<(?:\w+:)?author[^>]*>(.*)/ ) [ 1 ] ) ;
2014-01-15 07:26:00 +00:00
} ) ;
2014-04-03 22:51:54 +00:00
( data . match ( /<(?:\w+:)?commentList>([^\u2603]*)<\/(?:\w+:)?commentList>/m ) || [ "" , "" ] ) [ 1 ] . split ( /<\/(?:\w+:)?comment>/ ) . forEach ( function ( x , index ) {
2014-01-15 07:26:00 +00:00
if ( x === "" || x . trim ( ) === "" ) return ;
2014-04-03 22:51:54 +00:00
var y = parsexmltag ( x . match ( /<(?:\w+:)?comment[^>]*>/ ) [ 0 ] ) ;
2014-01-18 13:45:49 +00:00
var comment = { author : y . authorId && authors [ y . authorId ] ? authors [ y . authorId ] : undefined , ref : y . ref , guid : y . guid } ;
2014-02-19 03:03:28 +00:00
var cell = decode _cell ( y . ref ) ;
if ( opts . sheetRows && opts . sheetRows <= cell . r ) return ;
2014-01-18 08:29:51 +00:00
var textMatch = x . match ( /<text>([^\u2603]*)<\/text>/m ) ;
if ( ! textMatch || ! textMatch [ 1 ] ) return ; // a comment may contain an empty text tag.
2014-01-22 04:58:26 +00:00
var rt = parse _si ( textMatch [ 1 ] ) ;
2014-01-18 13:45:49 +00:00
comment . r = rt . r ;
2014-02-05 13:39:21 +00:00
comment . t = rt . t ;
2014-02-12 06:09:42 +00:00
if ( opts . cellHTML ) comment . h = rt . h ;
2014-01-15 07:26:00 +00:00
commentList . push ( comment ) ;
} ) ;
return commentList ;
}
2014-05-29 22:30:03 +00:00
function write _comments _xml ( data , opts ) { }
2014-03-29 02:05:50 +00:00
/* [MS-XLSB] 2.4.28 BrtBeginComment */
var parse _BrtBeginComment = function ( data , length ) {
var out = { } ;
out . iauthor = data . read _shift ( 4 ) ;
var rfx = parse _UncheckedRfX ( data , 16 ) ;
out . rfx = rfx . s ;
out . ref = encode _cell ( rfx . s ) ;
data . l += 16 ; /*var guid = parse_GUID(data); */
return out ;
} ;
/* [MS-XLSB] 2.4.324 BrtCommentAuthor */
var parse _BrtCommentAuthor = parse _XLWideString ;
/* [MS-XLSB] 2.4.325 BrtCommentText */
var parse _BrtCommentText = parse _RichStr ;
/* [MS-XLSB] 2.1.7.8 Comments */
function parse _comments _bin ( data , opts ) {
var out = [ ] ;
var authors = [ ] ;
var c = { } ;
var pass = false ;
recordhopper ( data , function ( val , R , RT ) {
switch ( R . n ) {
case 'BrtCommentAuthor' : authors . push ( val ) ; break ;
case 'BrtBeginComment' : c = val ; break ;
case 'BrtCommentText' : c . t = val . t ; c . h = val . h ; c . r = val . r ; break ;
case 'BrtEndComment' :
c . author = authors [ c . iauthor ] ;
delete c . iauthor ;
if ( opts . sheetRows && opts . sheetRows <= c . rfx . r ) break ;
delete c . rfx ; out . push ( c ) ; break ;
case 'BrtBeginComments' : break ;
case 'BrtEndComments' : break ;
case 'BrtBeginCommentAuthors' : break ;
case 'BrtEndCommentAuthors' : break ;
case 'BrtBeginCommentList' : break ;
case 'BrtEndCommentList' : break ;
default : if ( ! pass || opts . WTF ) throw new Error ( "Unexpected record " + RT + " " + R . n ) ;
}
} ) ;
return out ;
}
2014-01-15 07:26:00 +00:00
2014-05-29 22:30:03 +00:00
function write _comments _bin ( data , opts ) { }
2014-02-12 06:09:42 +00:00
function parse _comments ( zip , dirComments , sheets , sheetRels , opts ) {
2014-01-15 07:26:00 +00:00
for ( var i = 0 ; i != dirComments . length ; ++ i ) {
var canonicalpath = dirComments [ i ] ;
2014-03-29 02:05:50 +00:00
var comments = parse _cmnt ( getzipdata ( zip , canonicalpath . replace ( /^\// , '' ) , true ) , canonicalpath , opts ) ;
2014-02-19 03:03:28 +00:00
if ( ! comments || ! comments . length ) continue ;
2014-01-15 07:26:00 +00:00
// find the sheets targeted by these comments
2014-05-16 00:33:34 +00:00
var sheetNames = keys ( sheets ) ;
2014-01-15 07:26:00 +00:00
for ( var j = 0 ; j != sheetNames . length ; ++ j ) {
var sheetName = sheetNames [ j ] ;
var rels = sheetRels [ sheetName ] ;
2014-02-12 06:09:42 +00:00
if ( rels ) {
2014-01-15 07:26:00 +00:00
var rel = rels [ canonicalpath ] ;
2014-02-12 06:09:42 +00:00
if ( rel ) insertCommentsIntoSheet ( sheetName , sheets [ sheetName ] , comments ) ;
2014-01-15 07:26:00 +00:00
}
}
2014-01-29 06:00:09 +00:00
}
2014-01-15 07:26:00 +00:00
}
function insertCommentsIntoSheet ( sheetName , sheet , comments ) {
comments . forEach ( function ( comment ) {
var cell = sheet [ comment . ref ] ;
if ( ! cell ) {
cell = { } ;
sheet [ comment . ref ] = cell ;
2014-03-29 22:53:15 +00:00
var range = decode _range ( sheet [ "!ref" ] || "BDWGO1000001:A1" ) ;
2014-01-20 23:05:00 +00:00
var thisCell = decode _cell ( comment . ref ) ;
if ( range . s . r > thisCell . r ) range . s . r = thisCell . r ;
if ( range . e . r < thisCell . r ) range . e . r = thisCell . r ;
if ( range . s . c > thisCell . c ) range . s . c = thisCell . c ;
if ( range . e . c < thisCell . c ) range . e . c = thisCell . c ;
var encoded = encode _range ( range ) ;
if ( encoded !== sheet [ "!ref" ] ) sheet [ "!ref" ] = encoded ;
2014-01-22 04:58:26 +00:00
}
2014-01-15 07:26:00 +00:00
2014-02-12 06:09:42 +00:00
if ( ! cell . c ) cell . c = [ ] ;
var o = { a : comment . author , t : comment . t , r : comment . r } ;
if ( comment . h ) o . h = comment . h ;
cell . c . push ( o ) ;
2014-01-15 07:26:00 +00:00
} ) ;
}
2014-02-13 06:22:42 +00:00
/* [MS-XLSB] 2.5.97.4 CellParsedFormula TODO: use similar logic to js-xls */
var parse _CellParsedFormula = function ( data , length ) {
var cce = data . read _shift ( 4 ) ;
return parsenoop ( data , length - 4 ) ;
} ;
2014-01-28 16:38:02 +00:00
var strs = { } ; // shared strings
var _ssfopts = { } ; // spreadsheet formatting options
2013-11-12 16:29:53 +00:00
2014-05-16 00:33:34 +00:00
RELS . WS = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet" ;
function get _sst _id ( sst , str ) {
for ( var i = 0 ; i != sst . length ; ++ i ) if ( sst [ i ] . t === str ) { sst . Count ++ ; return i ; }
sst [ sst . length ] = { t : str } ; sst . Count ++ ; sst . Unique ++ ; return sst . length - 1 ;
}
function get _cell _style ( styles , cell , opts ) {
2014-05-22 12:16:51 +00:00
var z = opts . revssf [ cell . z || "General" ] ;
2014-05-16 00:33:34 +00:00
for ( var i = 0 ; i != styles . length ; ++ i ) if ( styles [ i ] . numFmtId === z ) return i ;
styles [ styles . length ] = {
numFmtId : z ,
fontId : 0 ,
fillId : 0 ,
borderId : 0 ,
xfId : 0 ,
applyNumberFormat : 1
} ;
return styles . length - 1 ;
}
2014-01-28 16:38:02 +00:00
/* 18.3 Worksheets */
2014-04-15 09:04:03 +00:00
function parse _ws _xml ( data , opts , rels ) {
2014-01-28 16:38:02 +00:00
if ( ! data ) return data ;
/* 18.3.1.99 worksheet CT_Worksheet */
2014-05-22 12:16:51 +00:00
var s = { } , mtch ;
2014-01-28 16:38:02 +00:00
/* 18.3.1.35 dimension CT_SheetDimension ? */
var ref = data . match ( /<dimension ref="([^"]*)"\s*\/>/ ) ;
if ( ref && ref . length == 2 && ref [ 1 ] . indexOf ( ":" ) !== - 1 ) s [ "!ref" ] = ref [ 1 ] ;
2014-03-23 21:30:00 +00:00
/* 18.3.1.55 mergeCells CT_MergeCells */
var mergecells = [ ] ;
if ( data . match ( /<\/mergeCells>/ ) ) {
var merges = data . match ( /<mergeCell ref="([A-Z0-9:]+)"\s*\/>/g ) ;
2014-05-16 00:33:34 +00:00
mergecells = merges . map ( function ( range ) {
2014-03-23 21:30:00 +00:00
return decode _range ( /<mergeCell ref="([A-Z0-9:]+)"\s*\/>/ . exec ( range ) [ 1 ] ) ;
} ) ;
}
2014-01-28 16:38:02 +00:00
var refguess = { s : { r : 1000000 , c : 1000000 } , e : { r : 0 , c : 0 } } ;
var sidx = 0 ;
2014-03-23 21:30:00 +00:00
2014-05-31 15:44:56 +00:00
var match _v = matchtag ( "v" ) , match _f = matchtag ( "f" ) ;
2014-01-28 16:38:02 +00:00
/* 18.3.1.80 sheetData CT_SheetData ? */
2014-05-31 15:44:56 +00:00
mtch = data . match ( /<(?:\w+:)?sheetData>([^\u2603]*)<\/(?:\w+:)?sheetData>/m ) ;
if ( mtch ) for ( var marr = mtch [ 1 ] . split ( /<\/(?:\w+:)?row>/ ) , mt = 0 ; mt != marr . length ; ++ mt ) {
x = marr [ mt ] ;
if ( x === "" || x . trim ( ) === "" ) continue ;
2014-01-28 16:38:02 +00:00
/* 18.3.1.73 row CT_Row */
2014-04-03 22:51:54 +00:00
var row = parsexmltag ( x . match ( /<(?:\w+:)?row[^>]*>/ ) [ 0 ] ) ;
2014-05-31 15:44:56 +00:00
if ( opts . sheetRows && opts . sheetRows < + row . r ) continue ;
2014-01-28 16:38:02 +00:00
if ( refguess . s . r > row . r - 1 ) refguess . s . r = row . r - 1 ;
if ( refguess . e . r < row . r - 1 ) refguess . e . r = row . r - 1 ;
/* 18.3.1.4 c CT_Cell */
2014-04-03 22:51:54 +00:00
var cells = x . substr ( x . indexOf ( '>' ) + 1 ) . split ( /<(?:\w+:)?c / ) ;
2014-05-31 15:44:56 +00:00
for ( var ix = 0 , c = cells [ 0 ] ; ix != cells . length ; ++ ix , c = cells [ ix ] ) {
if ( c === "" || c . trim ( ) === "" ) continue ;
var cref = c . match ( /r=["']([^"']*)["']/ ) , idx = ix ;
2014-01-29 06:00:09 +00:00
c = "<c " + c ;
2014-02-22 21:36:28 +00:00
if ( cref && cref . length == 2 ) idx = decode _cell ( cref [ 1 ] ) . c ;
2014-01-28 16:38:02 +00:00
var cell = parsexmltag ( ( c . match ( /<c[^>]*>/ ) || [ c ] ) [ 0 ] ) ; delete cell [ 0 ] ;
var d = c . substr ( c . indexOf ( '>' ) + 1 ) ;
var p = { } ;
2014-05-31 15:44:56 +00:00
var x = d . match ( match _v ) ; if ( x ) p . v = unescapexml ( x [ 1 ] ) ;
if ( opts . cellFormula ) { x = d . match ( match _f ) ; if ( x ) p . f = unescapexml ( x [ 1 ] ) ; }
2014-01-28 16:38:02 +00:00
/* SCHEMA IS ACTUALLY INCORRECT HERE. IF A CELL HAS NO T, EMIT "" */
2014-02-07 10:53:40 +00:00
if ( cell . t === undefined && p . v === undefined ) {
2014-05-31 15:44:56 +00:00
if ( ! opts . sheetStubs ) continue ;
2014-02-07 10:53:40 +00:00
p . t = "str" ; p . v = undefined ;
}
2014-01-28 16:38:02 +00:00
else p . t = ( cell . t ? cell . t : "n" ) ; // default is "n" in schema
2014-02-07 10:53:40 +00:00
if ( refguess . s . c > idx ) refguess . s . c = idx ;
if ( refguess . e . c < idx ) refguess . e . c = idx ;
2014-02-15 05:08:18 +00:00
/* 18.18.11 t ST_CellType */
2014-01-28 16:38:02 +00:00
switch ( p . t ) {
case 'n' : p . v = parseFloat ( p . v ) ; break ;
case 's' : {
sidx = parseInt ( p . v , 10 ) ;
p . v = strs [ sidx ] . t ;
p . r = strs [ sidx ] . r ;
2014-02-12 06:09:42 +00:00
if ( opts . cellHTML ) p . h = strs [ sidx ] . h ;
2014-01-28 16:38:02 +00:00
} break ;
2014-01-29 06:00:09 +00:00
case 'str' : if ( p . v ) p . v = utf8read ( p . v ) ; break ;
2014-01-28 16:38:02 +00:00
case 'inlineStr' :
2014-01-29 06:00:09 +00:00
var is = d . match ( /<is>(.*)<\/is>/ ) ;
is = is ? parse _si ( is [ 1 ] ) : { t : "" , r : "" } ;
p . t = 'str' ; p . v = is . t ;
2014-01-28 16:38:02 +00:00
break ; // inline string
2014-02-15 05:08:18 +00:00
case 'b' : if ( typeof p . v !== 'boolean' ) p . v = parsexmlbool ( p . v ) ; break ;
2014-05-22 12:16:51 +00:00
case 'd' :
p . v = datenum ( p . v ) ;
2014-02-15 03:15:10 +00:00
p . t = 'n' ;
break ;
2014-01-28 16:38:02 +00:00
/* in case of error, stick value in .raw */
case 'e' : p . raw = RBErr [ p . v ] ; break ;
}
/* formatting */
2014-05-29 06:18:23 +00:00
var fmtid = 0 , fillid = 0 ;
2014-01-28 16:38:02 +00:00
if ( cell . s && styles . CellXf ) {
var cf = styles . CellXf [ cell . s ] ;
if ( cf && cf . numFmtId ) fmtid = cf . numFmtId ;
2014-05-29 06:18:23 +00:00
if ( opts . cellStyles && cf && cf . fillId ) fillid = cf . fillId ;
2014-01-28 16:38:02 +00:00
}
2014-02-07 10:53:40 +00:00
try {
p . w = SSF . format ( fmtid , p . v , _ssfopts ) ;
if ( opts . cellNF ) p . z = SSF . _table [ fmtid ] ;
2014-05-29 06:18:23 +00:00
if ( fillid ) {
p . s = styles . Fills [ fillid ] ;
if ( p . s . fgColor && p . s . fgColor . theme ) {
p . s . fgColor . rgb = rgb _tint ( themes . themeElements . clrScheme [ p . s . fgColor . theme ] . rgb , p . s . fgColor . tint || 0 ) ;
}
if ( p . s . bgColor && p . s . bgColor . theme ) {
p . s . bgColor . rgb = rgb _tint ( themes . themeElements . clrScheme [ p . s . bgColor . theme ] . rgb , p . s . bgColor . tint || 0 ) ;
}
}
2014-02-15 05:08:18 +00:00
} catch ( e ) { if ( opts . WTF ) throw e ; }
2014-01-28 16:38:02 +00:00
s [ cell . r ] = p ;
2014-05-31 15:44:56 +00:00
} ;
}
2014-04-15 09:04:03 +00:00
/* 18.3.1.48 hyperlinks CT_Hyperlinks */
if ( data . match ( /<\/hyperlinks>/ ) ) data . match ( /<hyperlink[^>]*\/>/g ) . forEach ( function ( h ) {
var val = parsexmltag ( h ) ; delete val [ 0 ] ;
if ( ! val . ref ) return ;
var rel = rels [ '!id' ] [ val . id ] ;
if ( rel ) {
val . Target = rel . Target ;
if ( val . location ) val . Target += "#" + val . location ;
val . Rel = rel ;
}
var rng = decode _range ( val . ref ) ;
for ( var R = rng . s . r ; R <= rng . e . r ; ++ R ) for ( var C = rng . s . c ; C <= rng . e . c ; ++ C ) {
var addr = encode _cell ( { c : C , r : R } ) ;
if ( ! s [ addr ] ) s [ addr ] = { t : "str" , v : undefined } ;
s [ addr ] . l = val ;
}
} ) ;
2014-03-29 22:53:15 +00:00
if ( ! s [ "!ref" ] && refguess . e . c >= refguess . s . c && refguess . e . r >= refguess . s . r ) s [ "!ref" ] = encode _range ( refguess ) ;
if ( opts . sheetRows && s [ "!ref" ] ) {
2014-02-19 03:03:28 +00:00
var tmpref = decode _range ( s [ "!ref" ] ) ;
if ( opts . sheetRows < + tmpref . e . r ) {
tmpref . e . r = opts . sheetRows - 1 ;
if ( tmpref . e . r > refguess . e . r ) tmpref . e . r = refguess . e . r ;
if ( tmpref . e . r < tmpref . s . r ) tmpref . s . r = tmpref . e . r ;
if ( tmpref . e . c > refguess . e . c ) tmpref . e . c = refguess . e . c ;
if ( tmpref . e . c < tmpref . s . c ) tmpref . s . c = tmpref . e . c ;
s [ "!fullref" ] = s [ "!ref" ] ;
s [ "!ref" ] = encode _range ( tmpref ) ;
}
}
2014-03-23 21:30:00 +00:00
if ( mergecells . length > 0 ) s [ "!merges" ] = mergecells ;
2014-01-28 16:38:02 +00:00
return s ;
}
2014-05-16 00:33:34 +00:00
var WS _XML _ROOT = writextag ( 'worksheet' , null , {
'xmlns' : XMLNS . main [ 0 ] ,
'xmlns:r' : XMLNS . r
} ) ;
var write _ws _xml _cell = function ( cell , ref , ws , opts , idx , wb ) {
2014-05-22 12:16:51 +00:00
var vv = cell . v ; if ( cell . t == 'b' ) vv = cell . v ? "1" : "0" ;
var v = writextag ( 'v' , escapexml ( String ( vv ) ) ) , o = { r : ref } ;
o . s = get _cell _style ( opts . cellXfs , cell , opts ) ;
if ( o . s === 0 || o . s === "0" ) delete o . s ;
2014-05-16 00:33:34 +00:00
/* TODO: cell style */
if ( typeof cell . v === 'undefined' ) return "" ;
switch ( cell . t ) {
case 's' : case 'str' : {
if ( opts . bookSST ) {
v = writextag ( 'v' , String ( get _sst _id ( opts . Strings , cell . v ) ) ) ;
o . t = "s" ; return writextag ( 'c' , v , o ) ;
} else { o . t = "str" ; return writextag ( 'c' , v , o ) ; }
} break ;
2014-05-22 12:16:51 +00:00
case 'n' : delete o . t ; return writextag ( 'c' , v , o ) ;
2014-05-16 00:33:34 +00:00
case 'b' : o . t = "b" ; return writextag ( 'c' , v , o ) ;
2014-05-16 00:50:55 +00:00
case 'e' : o . t = "e" ; return writextag ( 'c' , v , o ) ;
2014-05-16 00:33:34 +00:00
}
} ;
var write _ws _xml _data = function ( ws , opts , idx , wb ) {
var o = [ ] , r = [ ] , range = utils . decode _range ( ws [ '!ref' ] ) , cell , ref ;
for ( var R = range . s . r ; R <= range . e . r ; ++ R ) {
r = [ ] ;
for ( var C = range . s . c ; C <= range . e . c ; ++ C ) {
ref = utils . encode _cell ( { c : C , r : R } ) ;
if ( ! ws [ ref ] ) continue ;
if ( ( cell = write _ws _xml _cell ( ws [ ref ] , ref , ws , opts , idx , wb ) ) ) r . push ( cell ) ;
}
if ( r . length ) o . push ( writextag ( 'row' , r . join ( "" ) , { r : encode _row ( R ) } ) ) ;
}
return o . join ( "" ) ;
} ;
var write _ws _xml = function ( idx , opts , wb ) {
var o = [ ] , s = wb . SheetNames [ idx ] , ws = wb . Sheets [ s ] || { } , sidx = 0 , rdata = "" ;
o . push ( XML _HEADER ) ;
o . push ( WS _XML _ROOT ) ;
o . push ( writextag ( 'dimension' , null , { 'ref' : ws [ '!ref' ] || 'A1' } ) ) ;
sidx = o . length ;
o . push ( writextag ( 'sheetData' , null ) ) ;
if ( ws [ '!ref' ] ) rdata = write _ws _xml _data ( ws , opts , idx , wb ) ;
if ( rdata . length ) o . push ( rdata ) ;
if ( o . length > sidx + 1 ) { o . push ( '</sheetData>' ) ; o [ sidx ] = o [ sidx ] . replace ( "/>" , ">" ) ; }
if ( o . length > 2 ) { o . push ( '</worksheet>' ) ; o [ 1 ] = o [ 1 ] . replace ( "/>" , ">" ) ; }
return o . join ( "" ) ;
} ;
2014-02-13 06:22:42 +00:00
2014-01-28 16:38:02 +00:00
/* [MS-XLSB] 2.4.718 BrtRowHdr */
var parse _BrtRowHdr = function ( data , length ) {
var z = { } ;
z . r = data . read _shift ( 4 ) ;
data . l += length - 4 ;
return z ;
} ;
/* [MS-XLSB] 2.4.812 BrtWsDim */
var parse _BrtWsDim = parse _UncheckedRfX ;
2014-05-29 22:30:03 +00:00
var write _BrtWsDim = write _UncheckedRfX ;
2014-01-28 16:38:02 +00:00
/* [MS-XLSB] 2.4.815 BrtWsProp */
var parse _BrtWsProp = function ( data , length ) {
var z = { } ;
/* TODO: pull flags */
data . l += 19 ;
z . name = parse _CodeName ( data , length - 19 ) ;
return z ;
} ;
2014-02-13 06:22:42 +00:00
/* [MS-XLSB] 2.4.303 BrtCellBlank */
2014-03-29 22:53:15 +00:00
var parse _BrtCellBlank = function ( data , length ) {
var cell = parse _Cell ( data ) ;
return [ cell ] ;
} ;
2014-02-13 06:22:42 +00:00
2014-01-28 16:38:02 +00:00
/* [MS-XLSB] 2.4.304 BrtCellBool */
var parse _BrtCellBool = function ( data , length ) {
var cell = parse _Cell ( data ) ;
var fBool = data . read _shift ( 1 ) ;
return [ cell , fBool , 'b' ] ;
} ;
/* [MS-XLSB] 2.4.305 BrtCellError */
var parse _BrtCellError = function ( data , length ) {
var cell = parse _Cell ( data ) ;
var fBool = data . read _shift ( 1 ) ;
return [ cell , fBool , 'e' ] ;
} ;
/* [MS-XLSB] 2.4.308 BrtCellIsst */
var parse _BrtCellIsst = function ( data , length ) {
var cell = parse _Cell ( data ) ;
var isst = data . read _shift ( 4 ) ;
return [ cell , isst , 's' ] ;
} ;
/* [MS-XLSB] 2.4.310 BrtCellReal */
var parse _BrtCellReal = function ( data , length ) {
var cell = parse _Cell ( data ) ;
var value = parse _Xnum ( data ) ;
return [ cell , value , 'n' ] ;
} ;
/* [MS-XLSB] 2.4.311 BrtCellRk */
var parse _BrtCellRk = function ( data , length ) {
var cell = parse _Cell ( data ) ;
var value = parse _RkNumber ( data ) ;
return [ cell , value , 'n' ] ;
} ;
2014-02-13 06:22:42 +00:00
/* [MS-XLSB] 2.4.314 BrtCellSt */
2014-01-28 16:38:02 +00:00
var parse _BrtCellSt = function ( data , length ) {
var cell = parse _Cell ( data ) ;
var value = parse _XLWideString ( data ) ;
return [ cell , value , 'str' ] ;
} ;
2014-02-12 06:09:42 +00:00
/* [MS-XLSB] 2.4.647 BrtFmlaBool */
2014-02-13 06:22:42 +00:00
var parse _BrtFmlaBool = function ( data , length , opts ) {
2014-02-12 06:09:42 +00:00
var cell = parse _Cell ( data ) ;
var value = data . read _shift ( 1 ) ;
2014-02-13 06:22:42 +00:00
var o = [ cell , value , 'b' ] ;
if ( opts . cellFormula ) {
var formula = parse _CellParsedFormula ( data , length - 9 ) ;
o [ 3 ] = "" ; /* TODO */
}
else data . l += length - 9 ;
return o ;
2014-02-12 06:09:42 +00:00
} ;
2014-01-29 06:00:09 +00:00
/* [MS-XLSB] 2.4.648 BrtFmlaError */
2014-02-13 06:22:42 +00:00
var parse _BrtFmlaError = function ( data , length , opts ) {
2014-01-28 16:38:02 +00:00
var cell = parse _Cell ( data ) ;
2014-02-13 06:22:42 +00:00
var value = data . read _shift ( 1 ) ;
var o = [ cell , value , 'e' ] ;
if ( opts . cellFormula ) {
var formula = parse _CellParsedFormula ( data , length - 9 ) ;
o [ 3 ] = "" ; /* TODO */
}
else data . l += length - 9 ;
return o ;
2014-01-28 16:38:02 +00:00
} ;
/* [MS-XLSB] 2.4.649 BrtFmlaNum */
2014-02-13 06:22:42 +00:00
var parse _BrtFmlaNum = function ( data , length , opts ) {
2014-01-28 16:38:02 +00:00
var cell = parse _Cell ( data ) ;
var value = parse _Xnum ( data ) ;
2014-02-13 06:22:42 +00:00
var o = [ cell , value , 'n' ] ;
if ( opts . cellFormula ) {
var formula = parse _CellParsedFormula ( data , length - 16 ) ;
o [ 3 ] = "" ; /* TODO */
}
else data . l += length - 16 ;
return o ;
2014-01-28 16:38:02 +00:00
} ;
2014-02-12 06:09:42 +00:00
/* [MS-XLSB] 2.4.650 BrtFmlaString */
2014-02-13 06:22:42 +00:00
var parse _BrtFmlaString = function ( data , length , opts ) {
2014-02-12 06:09:42 +00:00
var start = data . l ;
var cell = parse _Cell ( data ) ;
var value = parse _XLWideString ( data ) ;
2014-02-13 06:22:42 +00:00
var o = [ cell , value , 'str' ] ;
if ( opts . cellFormula ) {
var formula = parse _CellParsedFormula ( data , start + length - data . l ) ;
o [ 3 ] = "" ; /* TODO */
}
else data . l = start + length ;
return o ;
2014-02-12 06:09:42 +00:00
} ;
2014-03-23 21:30:00 +00:00
/* [MS-XLSB] 2.4.676 BrtMergeCell */
var parse _BrtMergeCell = parse _UncheckedRfX ;
2014-04-15 09:04:03 +00:00
/* [MS-XLSB] 2.4.656 BrtHLink */
var parse _BrtHLink = function ( data , length , opts ) {
var end = data . l + length ;
var rfx = parse _UncheckedRfX ( data , 16 ) ;
var relId = parse _XLNullableWideString ( data ) ;
var loc = parse _XLWideString ( data ) ;
var tooltip = parse _XLWideString ( data ) ;
var display = parse _XLWideString ( data ) ;
data . l = end ;
return { rfx : rfx , relId : relId , loc : loc , tooltip : tooltip , display : display } ;
} ;
2014-01-28 16:38:02 +00:00
/* [MS-XLSB] 2.1.7.61 Worksheet */
2014-04-15 09:04:03 +00:00
var parse _ws _bin = function ( data , opts , rels ) {
2014-01-28 16:38:02 +00:00
if ( ! data ) return data ;
2014-04-15 09:04:03 +00:00
if ( ! rels ) rels = { '!id' : { } } ;
2014-01-28 16:38:02 +00:00
var s = { } ;
var ref ;
2014-02-19 03:03:28 +00:00
var refguess = { s : { r : 1000000 , c : 1000000 } , e : { r : 0 , c : 0 } } ;
2014-01-28 16:38:02 +00:00
2014-02-19 03:03:28 +00:00
var pass = false , end = false ;
2014-04-15 09:04:03 +00:00
var row , p , cf , R , C , addr ;
2014-03-23 21:30:00 +00:00
var mergecells = [ ] ;
2014-01-28 16:38:02 +00:00
recordhopper ( data , function ( val , R ) {
2014-02-19 03:03:28 +00:00
if ( end ) return ;
2014-01-28 16:38:02 +00:00
switch ( R . n ) {
case 'BrtWsDim' : ref = val ; break ;
2014-02-19 03:03:28 +00:00
case 'BrtRowHdr' :
row = val ;
if ( opts . sheetRows && opts . sheetRows <= row . r ) end = true ;
break ;
2014-01-28 16:38:02 +00:00
2014-02-12 06:09:42 +00:00
case 'BrtFmlaBool' :
case 'BrtFmlaError' :
2014-01-28 16:38:02 +00:00
case 'BrtFmlaNum' :
2014-02-12 06:09:42 +00:00
case 'BrtFmlaString' :
2014-01-28 16:38:02 +00:00
case 'BrtCellBool' :
case 'BrtCellError' :
case 'BrtCellIsst' :
case 'BrtCellReal' :
case 'BrtCellRk' :
2014-03-19 17:53:20 +00:00
case 'BrtCellSt' :
2014-01-28 16:38:02 +00:00
p = { t : val [ 2 ] } ;
switch ( val [ 2 ] ) {
case 'n' : p . v = val [ 1 ] ; break ;
case 's' : p . v = strs [ val [ 1 ] ] . t ; p . r = strs [ val [ 1 ] ] . r ; break ;
case 'b' : p . v = val [ 1 ] ? true : false ; break ;
case 'e' : p . raw = val [ 1 ] ; p . v = BErr [ p . raw ] ; break ;
2014-02-12 06:09:42 +00:00
case 'str' : p . v = utf8read ( val [ 1 ] ) ; break ;
2014-01-28 16:38:02 +00:00
}
2014-02-13 06:22:42 +00:00
if ( opts . cellFormula && val . length > 3 ) p . f = val [ 3 ] ;
2014-02-07 10:53:40 +00:00
if ( ( cf = styles . CellXf [ val [ 0 ] . iStyleRef ] ) ) try {
p . w = SSF . format ( cf . ifmt , p . v , _ssfopts ) ;
if ( opts . cellNF ) p . z = SSF . _table [ cf . ifmt ] ;
2014-02-15 05:08:18 +00:00
} catch ( e ) { if ( opts . WTF ) throw e ; }
2014-01-28 16:38:02 +00:00
s [ encode _cell ( { c : val [ 0 ] . c , r : row . r } ) ] = p ;
2014-02-19 03:03:28 +00:00
if ( refguess . s . r > row . r ) refguess . s . r = row . r ;
if ( refguess . s . c > val [ 0 ] . c ) refguess . s . c = val [ 0 ] . c ;
if ( refguess . e . r < row . r ) refguess . e . r = row . r ;
if ( refguess . e . c < val [ 0 ] . c ) refguess . e . c = val [ 0 ] . c ;
break ;
2014-01-28 16:38:02 +00:00
2014-03-29 22:53:15 +00:00
case 'BrtCellBlank' : if ( ! opts . sheetStubs ) break ;
p = { t : 'str' , v : undefined } ;
s [ encode _cell ( { c : val [ 0 ] . c , r : row . r } ) ] = p ;
if ( refguess . s . r > row . r ) refguess . s . r = row . r ;
if ( refguess . s . c > val [ 0 ] . c ) refguess . s . c = val [ 0 ] . c ;
if ( refguess . e . r < row . r ) refguess . e . r = row . r ;
if ( refguess . e . c < val [ 0 ] . c ) refguess . e . c = val [ 0 ] . c ;
break ;
2014-01-28 16:38:02 +00:00
2014-03-23 21:30:00 +00:00
/* Merge Cells */
case 'BrtBeginMergeCells' : break ;
case 'BrtEndMergeCells' : break ;
case 'BrtMergeCell' : mergecells . push ( val ) ; break ;
2014-04-15 09:04:03 +00:00
case 'BrtHLink' :
var rel = rels [ '!id' ] [ val . relId ] ;
if ( rel ) {
val . Target = rel . Target ;
if ( val . loc ) val . Target += "#" + val . loc ;
val . Rel = rel ;
}
for ( R = val . rfx . s . r ; R <= val . rfx . e . r ; ++ R ) for ( C = val . rfx . s . c ; C <= val . rfx . e . c ; ++ C ) {
addr = encode _cell ( { c : C , r : R } ) ;
if ( ! s [ addr ] ) s [ addr ] = { t : "str" , v : undefined } ;
s [ addr ] . l = val ;
}
break ;
2014-01-28 16:38:02 +00:00
case 'BrtArrFmla' : break ; // TODO
case 'BrtShrFmla' : break ; // TODO
case 'BrtBeginSheet' : break ;
case 'BrtWsProp' : break ; // TODO
case 'BrtSheetCalcProp' : break ; // TODO
case 'BrtBeginWsViews' : break ; // TODO
case 'BrtBeginWsView' : break ; // TODO
2014-03-19 17:53:20 +00:00
case 'BrtPane' : break ; // TODO
case 'BrtSel' : break ; // TODO
2014-01-28 16:38:02 +00:00
case 'BrtEndWsView' : break ; // TODO
case 'BrtEndWsViews' : break ; // TODO
case 'BrtACBegin' : break ; // TODO
2014-03-19 17:53:20 +00:00
case 'BrtRwDescent' : break ; // TODO
2014-01-28 16:38:02 +00:00
case 'BrtACEnd' : break ; // TODO
case 'BrtWsFmtInfoEx14' : break ; // TODO
case 'BrtWsFmtInfo' : break ; // TODO
case 'BrtBeginColInfos' : break ; // TODO
case 'BrtColInfo' : break ; // TODO
case 'BrtEndColInfos' : break ; // TODO
case 'BrtBeginSheetData' : break ; // TODO
case 'BrtEndSheetData' : break ; // TODO
case 'BrtSheetProtection' : break ; // TODO
case 'BrtPrintOptions' : break ; // TODO
case 'BrtMargins' : break ; // TODO
case 'BrtPageSetup' : break ; // TODO
2014-01-31 11:52:18 +00:00
case 'BrtFRTBegin' : pass = true ; break ;
case 'BrtFRTEnd' : pass = false ; break ;
2014-01-28 16:38:02 +00:00
case 'BrtEndSheet' : break ; // TODO
2014-03-19 17:53:20 +00:00
case 'BrtDrawing' : break ; // TODO
2014-02-13 06:22:42 +00:00
case 'BrtLegacyDrawing' : break ; // TODO
2014-03-29 02:05:50 +00:00
case 'BrtLegacyDrawingHF' : break ; // TODO
2014-03-19 17:53:20 +00:00
case 'BrtPhoneticInfo' : break ; // TODO
case 'BrtBeginHeaderFooter' : break ; // TODO
case 'BrtEndHeaderFooter' : break ; // TODO
case 'BrtBrk' : break ; // TODO
case 'BrtBeginRwBrk' : break ; // TODO
case 'BrtEndRwBrk' : break ; // TODO
case 'BrtBeginColBrk' : break ; // TODO
case 'BrtEndColBrk' : break ; // TODO
case 'BrtBeginUserShViews' : break ; // TODO
case 'BrtBeginUserShView' : break ; // TODO
case 'BrtEndUserShView' : break ; // TODO
case 'BrtEndUserShViews' : break ; // TODO
case 'BrtBkHim' : break ; // TODO
case 'BrtBeginOleObjects' : break ; // TODO
case 'BrtOleObject' : break ; // TODO
case 'BrtEndOleObjects' : break ; // TODO
case 'BrtBeginListParts' : break ; // TODO
case 'BrtListPart' : break ; // TODO
case 'BrtEndListParts' : break ; // TODO
case 'BrtBeginSortState' : break ; // TODO
case 'BrtBeginSortCond' : break ; // TODO
case 'BrtEndSortCond' : break ; // TODO
case 'BrtEndSortState' : break ; // TODO
case 'BrtBeginConditionalFormatting' : break ; // TODO
case 'BrtEndConditionalFormatting' : break ; // TODO
case 'BrtBeginCFRule' : break ; // TODO
case 'BrtEndCFRule' : break ; // TODO
case 'BrtBeginDVals' : break ; // TODO
case 'BrtDVal' : break ; // TODO
case 'BrtEndDVals' : break ; // TODO
case 'BrtRangeProtection' : break ; // TODO
2014-03-29 02:05:50 +00:00
case 'BrtBeginDCon' : break ; // TODO
case 'BrtEndDCon' : break ; // TODO
case 'BrtBeginDRefs' : break ;
case 'BrtDRef' : break ;
case 'BrtEndDRefs' : break ;
2014-03-21 02:44:27 +00:00
/* ActiveX */
case 'BrtBeginActiveXControls' : break ;
case 'BrtActiveX' : break ;
case 'BrtEndActiveXControls' : break ;
/* AutoFilter */
case 'BrtBeginAFilter' : break ;
case 'BrtEndAFilter' : break ;
case 'BrtBeginFilterColumn' : break ;
case 'BrtBeginFilters' : break ;
2014-04-15 09:04:03 +00:00
case 'BrtFilter' : break ;
2014-03-21 02:44:27 +00:00
case 'BrtEndFilters' : break ;
case 'BrtEndFilterColumn' : break ;
case 'BrtDynamicFilter' : break ;
case 'BrtTop10Filter' : break ;
case 'BrtBeginCustomFilters' : break ;
case 'BrtCustomFilter' : break ;
case 'BrtEndCustomFilters' : break ;
2014-03-29 02:05:50 +00:00
/* Cell Watch */
case 'BrtBeginCellWatches' : break ;
case 'BrtCellWatch' : break ;
case 'BrtEndCellWatches' : break ;
/* Table */
case 'BrtTable' : break ;
/* Ignore Cell Errors */
case 'BrtBeginCellIgnoreECs' : break ;
case 'BrtCellIgnoreEC' : break ;
case 'BrtEndCellIgnoreECs' : break ;
2014-03-23 21:30:00 +00:00
default : if ( ! pass || opts . WTF ) throw new Error ( "Unexpected record " + R . n ) ;
2014-01-28 16:38:02 +00:00
}
2014-02-13 06:22:42 +00:00
} , opts ) ;
2014-05-16 00:33:34 +00:00
if ( ! s [ "!ref" ] && ( refguess . s . r < 1000000 || ref . e . r > 0 || ref . e . c > 0 || ref . s . r > 0 || ref . s . c > 0 ) ) s [ "!ref" ] = encode _range ( ref ) ;
2014-03-29 22:53:15 +00:00
if ( opts . sheetRows && s [ "!ref" ] ) {
2014-02-19 03:03:28 +00:00
var tmpref = decode _range ( s [ "!ref" ] ) ;
if ( opts . sheetRows < + tmpref . e . r ) {
tmpref . e . r = opts . sheetRows - 1 ;
if ( tmpref . e . r > refguess . e . r ) tmpref . e . r = refguess . e . r ;
if ( tmpref . e . r < tmpref . s . r ) tmpref . s . r = tmpref . e . r ;
if ( tmpref . e . c > refguess . e . c ) tmpref . e . c = refguess . e . c ;
if ( tmpref . e . c < tmpref . s . c ) tmpref . s . c = tmpref . e . c ;
s [ "!fullref" ] = s [ "!ref" ] ;
s [ "!ref" ] = encode _range ( tmpref ) ;
}
}
2014-03-23 21:30:00 +00:00
if ( mergecells . length > 0 ) s [ "!merges" ] = mergecells ;
2014-01-28 16:38:02 +00:00
return s ;
} ;
2014-05-29 22:30:03 +00:00
function write _CELLTABLE ( ba , ws , idx , opts , wb ) {
var r = decode _range ( ws [ '!ref' ] || "A1" ) ;
write _record ( ba , 'BrtBeginSheetData' ) ;
for ( var i = r . s . r ; i <= r . e . r ; ++ i ) {
/* [ACCELLTABLE] */
/* BrtRowHdr */
/* *16384CELL */
}
write _record ( ba , 'BrtEndSheetData' ) ;
}
var write _ws _bin = function ( idx , opts , wb ) {
var ba = buf _array ( ) ;
var s = wb . SheetNames [ idx ] , ws = wb . Sheets [ s ] || { } ;
var r = decode _range ( ws [ '!ref' ] || "A1" ) ;
write _record ( ba , "BrtBeginSheet" ) ;
/* [BrtWsProp] */
write _record ( ba , "BrtWsDim" , write _BrtWsDim ( r ) ) ;
/* [WSVIEWS2] */
/* [WSFMTINFO] */
/* *COLINFOS */
write _CELLTABLE ( ba , ws , idx , opts , wb ) ;
/* [BrtSheetCalcProp] */
/* [[BrtSheetProtectionIso] BrtSheetProtection] */
/* *([BrtRangeProtectionIso] BrtRangeProtection) */
/* [SCENMAN] */
/* [AUTOFILTER] */
/* [SORTSTATE] */
/* [DCON] */
/* [USERSHVIEWS] */
/* [MERGECELLS] */
/* [BrtPhoneticInfo] */
/* *CONDITIONALFORMATTING */
/* [DVALS] */
/* *BrtHLink */
/* [BrtPrintOptions] */
/* [BrtMargins] */
/* [BrtPageSetup] */
/* [HEADERFOOTER] */
/* [RWBRK] */
/* [COLBRK] */
/* *BrtBigName */
/* [CELLWATCHES] */
/* [IGNOREECS] */
/* [SMARTTAGS] */
/* [BrtDrawing] */
/* [BrtLegacyDrawing] */
/* [BrtLegacyDrawingHF] */
/* [BrtBkHim] */
/* [OLEOBJECTS] */
/* [ACTIVEXCONTROLS] */
/* [WEBPUBITEMS] */
/* [LISTPARTS] */
/* FRTWORKSHEET */
write _record ( ba , "BrtEndSheet" ) ;
return ba . end ( ) ;
} ;
2014-01-28 16:38:02 +00:00
/* 18.2.28 (CT_WorkbookProtection) Defaults */
var WBPropsDef = {
allowRefreshQuery : '0' ,
autoCompressPictures : '1' ,
backupFile : '0' ,
checkCompatibility : '0' ,
codeName : '' ,
date1904 : '0' ,
dateCompatibility : '1' ,
//defaultThemeVersion: '0',
filterPrivacy : '0' ,
hidePivotFieldList : '0' ,
promptedSolutions : '0' ,
publishItems : '0' ,
refreshAllConnections : false ,
saveExternalLinkValues : '1' ,
showBorderUnselectedTables : '1' ,
showInkAnnotation : '1' ,
showObjects : 'all' ,
showPivotChartFilter : '0'
//updateLinks: 'userSet'
} ;
/* 18.2.30 (CT_BookView) Defaults */
var WBViewDef = {
activeTab : '0' ,
autoFilterDateGrouping : '1' ,
firstSheet : '0' ,
minimized : '0' ,
showHorizontalScroll : '1' ,
showSheetTabs : '1' ,
showVerticalScroll : '1' ,
tabRatio : '600' ,
visibility : 'visible'
//window{Height,Width}, {x,y}Window
} ;
/* 18.2.19 (CT_Sheet) Defaults */
var SheetDef = {
state : 'visible'
} ;
/* 18.2.2 (CT_CalcPr) Defaults */
var CalcPrDef = {
calcCompleted : 'true' ,
calcMode : 'auto' ,
calcOnSave : 'true' ,
concurrentCalc : 'true' ,
fullCalcOnLoad : 'false' ,
fullPrecision : 'true' ,
iterate : 'false' ,
iterateCount : '100' ,
iterateDelta : '0.001' ,
refMode : 'A1'
} ;
/* 18.2.3 (CT_CustomWorkbookView) Defaults */
var CustomWBViewDef = {
autoUpdate : 'false' ,
changesSavedWin : 'false' ,
includeHiddenRowCol : 'true' ,
includePrintSettings : 'true' ,
maximized : 'false' ,
minimized : 'false' ,
onlySync : 'false' ,
personalView : 'false' ,
showComments : 'commIndicator' ,
showFormulaBar : 'true' ,
showHorizontalScroll : 'true' ,
showObjects : 'all' ,
showSheetTabs : 'true' ,
showStatusbar : 'true' ,
showVerticalScroll : 'true' ,
tabRatio : '600' ,
xWindow : '0' ,
yWindow : '0'
} ;
/* 18.2 Workbook */
2014-02-07 10:53:40 +00:00
function parse _wb _xml ( data ) {
2014-01-28 16:38:02 +00:00
var wb = { AppVersion : { } , WBProps : { } , WBView : [ ] , Sheets : [ ] , CalcPr : { } , xmlns : "" } ;
2014-04-03 22:51:54 +00:00
var pass = false , xmlns = "xmlns" ;
2014-01-28 16:38:02 +00:00
data . match ( /<[^>]*>/g ) . forEach ( function ( x ) {
var y = parsexmltag ( x ) ;
2014-04-03 22:51:54 +00:00
switch ( y [ 0 ] . replace ( /<\w+:/ , "<" ) ) {
2014-01-28 16:38:02 +00:00
case '<?xml' : break ;
/* 18.2.27 workbook CT_Workbook 1 */
2014-04-03 22:51:54 +00:00
case '<workbook' :
if ( x . match ( /<\w+:workbook/ ) ) xmlns = "xmlns" + x . match ( /<(\w+):/ ) [ 1 ] ;
wb . xmlns = y [ xmlns ] ;
break ;
2014-01-28 16:38:02 +00:00
case '</workbook>' : break ;
/* 18.2.13 fileVersion CT_FileVersion ? */
case '<fileVersion' : delete y [ 0 ] ; wb . AppVersion = y ; break ;
case '<fileVersion/>' : break ;
/* 18.2.12 fileSharing CT_FileSharing ? */
case '<fileSharing' : case '<fileSharing/>' : break ;
/* 18.2.28 workbookPr CT_WorkbookPr ? */
case '<workbookPr' : delete y [ 0 ] ; wb . WBProps = y ; break ;
case '<workbookPr/>' : delete y [ 0 ] ; wb . WBProps = y ; break ;
/* 18.2.29 workbookProtection CT_WorkbookProtection ? */
case '<workbookProtection/>' : break ;
/* 18.2.1 bookViews CT_BookViews ? */
case '<bookViews>' : case '</bookViews>' : break ;
/* 18.2.30 workbookView CT_BookView + */
case '<workbookView' : delete y [ 0 ] ; wb . WBView . push ( y ) ; break ;
/* 18.2.20 sheets CT_Sheets 1 */
case '<sheets>' : case '</sheets>' : break ; // aggregate sheet
/* 18.2.19 sheet CT_Sheet + */
case '<sheet' : delete y [ 0 ] ; y . name = utf8read ( y . name ) ; wb . Sheets . push ( y ) ; break ;
/* 18.2.15 functionGroups CT_FunctionGroups ? */
case '<functionGroups' : case '<functionGroups/>' : break ;
/* 18.2.14 functionGroup CT_FunctionGroup + */
case '<functionGroup' : break ;
/* 18.2.9 externalReferences CT_ExternalReferences ? */
case '<externalReferences' : case '</externalReferences>' : break ;
/* 18.2.8 externalReference CT_ExternalReference + */
case '<externalReference' : break ;
/* 18.2.6 definedNames CT_DefinedNames ? */
case '<definedNames/>' : break ;
case '<definedNames>' : pass = true ; break ;
case '</definedNames>' : pass = false ; break ;
/* 18.2.5 definedName CT_DefinedName + */
case '<definedName' : case '<definedName/>' : case '</definedName>' : break ;
/* 18.2.2 calcPr CT_CalcPr ? */
case '<calcPr' : delete y [ 0 ] ; wb . CalcPr = y ; break ;
case '<calcPr/>' : delete y [ 0 ] ; wb . CalcPr = y ; break ;
/* 18.2.16 oleSize CT_OleSize ? (ref required) */
case '<oleSize' : break ;
/* 18.2.4 customWorkbookViews CT_CustomWorkbookViews ? */
case '<customWorkbookViews>' : case '</customWorkbookViews>' : case '<customWorkbookViews' : break ;
/* 18.2.3 customWorkbookView CT_CustomWorkbookView + */
case '<customWorkbookView' : case '</customWorkbookView>' : break ;
/* 18.2.18 pivotCaches CT_PivotCaches ? */
case '<pivotCaches>' : case '</pivotCaches>' : case '<pivotCaches' : break ;
/* 18.2.17 pivotCache CT_PivotCache ? */
case '<pivotCache' : break ;
/* 18.2.21 smartTagPr CT_SmartTagPr ? */
case '<smartTagPr' : case '<smartTagPr/>' : break ;
/* 18.2.23 smartTagTypes CT_SmartTagTypes ? */
case '<smartTagTypes' : case '<smartTagTypes>' : case '</smartTagTypes>' : break ;
/* 18.2.22 smartTagType CT_SmartTagType ? */
case '<smartTagType' : break ;
/* 18.2.24 webPublishing CT_WebPublishing ? */
case '<webPublishing' : case '<webPublishing/>' : break ;
/* 18.2.11 fileRecoveryPr CT_FileRecoveryPr ? */
case '<fileRecoveryPr' : case '<fileRecoveryPr/>' : break ;
/* 18.2.26 webPublishObjects CT_WebPublishObjects ? */
case '<webPublishObjects>' : case '<webPublishObjects' : case '</webPublishObjects>' : break ;
/* 18.2.25 webPublishObject CT_WebPublishObject ? */
case '<webPublishObject' : break ;
/* 18.2.10 extLst CT_ExtensionList ? */
case '<extLst>' : case '</extLst>' : case '<extLst/>' : break ;
/* 18.2.7 ext CT_Extension + */
case '<ext' : pass = true ; break ; //TODO: check with versions of excel
case '</ext>' : pass = false ; break ;
/* Others */
case '<mx:ArchID' : break ;
case '<mc:AlternateContent' : pass = true ; break ;
case '</mc:AlternateContent>' : pass = false ; break ;
}
} ) ;
2014-05-16 00:33:34 +00:00
if ( XMLNS . main . indexOf ( wb . xmlns ) === - 1 ) throw new Error ( "Unknown Namespace: " + wb . xmlns ) ;
2014-01-28 16:38:02 +00:00
var z ;
/* defaults */
for ( z in WBPropsDef ) if ( typeof wb . WBProps [ z ] === 'undefined' ) wb . WBProps [ z ] = WBPropsDef [ z ] ;
for ( z in CalcPrDef ) if ( typeof wb . CalcPr [ z ] === 'undefined' ) wb . CalcPr [ z ] = CalcPrDef [ z ] ;
wb . WBView . forEach ( function ( w ) { for ( var z in WBViewDef ) if ( typeof w [ z ] === 'undefined' ) w [ z ] = WBViewDef [ z ] ; } ) ;
wb . Sheets . forEach ( function ( w ) { for ( var z in SheetDef ) if ( typeof w [ z ] === 'undefined' ) w [ z ] = SheetDef [ z ] ; } ) ;
_ssfopts . date1904 = parsexmlbool ( wb . WBProps . date1904 , 'date1904' ) ;
return wb ;
}
2014-05-16 00:33:34 +00:00
var WB _XML _ROOT = writextag ( 'workbook' , null , {
'xmlns' : XMLNS . main [ 0 ] ,
//'xmlns:mx': XMLNS.mx,
//'xmlns:s': XMLNS.main[0],
'xmlns:r' : XMLNS . r
} ) ;
var write _wb _xml = function ( wb , opts ) {
var o = [ ] ;
o . push ( XML _HEADER ) ;
o . push ( WB _XML _ROOT ) ;
/* TODO: put this somewhere else */
var date1904 = "false" ;
try { date1904 = parsexmlbool ( wb . Workbook . WBProps . date1904 ) ? "true" : "false" ; } catch ( e ) { date1904 = "false" ; }
o . push ( writextag ( 'workbookPr' , null , { date1904 : date1904 } ) ) ;
o . push ( "<sheets>" ) ;
var i = 1 ;
wb . SheetNames . forEach ( function ( s ) {
2014-05-31 15:44:56 +00:00
o . push ( writextag ( 'sheet' , null , { name : s . substr ( 0 , 31 ) , sheetId : String ( i ) , "r:id" : "rId" + i } ) ) ;
2014-05-16 00:33:34 +00:00
++ i ;
} ) ;
o . push ( "</sheets>" ) ;
if ( o . length > 2 ) { o . push ( '</workbook>' ) ; o [ 1 ] = o [ 1 ] . replace ( "/>" , ">" ) ; }
return o . join ( "" ) ;
} ;
2014-01-28 16:38:02 +00:00
/* [MS-XLSB] 2.4.301 BrtBundleSh */
var parse _BrtBundleSh = function ( data , length ) {
var z = { } ;
z . hsState = data . read _shift ( 4 ) ; //ST_SheetState
z . iTabID = data . read _shift ( 4 ) ;
z . strRelID = parse _RelID ( data , length - 8 ) ;
z . name = parse _XLWideString ( data ) ;
return z ;
} ;
2014-05-29 22:30:03 +00:00
var write _BrtBundleSh = function ( data , o ) {
if ( ! o ) o = new _buf ( 127 ) ;
o . write _shift ( 4 , data . hsState ) ;
o . write _shift ( 4 , data . iTabID ) ;
write _RelID ( data . strRelID , o ) ;
2014-05-31 15:44:56 +00:00
write _XLWideString ( data . name . substr ( 0 , 31 ) , o ) ;
2014-05-29 22:30:03 +00:00
return o ;
} ;
/* [MS-XLSB] 2.4.807 BrtWbProp */
var parse _BrtWbProp = function ( data , length ) {
data . read _shift ( 4 ) ;
var dwThemeVersion = data . read _shift ( 4 ) ;
var strName = ( length > 8 ) ? parse _XLWideString ( data ) : "" ;
return [ dwThemeVersion , strName ] ;
} ;
var write _BrtWbProp = function ( data , o ) {
if ( ! o ) o = new _buf ( 8 ) ;
o . write _shift ( 4 , 0 ) ;
o . write _shift ( 4 , 0 ) ;
return o ;
} ;
var parse _BrtFRTArchID$ = function ( data , length ) {
var o = { } ;
data . read _shift ( 4 ) ;
o . ArchID = data . read _shift ( 4 ) ;
data . l += length - 8 ;
return o ;
} ;
2014-01-28 16:38:02 +00:00
/* [MS-XLSB] 2.1.7.60 Workbook */
2014-03-23 21:30:00 +00:00
var parse _wb _bin = function ( data , opts ) {
2014-01-28 16:38:02 +00:00
var wb = { AppVersion : { } , WBProps : { } , WBView : [ ] , Sheets : [ ] , CalcPr : { } , xmlns : "" } ;
2014-01-29 06:00:09 +00:00
var pass = false , z ;
2014-01-28 16:38:02 +00:00
recordhopper ( data , function ( val , R ) {
switch ( R . n ) {
case 'BrtBundleSh' : wb . Sheets . push ( val ) ; break ;
case 'BrtBeginBook' : break ;
case 'BrtFileVersion' : break ;
case 'BrtWbProp' : break ;
2014-02-17 08:44:22 +00:00
case 'BrtACBegin' : break ;
case 'BrtAbsPath15' : break ;
case 'BrtACEnd' : break ;
/*case 'BrtBookProtectionIso': break;*/
case 'BrtBookProtection' : break ;
2014-01-28 16:38:02 +00:00
case 'BrtBeginBookViews' : break ;
case 'BrtBookView' : break ;
case 'BrtEndBookViews' : break ;
case 'BrtBeginBundleShs' : break ;
case 'BrtEndBundleShs' : break ;
2014-02-14 06:25:46 +00:00
case 'BrtBeginFnGroup' : break ;
case 'BrtEndFnGroup' : break ;
case 'BrtBeginExternals' : break ;
case 'BrtSupSelf' : break ;
2014-02-17 08:44:22 +00:00
case 'BrtSupBookSrc' : break ;
2014-02-14 06:25:46 +00:00
case 'BrtExternSheet' : break ;
case 'BrtEndExternals' : break ;
2014-01-28 16:38:02 +00:00
case 'BrtName' : break ;
case 'BrtCalcProp' : break ;
2014-02-17 08:44:22 +00:00
case 'BrtUserBookView' : break ;
2014-01-28 16:38:02 +00:00
case 'BrtBeginPivotCacheIDs' : break ;
case 'BrtBeginPivotCacheID' : break ;
case 'BrtEndPivotCacheID' : break ;
case 'BrtEndPivotCacheIDs' : break ;
2014-02-17 08:44:22 +00:00
case 'BrtWebOpt' : break ;
2014-01-28 16:38:02 +00:00
case 'BrtFileRecover' : break ;
2014-03-29 02:05:50 +00:00
case 'BrtFileSharing' : break ;
2014-02-17 08:44:22 +00:00
/ * c a s e ' B r t B e g i n W e b P u b I t e m s ' : b r e a k ;
case 'BrtBeginWebPubItem' : break ;
case 'BrtEndWebPubItem' : break ;
case 'BrtEndWebPubItems' : break ; * /
2014-01-28 16:38:02 +00:00
case 'BrtFRTBegin' : pass = true ; break ;
2014-05-29 22:30:03 +00:00
case 'BrtFRTArchID$' : break ;
2014-01-28 16:38:02 +00:00
case 'BrtFRTEnd' : pass = false ; break ;
case 'BrtEndBook' : break ;
2014-03-19 17:53:20 +00:00
default : if ( ! pass ) throw new Error ( "Unexpected record " + R . n ) ;
2014-01-28 16:38:02 +00:00
}
} ) ;
/* defaults */
for ( z in WBPropsDef ) if ( typeof wb . WBProps [ z ] === 'undefined' ) wb . WBProps [ z ] = WBPropsDef [ z ] ;
for ( z in CalcPrDef ) if ( typeof wb . CalcPr [ z ] === 'undefined' ) wb . CalcPr [ z ] = CalcPrDef [ z ] ;
wb . WBView . forEach ( function ( w ) { for ( var z in WBViewDef ) if ( typeof w [ z ] === 'undefined' ) w [ z ] = WBViewDef [ z ] ; } ) ;
wb . Sheets . forEach ( function ( w ) { for ( var z in SheetDef ) if ( typeof w [ z ] === 'undefined' ) w [ z ] = SheetDef [ z ] ; } ) ;
_ssfopts . date1904 = parsexmlbool ( wb . WBProps . date1904 , 'date1904' ) ;
return wb ;
2014-01-29 06:00:09 +00:00
} ;
2014-05-16 00:33:34 +00:00
2014-05-29 22:30:03 +00:00
/* [MS-XLSB] 2.1.7.60 Workbook */
function write _BUNDLESHS ( ba , wb , opts ) {
write _record ( ba , "BrtBeginBundleShs" ) ;
wb . SheetNames . forEach ( function ( s , idx ) {
var d = { hsState : 0 , iTabID : idx + 1 , strRelID : 'rId' + ( idx + 1 ) , name : s } ;
write _record ( ba , "BrtBundleSh" , write _BrtBundleSh ( d ) ) ;
} ) ;
write _record ( ba , "BrtEndBundleShs" ) ;
}
/* [MS-XLSB] 2.4.643 BrtFileVersion */
function write _BrtFileVersion ( data , o ) {
if ( ! o ) o = new _buf ( 127 ) ;
for ( var i = 0 ; i != 4 ; ++ i ) o . write _shift ( 4 , 0 ) ;
write _XLWideString ( "SheetJS" , o ) ;
write _XLWideString ( XLSX . version , o ) ;
write _XLWideString ( XLSX . version , o ) ;
write _XLWideString ( "7262" , o ) ;
o . length = o . l ;
return o ;
}
/* [MS-XLSB] 2.1.7.60 Workbook */
function write _BOOKVIEWS ( ba , wb , opts ) {
write _record ( ba , "BrtBeginBookViews" ) ;
/* 1*(BrtBookView *FRT) */
write _record ( ba , "BrtEndBookViews" ) ;
}
/* [MS-XLSB] 2.4.302 BrtCalcProp */
function write _BrtCalcProp ( data , o ) {
if ( ! o ) o = new _buf ( 26 ) ;
o . write _shift ( 4 , 0 ) ; /* force recalc */
o . write _shift ( 4 , 1 ) ;
o . write _shift ( 4 , 0 ) ;
write _Xnum ( 0 , o ) ;
o . write _shift ( - 4 , 1023 ) ;
o . write _shift ( 1 , 0x33 ) ;
o . write _shift ( 1 , 0x00 ) ;
return o ;
}
function write _BrtFileRecover ( data , o ) {
if ( ! o ) o = new _buf ( 1 ) ;
o . write _shift ( 1 , 0 ) ;
return o ;
}
2014-05-16 00:33:34 +00:00
2014-05-29 22:30:03 +00:00
/* [MS-XLSB] 2.1.7.60 Workbook */
var write _wb _bin = function ( wb , opts ) {
var ba = buf _array ( ) ;
write _record ( ba , "BrtBeginBook" ) ;
write _record ( ba , "BrtFileVersion" , write _BrtFileVersion ( ) ) ;
/* [[BrtFileSharingIso] BrtFileSharing] */
write _record ( ba , "BrtWbProp" , write _BrtWbProp ( ) ) ;
/* [ACABSPATH] */
/* [[BrtBookProtectionIso] BrtBookProtection] */
write _BOOKVIEWS ( ba , wb , opts ) ;
write _BUNDLESHS ( ba , wb , opts ) ;
/* [FNGROUP] */
/* [EXTERNALS] */
/* *BrtName */
write _record ( ba , "BrtCalcProp" , write _BrtCalcProp ( ) ) ;
/* [BrtOleSize] */
/* *(BrtUserBookView *FRT) */
/* [PIVOTCACHEIDS] */
/* [BrtWbFactoid] */
/* [SMARTTAGTYPES] */
/* [BrtWebOpt] */
write _record ( ba , "BrtFileRecover" , write _BrtFileRecover ( ) ) ;
/* [WEBPUBITEMS] */
/* [CRERRS] */
/* FRTWORKBOOK */
write _record ( ba , "BrtEndBook" ) ;
return ba . end ( ) ;
2014-05-16 00:33:34 +00:00
} ;
2014-02-07 10:53:40 +00:00
function parse _wb ( data , name , opts ) {
2014-05-16 00:33:34 +00:00
return ( name . substr ( - 4 ) === ".bin" ? parse _wb _bin : parse _wb _xml ) ( data , opts ) ;
2013-11-06 06:05:32 +00:00
}
2014-04-15 09:04:03 +00:00
function parse _ws ( data , name , opts , rels ) {
2014-05-16 00:33:34 +00:00
return ( name . substr ( - 4 ) === ".bin" ? parse _ws _bin : parse _ws _xml ) ( data , opts , rels ) ;
2014-01-28 16:38:02 +00:00
}
2014-02-07 10:53:40 +00:00
function parse _sty ( data , name , opts ) {
2014-05-16 00:33:34 +00:00
return ( name . substr ( - 4 ) === ".bin" ? parse _sty _bin : parse _sty _xml ) ( data , opts ) ;
2014-01-28 16:38:02 +00:00
}
2014-02-12 06:09:42 +00:00
2014-05-29 06:18:23 +00:00
function parse _theme ( data , name , opts ) {
return parse _theme _xml ( data , opts ) ;
}
2014-02-12 06:09:42 +00:00
function parse _sst ( data , name , opts ) {
2014-05-16 00:33:34 +00:00
return ( name . substr ( - 4 ) === ".bin" ? parse _sst _bin : parse _sst _xml ) ( data , opts ) ;
2014-02-12 06:09:42 +00:00
}
2014-03-29 02:05:50 +00:00
function parse _cmnt ( data , name , opts ) {
2014-05-16 00:33:34 +00:00
return ( name . substr ( - 4 ) === ".bin" ? parse _comments _bin : parse _comments _xml ) ( data , opts ) ;
2014-03-29 02:05:50 +00:00
}
2014-03-29 22:53:15 +00:00
function parse _cc ( data , name , opts ) {
2014-05-16 00:33:34 +00:00
return ( name . substr ( - 4 ) === ".bin" ? parse _cc _bin : parse _cc _xml ) ( data , opts ) ;
2014-03-29 22:53:15 +00:00
}
2014-05-16 00:33:34 +00:00
function write _wb ( wb , name , opts ) {
return ( name . substr ( - 4 ) === ".bin" ? write _wb _bin : write _wb _xml ) ( wb , opts ) ;
}
function write _ws ( data , name , opts , wb ) {
return ( name . substr ( - 4 ) === ".bin" ? write _ws _bin : write _ws _xml ) ( data , opts , wb ) ;
}
function write _sty ( data , name , opts ) {
return ( name . substr ( - 4 ) === ".bin" ? write _sty _bin : write _sty _xml ) ( data , opts ) ;
}
function write _sst ( data , name , opts ) {
return ( name . substr ( - 4 ) === ".bin" ? write _sst _bin : write _sst _xml ) ( data , opts ) ;
}
/ *
function write _cmnt ( data , name , opts ) {
return ( name . substr ( - 4 ) === ".bin" ? write _comments _bin : write _comments _xml ) ( data , opts ) ;
}
function write _cc ( data , name , opts ) {
return ( name . substr ( - 4 ) === ".bin" ? write _cc _bin : write _cc _xml ) ( data , opts ) ;
}
* /
2014-01-28 16:38:02 +00:00
/* [MS-XLSB] 2.3 Record Enumeration */
var RecordEnum = {
0x0000 : { n : "BrtRowHdr" , f : parse _BrtRowHdr } ,
0x0001 : { n : "BrtCellBlank" , f : parse _BrtCellBlank } ,
0x0002 : { n : "BrtCellRk" , f : parse _BrtCellRk } ,
0x0003 : { n : "BrtCellError" , f : parse _BrtCellError } ,
0x0004 : { n : "BrtCellBool" , f : parse _BrtCellBool } ,
0x0005 : { n : "BrtCellReal" , f : parse _BrtCellReal } ,
0x0006 : { n : "BrtCellSt" , f : parse _BrtCellSt } ,
0x0007 : { n : "BrtCellIsst" , f : parse _BrtCellIsst } ,
0x0008 : { n : "BrtFmlaString" , f : parse _BrtFmlaString } ,
0x0009 : { n : "BrtFmlaNum" , f : parse _BrtFmlaNum } ,
0x000A : { n : "BrtFmlaBool" , f : parse _BrtFmlaBool } ,
0x000B : { n : "BrtFmlaError" , f : parse _BrtFmlaError } ,
2014-05-29 22:30:03 +00:00
0x0010 : { n : "BrtFRTArchID$" , f : parse _BrtFRTArchID$ } ,
2014-01-28 16:38:02 +00:00
0x0013 : { n : "BrtSSTItem" , f : parse _RichStr } ,
0x0014 : { n : "BrtPCDIMissing" , f : parsenoop } ,
0x0015 : { n : "BrtPCDINumber" , f : parsenoop } ,
0x0016 : { n : "BrtPCDIBoolean" , f : parsenoop } ,
0x0017 : { n : "BrtPCDIError" , f : parsenoop } ,
0x0018 : { n : "BrtPCDIString" , f : parsenoop } ,
0x0019 : { n : "BrtPCDIDatetime" , f : parsenoop } ,
0x001A : { n : "BrtPCDIIndex" , f : parsenoop } ,
0x001B : { n : "BrtPCDIAMissing" , f : parsenoop } ,
0x001C : { n : "BrtPCDIANumber" , f : parsenoop } ,
0x001D : { n : "BrtPCDIABoolean" , f : parsenoop } ,
0x001E : { n : "BrtPCDIAError" , f : parsenoop } ,
0x001F : { n : "BrtPCDIAString" , f : parsenoop } ,
0x0020 : { n : "BrtPCDIADatetime" , f : parsenoop } ,
0x0021 : { n : "BrtPCRRecord" , f : parsenoop } ,
0x0022 : { n : "BrtPCRRecordDt" , f : parsenoop } ,
0x0023 : { n : "BrtFRTBegin" , f : parsenoop } ,
0x0024 : { n : "BrtFRTEnd" , f : parsenoop } ,
0x0025 : { n : "BrtACBegin" , f : parsenoop } ,
0x0026 : { n : "BrtACEnd" , f : parsenoop } ,
0x0027 : { n : "BrtName" , f : parsenoop } ,
0x0028 : { n : "BrtIndexRowBlock" , f : parsenoop } ,
0x002A : { n : "BrtIndexBlock" , f : parsenoop } ,
2014-03-29 02:05:50 +00:00
0x002B : { n : "BrtFont" , f : parse _BrtFont } ,
2014-01-31 11:52:18 +00:00
0x002C : { n : "BrtFmt" , f : parse _BrtFmt } ,
2014-01-28 16:38:02 +00:00
0x002D : { n : "BrtFill" , f : parsenoop } ,
0x002E : { n : "BrtBorder" , f : parsenoop } ,
2014-01-31 11:52:18 +00:00
0x002F : { n : "BrtXF" , f : parse _BrtXF } ,
2014-01-28 16:38:02 +00:00
0x0030 : { n : "BrtStyle" , f : parsenoop } ,
0x0031 : { n : "BrtCellMeta" , f : parsenoop } ,
0x0032 : { n : "BrtValueMeta" , f : parsenoop } ,
0x0033 : { n : "BrtMdb" , f : parsenoop } ,
0x0034 : { n : "BrtBeginFmd" , f : parsenoop } ,
0x0035 : { n : "BrtEndFmd" , f : parsenoop } ,
0x0036 : { n : "BrtBeginMdx" , f : parsenoop } ,
0x0037 : { n : "BrtEndMdx" , f : parsenoop } ,
0x0038 : { n : "BrtBeginMdxTuple" , f : parsenoop } ,
0x0039 : { n : "BrtEndMdxTuple" , f : parsenoop } ,
0x003A : { n : "BrtMdxMbrIstr" , f : parsenoop } ,
0x003B : { n : "BrtStr" , f : parsenoop } ,
0x003C : { n : "BrtColInfo" , f : parsenoop } ,
0x003E : { n : "BrtCellRString" , f : parsenoop } ,
2014-03-29 22:53:15 +00:00
0x003F : { n : "BrtCalcChainItem$" , f : parse _BrtCalcChainItem$ } ,
2014-01-28 16:38:02 +00:00
0x0040 : { n : "BrtDVal" , f : parsenoop } ,
0x0041 : { n : "BrtSxvcellNum" , f : parsenoop } ,
0x0042 : { n : "BrtSxvcellStr" , f : parsenoop } ,
0x0043 : { n : "BrtSxvcellBool" , f : parsenoop } ,
0x0044 : { n : "BrtSxvcellErr" , f : parsenoop } ,
0x0045 : { n : "BrtSxvcellDate" , f : parsenoop } ,
0x0046 : { n : "BrtSxvcellNil" , f : parsenoop } ,
0x0080 : { n : "BrtFileVersion" , f : parsenoop } ,
0x0081 : { n : "BrtBeginSheet" , f : parsenoop } ,
0x0082 : { n : "BrtEndSheet" , f : parsenoop } ,
2014-05-29 22:30:03 +00:00
0x0083 : { n : "BrtBeginBook" , f : parsenoop , p : 0 } ,
2014-01-28 16:38:02 +00:00
0x0084 : { n : "BrtEndBook" , f : parsenoop } ,
0x0085 : { n : "BrtBeginWsViews" , f : parsenoop } ,
0x0086 : { n : "BrtEndWsViews" , f : parsenoop } ,
0x0087 : { n : "BrtBeginBookViews" , f : parsenoop } ,
0x0088 : { n : "BrtEndBookViews" , f : parsenoop } ,
0x0089 : { n : "BrtBeginWsView" , f : parsenoop } ,
0x008A : { n : "BrtEndWsView" , f : parsenoop } ,
0x008B : { n : "BrtBeginCsViews" , f : parsenoop } ,
0x008C : { n : "BrtEndCsViews" , f : parsenoop } ,
0x008D : { n : "BrtBeginCsView" , f : parsenoop } ,
0x008E : { n : "BrtEndCsView" , f : parsenoop } ,
0x008F : { n : "BrtBeginBundleShs" , f : parsenoop } ,
0x0090 : { n : "BrtEndBundleShs" , f : parsenoop } ,
0x0091 : { n : "BrtBeginSheetData" , f : parsenoop } ,
0x0092 : { n : "BrtEndSheetData" , f : parsenoop } ,
0x0093 : { n : "BrtWsProp" , f : parse _BrtWsProp } ,
2014-05-29 22:30:03 +00:00
0x0094 : { n : "BrtWsDim" , f : parse _BrtWsDim , p : 16 } ,
2014-01-28 16:38:02 +00:00
0x0097 : { n : "BrtPane" , f : parsenoop } ,
0x0098 : { n : "BrtSel" , f : parsenoop } ,
2014-05-29 22:30:03 +00:00
0x0099 : { n : "BrtWbProp" , f : parse _BrtWbProp } ,
2014-01-28 16:38:02 +00:00
0x009A : { n : "BrtWbFactoid" , f : parsenoop } ,
0x009B : { n : "BrtFileRecover" , f : parsenoop } ,
0x009C : { n : "BrtBundleSh" , f : parse _BrtBundleSh } ,
0x009D : { n : "BrtCalcProp" , f : parsenoop } ,
0x009E : { n : "BrtBookView" , f : parsenoop } ,
0x009F : { n : "BrtBeginSst" , f : parse _BrtBeginSst } ,
0x00A0 : { n : "BrtEndSst" , f : parsenoop } ,
0x00A1 : { n : "BrtBeginAFilter" , f : parsenoop } ,
0x00A2 : { n : "BrtEndAFilter" , f : parsenoop } ,
0x00A3 : { n : "BrtBeginFilterColumn" , f : parsenoop } ,
0x00A4 : { n : "BrtEndFilterColumn" , f : parsenoop } ,
0x00A5 : { n : "BrtBeginFilters" , f : parsenoop } ,
0x00A6 : { n : "BrtEndFilters" , f : parsenoop } ,
0x00A7 : { n : "BrtFilter" , f : parsenoop } ,
0x00A8 : { n : "BrtColorFilter" , f : parsenoop } ,
0x00A9 : { n : "BrtIconFilter" , f : parsenoop } ,
0x00AA : { n : "BrtTop10Filter" , f : parsenoop } ,
0x00AB : { n : "BrtDynamicFilter" , f : parsenoop } ,
0x00AC : { n : "BrtBeginCustomFilters" , f : parsenoop } ,
0x00AD : { n : "BrtEndCustomFilters" , f : parsenoop } ,
0x00AE : { n : "BrtCustomFilter" , f : parsenoop } ,
0x00AF : { n : "BrtAFilterDateGroupItem" , f : parsenoop } ,
2014-03-23 21:30:00 +00:00
0x00B0 : { n : "BrtMergeCell" , f : parse _BrtMergeCell } ,
2014-01-28 16:38:02 +00:00
0x00B1 : { n : "BrtBeginMergeCells" , f : parsenoop } ,
0x00B2 : { n : "BrtEndMergeCells" , f : parsenoop } ,
0x00B3 : { n : "BrtBeginPivotCacheDef" , f : parsenoop } ,
0x00B4 : { n : "BrtEndPivotCacheDef" , f : parsenoop } ,
0x00B5 : { n : "BrtBeginPCDFields" , f : parsenoop } ,
0x00B6 : { n : "BrtEndPCDFields" , f : parsenoop } ,
0x00B7 : { n : "BrtBeginPCDField" , f : parsenoop } ,
0x00B8 : { n : "BrtEndPCDField" , f : parsenoop } ,
0x00B9 : { n : "BrtBeginPCDSource" , f : parsenoop } ,
0x00BA : { n : "BrtEndPCDSource" , f : parsenoop } ,
0x00BB : { n : "BrtBeginPCDSRange" , f : parsenoop } ,
0x00BC : { n : "BrtEndPCDSRange" , f : parsenoop } ,
0x00BD : { n : "BrtBeginPCDFAtbl" , f : parsenoop } ,
0x00BE : { n : "BrtEndPCDFAtbl" , f : parsenoop } ,
0x00BF : { n : "BrtBeginPCDIRun" , f : parsenoop } ,
0x00C0 : { n : "BrtEndPCDIRun" , f : parsenoop } ,
0x00C1 : { n : "BrtBeginPivotCacheRecords" , f : parsenoop } ,
0x00C2 : { n : "BrtEndPivotCacheRecords" , f : parsenoop } ,
0x00C3 : { n : "BrtBeginPCDHierarchies" , f : parsenoop } ,
0x00C4 : { n : "BrtEndPCDHierarchies" , f : parsenoop } ,
0x00C5 : { n : "BrtBeginPCDHierarchy" , f : parsenoop } ,
0x00C6 : { n : "BrtEndPCDHierarchy" , f : parsenoop } ,
0x00C7 : { n : "BrtBeginPCDHFieldsUsage" , f : parsenoop } ,
0x00C8 : { n : "BrtEndPCDHFieldsUsage" , f : parsenoop } ,
0x00C9 : { n : "BrtBeginExtConnection" , f : parsenoop } ,
0x00CA : { n : "BrtEndExtConnection" , f : parsenoop } ,
0x00CB : { n : "BrtBeginECDbProps" , f : parsenoop } ,
0x00CC : { n : "BrtEndECDbProps" , f : parsenoop } ,
0x00CD : { n : "BrtBeginECOlapProps" , f : parsenoop } ,
0x00CE : { n : "BrtEndECOlapProps" , f : parsenoop } ,
0x00CF : { n : "BrtBeginPCDSConsol" , f : parsenoop } ,
0x00D0 : { n : "BrtEndPCDSConsol" , f : parsenoop } ,
0x00D1 : { n : "BrtBeginPCDSCPages" , f : parsenoop } ,
0x00D2 : { n : "BrtEndPCDSCPages" , f : parsenoop } ,
0x00D3 : { n : "BrtBeginPCDSCPage" , f : parsenoop } ,
0x00D4 : { n : "BrtEndPCDSCPage" , f : parsenoop } ,
0x00D5 : { n : "BrtBeginPCDSCPItem" , f : parsenoop } ,
0x00D6 : { n : "BrtEndPCDSCPItem" , f : parsenoop } ,
0x00D7 : { n : "BrtBeginPCDSCSets" , f : parsenoop } ,
0x00D8 : { n : "BrtEndPCDSCSets" , f : parsenoop } ,
0x00D9 : { n : "BrtBeginPCDSCSet" , f : parsenoop } ,
0x00DA : { n : "BrtEndPCDSCSet" , f : parsenoop } ,
0x00DB : { n : "BrtBeginPCDFGroup" , f : parsenoop } ,
0x00DC : { n : "BrtEndPCDFGroup" , f : parsenoop } ,
0x00DD : { n : "BrtBeginPCDFGItems" , f : parsenoop } ,
0x00DE : { n : "BrtEndPCDFGItems" , f : parsenoop } ,
0x00DF : { n : "BrtBeginPCDFGRange" , f : parsenoop } ,
0x00E0 : { n : "BrtEndPCDFGRange" , f : parsenoop } ,
0x00E1 : { n : "BrtBeginPCDFGDiscrete" , f : parsenoop } ,
0x00E2 : { n : "BrtEndPCDFGDiscrete" , f : parsenoop } ,
0x00E3 : { n : "BrtBeginPCDSDTupleCache" , f : parsenoop } ,
0x00E4 : { n : "BrtEndPCDSDTupleCache" , f : parsenoop } ,
0x00E5 : { n : "BrtBeginPCDSDTCEntries" , f : parsenoop } ,
0x00E6 : { n : "BrtEndPCDSDTCEntries" , f : parsenoop } ,
0x00E7 : { n : "BrtBeginPCDSDTCEMembers" , f : parsenoop } ,
0x00E8 : { n : "BrtEndPCDSDTCEMembers" , f : parsenoop } ,
0x00E9 : { n : "BrtBeginPCDSDTCEMember" , f : parsenoop } ,
0x00EA : { n : "BrtEndPCDSDTCEMember" , f : parsenoop } ,
0x00EB : { n : "BrtBeginPCDSDTCQueries" , f : parsenoop } ,
0x00EC : { n : "BrtEndPCDSDTCQueries" , f : parsenoop } ,
0x00ED : { n : "BrtBeginPCDSDTCQuery" , f : parsenoop } ,
0x00EE : { n : "BrtEndPCDSDTCQuery" , f : parsenoop } ,
0x00EF : { n : "BrtBeginPCDSDTCSets" , f : parsenoop } ,
0x00F0 : { n : "BrtEndPCDSDTCSets" , f : parsenoop } ,
0x00F1 : { n : "BrtBeginPCDSDTCSet" , f : parsenoop } ,
0x00F2 : { n : "BrtEndPCDSDTCSet" , f : parsenoop } ,
0x00F3 : { n : "BrtBeginPCDCalcItems" , f : parsenoop } ,
0x00F4 : { n : "BrtEndPCDCalcItems" , f : parsenoop } ,
0x00F5 : { n : "BrtBeginPCDCalcItem" , f : parsenoop } ,
0x00F6 : { n : "BrtEndPCDCalcItem" , f : parsenoop } ,
0x00F7 : { n : "BrtBeginPRule" , f : parsenoop } ,
0x00F8 : { n : "BrtEndPRule" , f : parsenoop } ,
0x00F9 : { n : "BrtBeginPRFilters" , f : parsenoop } ,
0x00FA : { n : "BrtEndPRFilters" , f : parsenoop } ,
0x00FB : { n : "BrtBeginPRFilter" , f : parsenoop } ,
0x00FC : { n : "BrtEndPRFilter" , f : parsenoop } ,
0x00FD : { n : "BrtBeginPNames" , f : parsenoop } ,
0x00FE : { n : "BrtEndPNames" , f : parsenoop } ,
0x00FF : { n : "BrtBeginPName" , f : parsenoop } ,
0x0100 : { n : "BrtEndPName" , f : parsenoop } ,
0x0101 : { n : "BrtBeginPNPairs" , f : parsenoop } ,
0x0102 : { n : "BrtEndPNPairs" , f : parsenoop } ,
0x0103 : { n : "BrtBeginPNPair" , f : parsenoop } ,
0x0104 : { n : "BrtEndPNPair" , f : parsenoop } ,
0x0105 : { n : "BrtBeginECWebProps" , f : parsenoop } ,
0x0106 : { n : "BrtEndECWebProps" , f : parsenoop } ,
0x0107 : { n : "BrtBeginEcWpTables" , f : parsenoop } ,
0x0108 : { n : "BrtEndECWPTables" , f : parsenoop } ,
0x0109 : { n : "BrtBeginECParams" , f : parsenoop } ,
0x010A : { n : "BrtEndECParams" , f : parsenoop } ,
0x010B : { n : "BrtBeginECParam" , f : parsenoop } ,
0x010C : { n : "BrtEndECParam" , f : parsenoop } ,
0x010D : { n : "BrtBeginPCDKPIs" , f : parsenoop } ,
0x010E : { n : "BrtEndPCDKPIs" , f : parsenoop } ,
0x010F : { n : "BrtBeginPCDKPI" , f : parsenoop } ,
0x0110 : { n : "BrtEndPCDKPI" , f : parsenoop } ,
0x0111 : { n : "BrtBeginDims" , f : parsenoop } ,
0x0112 : { n : "BrtEndDims" , f : parsenoop } ,
0x0113 : { n : "BrtBeginDim" , f : parsenoop } ,
0x0114 : { n : "BrtEndDim" , f : parsenoop } ,
0x0115 : { n : "BrtIndexPartEnd" , f : parsenoop } ,
0x0116 : { n : "BrtBeginStyleSheet" , f : parsenoop } ,
0x0117 : { n : "BrtEndStyleSheet" , f : parsenoop } ,
0x0118 : { n : "BrtBeginSXView" , f : parsenoop } ,
0x0119 : { n : "BrtEndSXVI" , f : parsenoop } ,
0x011A : { n : "BrtBeginSXVI" , f : parsenoop } ,
0x011B : { n : "BrtBeginSXVIs" , f : parsenoop } ,
0x011C : { n : "BrtEndSXVIs" , f : parsenoop } ,
0x011D : { n : "BrtBeginSXVD" , f : parsenoop } ,
0x011E : { n : "BrtEndSXVD" , f : parsenoop } ,
0x011F : { n : "BrtBeginSXVDs" , f : parsenoop } ,
0x0120 : { n : "BrtEndSXVDs" , f : parsenoop } ,
0x0121 : { n : "BrtBeginSXPI" , f : parsenoop } ,
0x0122 : { n : "BrtEndSXPI" , f : parsenoop } ,
0x0123 : { n : "BrtBeginSXPIs" , f : parsenoop } ,
0x0124 : { n : "BrtEndSXPIs" , f : parsenoop } ,
0x0125 : { n : "BrtBeginSXDI" , f : parsenoop } ,
0x0126 : { n : "BrtEndSXDI" , f : parsenoop } ,
0x0127 : { n : "BrtBeginSXDIs" , f : parsenoop } ,
0x0128 : { n : "BrtEndSXDIs" , f : parsenoop } ,
0x0129 : { n : "BrtBeginSXLI" , f : parsenoop } ,
0x012A : { n : "BrtEndSXLI" , f : parsenoop } ,
0x012B : { n : "BrtBeginSXLIRws" , f : parsenoop } ,
0x012C : { n : "BrtEndSXLIRws" , f : parsenoop } ,
0x012D : { n : "BrtBeginSXLICols" , f : parsenoop } ,
0x012E : { n : "BrtEndSXLICols" , f : parsenoop } ,
0x012F : { n : "BrtBeginSXFormat" , f : parsenoop } ,
0x0130 : { n : "BrtEndSXFormat" , f : parsenoop } ,
0x0131 : { n : "BrtBeginSXFormats" , f : parsenoop } ,
0x0132 : { n : "BrtEndSxFormats" , f : parsenoop } ,
0x0133 : { n : "BrtBeginSxSelect" , f : parsenoop } ,
0x0134 : { n : "BrtEndSxSelect" , f : parsenoop } ,
0x0135 : { n : "BrtBeginISXVDRws" , f : parsenoop } ,
0x0136 : { n : "BrtEndISXVDRws" , f : parsenoop } ,
0x0137 : { n : "BrtBeginISXVDCols" , f : parsenoop } ,
0x0138 : { n : "BrtEndISXVDCols" , f : parsenoop } ,
0x0139 : { n : "BrtEndSXLocation" , f : parsenoop } ,
0x013A : { n : "BrtBeginSXLocation" , f : parsenoop } ,
0x013B : { n : "BrtEndSXView" , f : parsenoop } ,
0x013C : { n : "BrtBeginSXTHs" , f : parsenoop } ,
0x013D : { n : "BrtEndSXTHs" , f : parsenoop } ,
0x013E : { n : "BrtBeginSXTH" , f : parsenoop } ,
0x013F : { n : "BrtEndSXTH" , f : parsenoop } ,
0x0140 : { n : "BrtBeginISXTHRws" , f : parsenoop } ,
0x0141 : { n : "BrtEndISXTHRws" , f : parsenoop } ,
0x0142 : { n : "BrtBeginISXTHCols" , f : parsenoop } ,
0x0143 : { n : "BrtEndISXTHCols" , f : parsenoop } ,
0x0144 : { n : "BrtBeginSXTDMPS" , f : parsenoop } ,
0x0145 : { n : "BrtEndSXTDMPs" , f : parsenoop } ,
0x0146 : { n : "BrtBeginSXTDMP" , f : parsenoop } ,
0x0147 : { n : "BrtEndSXTDMP" , f : parsenoop } ,
0x0148 : { n : "BrtBeginSXTHItems" , f : parsenoop } ,
0x0149 : { n : "BrtEndSXTHItems" , f : parsenoop } ,
0x014A : { n : "BrtBeginSXTHItem" , f : parsenoop } ,
0x014B : { n : "BrtEndSXTHItem" , f : parsenoop } ,
0x014C : { n : "BrtBeginMetadata" , f : parsenoop } ,
0x014D : { n : "BrtEndMetadata" , f : parsenoop } ,
0x014E : { n : "BrtBeginEsmdtinfo" , f : parsenoop } ,
0x014F : { n : "BrtMdtinfo" , f : parsenoop } ,
0x0150 : { n : "BrtEndEsmdtinfo" , f : parsenoop } ,
0x0151 : { n : "BrtBeginEsmdb" , f : parsenoop } ,
0x0152 : { n : "BrtEndEsmdb" , f : parsenoop } ,
0x0153 : { n : "BrtBeginEsfmd" , f : parsenoop } ,
0x0154 : { n : "BrtEndEsfmd" , f : parsenoop } ,
0x0155 : { n : "BrtBeginSingleCells" , f : parsenoop } ,
0x0156 : { n : "BrtEndSingleCells" , f : parsenoop } ,
0x0157 : { n : "BrtBeginList" , f : parsenoop } ,
0x0158 : { n : "BrtEndList" , f : parsenoop } ,
0x0159 : { n : "BrtBeginListCols" , f : parsenoop } ,
0x015A : { n : "BrtEndListCols" , f : parsenoop } ,
0x015B : { n : "BrtBeginListCol" , f : parsenoop } ,
0x015C : { n : "BrtEndListCol" , f : parsenoop } ,
0x015D : { n : "BrtBeginListXmlCPr" , f : parsenoop } ,
0x015E : { n : "BrtEndListXmlCPr" , f : parsenoop } ,
0x015F : { n : "BrtListCCFmla" , f : parsenoop } ,
0x0160 : { n : "BrtListTrFmla" , f : parsenoop } ,
0x0161 : { n : "BrtBeginExternals" , f : parsenoop } ,
0x0162 : { n : "BrtEndExternals" , f : parsenoop } ,
0x0163 : { n : "BrtSupBookSrc" , f : parsenoop } ,
0x0165 : { n : "BrtSupSelf" , f : parsenoop } ,
0x0166 : { n : "BrtSupSame" , f : parsenoop } ,
0x0167 : { n : "BrtSupTabs" , f : parsenoop } ,
0x0168 : { n : "BrtBeginSupBook" , f : parsenoop } ,
0x0169 : { n : "BrtPlaceholderName" , f : parsenoop } ,
0x016A : { n : "BrtExternSheet" , f : parsenoop } ,
0x016B : { n : "BrtExternTableStart" , f : parsenoop } ,
0x016C : { n : "BrtExternTableEnd" , f : parsenoop } ,
0x016E : { n : "BrtExternRowHdr" , f : parsenoop } ,
0x016F : { n : "BrtExternCellBlank" , f : parsenoop } ,
0x0170 : { n : "BrtExternCellReal" , f : parsenoop } ,
0x0171 : { n : "BrtExternCellBool" , f : parsenoop } ,
0x0172 : { n : "BrtExternCellError" , f : parsenoop } ,
0x0173 : { n : "BrtExternCellString" , f : parsenoop } ,
0x0174 : { n : "BrtBeginEsmdx" , f : parsenoop } ,
0x0175 : { n : "BrtEndEsmdx" , f : parsenoop } ,
0x0176 : { n : "BrtBeginMdxSet" , f : parsenoop } ,
0x0177 : { n : "BrtEndMdxSet" , f : parsenoop } ,
0x0178 : { n : "BrtBeginMdxMbrProp" , f : parsenoop } ,
0x0179 : { n : "BrtEndMdxMbrProp" , f : parsenoop } ,
0x017A : { n : "BrtBeginMdxKPI" , f : parsenoop } ,
0x017B : { n : "BrtEndMdxKPI" , f : parsenoop } ,
0x017C : { n : "BrtBeginEsstr" , f : parsenoop } ,
0x017D : { n : "BrtEndEsstr" , f : parsenoop } ,
0x017E : { n : "BrtBeginPRFItem" , f : parsenoop } ,
0x017F : { n : "BrtEndPRFItem" , f : parsenoop } ,
0x0180 : { n : "BrtBeginPivotCacheIDs" , f : parsenoop } ,
0x0181 : { n : "BrtEndPivotCacheIDs" , f : parsenoop } ,
0x0182 : { n : "BrtBeginPivotCacheID" , f : parsenoop } ,
0x0183 : { n : "BrtEndPivotCacheID" , f : parsenoop } ,
0x0184 : { n : "BrtBeginISXVIs" , f : parsenoop } ,
0x0185 : { n : "BrtEndISXVIs" , f : parsenoop } ,
0x0186 : { n : "BrtBeginColInfos" , f : parsenoop } ,
0x0187 : { n : "BrtEndColInfos" , f : parsenoop } ,
0x0188 : { n : "BrtBeginRwBrk" , f : parsenoop } ,
0x0189 : { n : "BrtEndRwBrk" , f : parsenoop } ,
0x018A : { n : "BrtBeginColBrk" , f : parsenoop } ,
0x018B : { n : "BrtEndColBrk" , f : parsenoop } ,
0x018C : { n : "BrtBrk" , f : parsenoop } ,
0x018D : { n : "BrtUserBookView" , f : parsenoop } ,
0x018E : { n : "BrtInfo" , f : parsenoop } ,
0x018F : { n : "BrtCUsr" , f : parsenoop } ,
0x0190 : { n : "BrtUsr" , f : parsenoop } ,
0x0191 : { n : "BrtBeginUsers" , f : parsenoop } ,
0x0193 : { n : "BrtEOF" , f : parsenoop } ,
0x0194 : { n : "BrtUCR" , f : parsenoop } ,
0x0195 : { n : "BrtRRInsDel" , f : parsenoop } ,
0x0196 : { n : "BrtRREndInsDel" , f : parsenoop } ,
0x0197 : { n : "BrtRRMove" , f : parsenoop } ,
0x0198 : { n : "BrtRREndMove" , f : parsenoop } ,
0x0199 : { n : "BrtRRChgCell" , f : parsenoop } ,
0x019A : { n : "BrtRREndChgCell" , f : parsenoop } ,
0x019B : { n : "BrtRRHeader" , f : parsenoop } ,
0x019C : { n : "BrtRRUserView" , f : parsenoop } ,
0x019D : { n : "BrtRRRenSheet" , f : parsenoop } ,
0x019E : { n : "BrtRRInsertSh" , f : parsenoop } ,
0x019F : { n : "BrtRRDefName" , f : parsenoop } ,
0x01A0 : { n : "BrtRRNote" , f : parsenoop } ,
0x01A1 : { n : "BrtRRConflict" , f : parsenoop } ,
0x01A2 : { n : "BrtRRTQSIF" , f : parsenoop } ,
0x01A3 : { n : "BrtRRFormat" , f : parsenoop } ,
0x01A4 : { n : "BrtRREndFormat" , f : parsenoop } ,
0x01A5 : { n : "BrtRRAutoFmt" , f : parsenoop } ,
0x01A6 : { n : "BrtBeginUserShViews" , f : parsenoop } ,
0x01A7 : { n : "BrtBeginUserShView" , f : parsenoop } ,
0x01A8 : { n : "BrtEndUserShView" , f : parsenoop } ,
0x01A9 : { n : "BrtEndUserShViews" , f : parsenoop } ,
0x01AA : { n : "BrtArrFmla" , f : parsenoop } ,
0x01AB : { n : "BrtShrFmla" , f : parsenoop } ,
0x01AC : { n : "BrtTable" , f : parsenoop } ,
0x01AD : { n : "BrtBeginExtConnections" , f : parsenoop } ,
0x01AE : { n : "BrtEndExtConnections" , f : parsenoop } ,
0x01AF : { n : "BrtBeginPCDCalcMems" , f : parsenoop } ,
0x01B0 : { n : "BrtEndPCDCalcMems" , f : parsenoop } ,
0x01B1 : { n : "BrtBeginPCDCalcMem" , f : parsenoop } ,
0x01B2 : { n : "BrtEndPCDCalcMem" , f : parsenoop } ,
0x01B3 : { n : "BrtBeginPCDHGLevels" , f : parsenoop } ,
0x01B4 : { n : "BrtEndPCDHGLevels" , f : parsenoop } ,
0x01B5 : { n : "BrtBeginPCDHGLevel" , f : parsenoop } ,
0x01B6 : { n : "BrtEndPCDHGLevel" , f : parsenoop } ,
0x01B7 : { n : "BrtBeginPCDHGLGroups" , f : parsenoop } ,
0x01B8 : { n : "BrtEndPCDHGLGroups" , f : parsenoop } ,
0x01B9 : { n : "BrtBeginPCDHGLGroup" , f : parsenoop } ,
0x01BA : { n : "BrtEndPCDHGLGroup" , f : parsenoop } ,
0x01BB : { n : "BrtBeginPCDHGLGMembers" , f : parsenoop } ,
0x01BC : { n : "BrtEndPCDHGLGMembers" , f : parsenoop } ,
0x01BD : { n : "BrtBeginPCDHGLGMember" , f : parsenoop } ,
0x01BE : { n : "BrtEndPCDHGLGMember" , f : parsenoop } ,
0x01BF : { n : "BrtBeginQSI" , f : parsenoop } ,
0x01C0 : { n : "BrtEndQSI" , f : parsenoop } ,
0x01C1 : { n : "BrtBeginQSIR" , f : parsenoop } ,
0x01C2 : { n : "BrtEndQSIR" , f : parsenoop } ,
0x01C3 : { n : "BrtBeginDeletedNames" , f : parsenoop } ,
0x01C4 : { n : "BrtEndDeletedNames" , f : parsenoop } ,
0x01C5 : { n : "BrtBeginDeletedName" , f : parsenoop } ,
0x01C6 : { n : "BrtEndDeletedName" , f : parsenoop } ,
0x01C7 : { n : "BrtBeginQSIFs" , f : parsenoop } ,
0x01C8 : { n : "BrtEndQSIFs" , f : parsenoop } ,
0x01C9 : { n : "BrtBeginQSIF" , f : parsenoop } ,
0x01CA : { n : "BrtEndQSIF" , f : parsenoop } ,
0x01CB : { n : "BrtBeginAutoSortScope" , f : parsenoop } ,
0x01CC : { n : "BrtEndAutoSortScope" , f : parsenoop } ,
0x01CD : { n : "BrtBeginConditionalFormatting" , f : parsenoop } ,
0x01CE : { n : "BrtEndConditionalFormatting" , f : parsenoop } ,
0x01CF : { n : "BrtBeginCFRule" , f : parsenoop } ,
0x01D0 : { n : "BrtEndCFRule" , f : parsenoop } ,
0x01D1 : { n : "BrtBeginIconSet" , f : parsenoop } ,
0x01D2 : { n : "BrtEndIconSet" , f : parsenoop } ,
0x01D3 : { n : "BrtBeginDatabar" , f : parsenoop } ,
0x01D4 : { n : "BrtEndDatabar" , f : parsenoop } ,
0x01D5 : { n : "BrtBeginColorScale" , f : parsenoop } ,
0x01D6 : { n : "BrtEndColorScale" , f : parsenoop } ,
0x01D7 : { n : "BrtCFVO" , f : parsenoop } ,
0x01D8 : { n : "BrtExternValueMeta" , f : parsenoop } ,
0x01D9 : { n : "BrtBeginColorPalette" , f : parsenoop } ,
0x01DA : { n : "BrtEndColorPalette" , f : parsenoop } ,
0x01DB : { n : "BrtIndexedColor" , f : parsenoop } ,
0x01DC : { n : "BrtMargins" , f : parsenoop } ,
0x01DD : { n : "BrtPrintOptions" , f : parsenoop } ,
0x01DE : { n : "BrtPageSetup" , f : parsenoop } ,
0x01DF : { n : "BrtBeginHeaderFooter" , f : parsenoop } ,
0x01E0 : { n : "BrtEndHeaderFooter" , f : parsenoop } ,
0x01E1 : { n : "BrtBeginSXCrtFormat" , f : parsenoop } ,
0x01E2 : { n : "BrtEndSXCrtFormat" , f : parsenoop } ,
0x01E3 : { n : "BrtBeginSXCrtFormats" , f : parsenoop } ,
0x01E4 : { n : "BrtEndSXCrtFormats" , f : parsenoop } ,
0x01E5 : { n : "BrtWsFmtInfo" , f : parsenoop } ,
0x01E6 : { n : "BrtBeginMgs" , f : parsenoop } ,
0x01E7 : { n : "BrtEndMGs" , f : parsenoop } ,
0x01E8 : { n : "BrtBeginMGMaps" , f : parsenoop } ,
0x01E9 : { n : "BrtEndMGMaps" , f : parsenoop } ,
0x01EA : { n : "BrtBeginMG" , f : parsenoop } ,
0x01EB : { n : "BrtEndMG" , f : parsenoop } ,
0x01EC : { n : "BrtBeginMap" , f : parsenoop } ,
0x01ED : { n : "BrtEndMap" , f : parsenoop } ,
2014-04-15 09:04:03 +00:00
0x01EE : { n : "BrtHLink" , f : parse _BrtHLink } ,
2014-01-28 16:38:02 +00:00
0x01EF : { n : "BrtBeginDCon" , f : parsenoop } ,
0x01F0 : { n : "BrtEndDCon" , f : parsenoop } ,
0x01F1 : { n : "BrtBeginDRefs" , f : parsenoop } ,
0x01F2 : { n : "BrtEndDRefs" , f : parsenoop } ,
0x01F3 : { n : "BrtDRef" , f : parsenoop } ,
0x01F4 : { n : "BrtBeginScenMan" , f : parsenoop } ,
0x01F5 : { n : "BrtEndScenMan" , f : parsenoop } ,
0x01F6 : { n : "BrtBeginSct" , f : parsenoop } ,
0x01F7 : { n : "BrtEndSct" , f : parsenoop } ,
0x01F8 : { n : "BrtSlc" , f : parsenoop } ,
0x01F9 : { n : "BrtBeginDXFs" , f : parsenoop } ,
0x01FA : { n : "BrtEndDXFs" , f : parsenoop } ,
0x01FB : { n : "BrtDXF" , f : parsenoop } ,
0x01FC : { n : "BrtBeginTableStyles" , f : parsenoop } ,
0x01FD : { n : "BrtEndTableStyles" , f : parsenoop } ,
0x01FE : { n : "BrtBeginTableStyle" , f : parsenoop } ,
0x01FF : { n : "BrtEndTableStyle" , f : parsenoop } ,
0x0200 : { n : "BrtTableStyleElement" , f : parsenoop } ,
0x0201 : { n : "BrtTableStyleClient" , f : parsenoop } ,
0x0202 : { n : "BrtBeginVolDeps" , f : parsenoop } ,
0x0203 : { n : "BrtEndVolDeps" , f : parsenoop } ,
0x0204 : { n : "BrtBeginVolType" , f : parsenoop } ,
0x0205 : { n : "BrtEndVolType" , f : parsenoop } ,
0x0206 : { n : "BrtBeginVolMain" , f : parsenoop } ,
0x0207 : { n : "BrtEndVolMain" , f : parsenoop } ,
0x0208 : { n : "BrtBeginVolTopic" , f : parsenoop } ,
0x0209 : { n : "BrtEndVolTopic" , f : parsenoop } ,
0x020A : { n : "BrtVolSubtopic" , f : parsenoop } ,
0x020B : { n : "BrtVolRef" , f : parsenoop } ,
0x020C : { n : "BrtVolNum" , f : parsenoop } ,
0x020D : { n : "BrtVolErr" , f : parsenoop } ,
0x020E : { n : "BrtVolStr" , f : parsenoop } ,
0x020F : { n : "BrtVolBool" , f : parsenoop } ,
2014-03-29 22:53:15 +00:00
0x0210 : { n : "BrtBeginCalcChain$" , f : parsenoop } ,
0x0211 : { n : "BrtEndCalcChain$" , f : parsenoop } ,
2014-01-28 16:38:02 +00:00
0x0212 : { n : "BrtBeginSortState" , f : parsenoop } ,
0x0213 : { n : "BrtEndSortState" , f : parsenoop } ,
0x0214 : { n : "BrtBeginSortCond" , f : parsenoop } ,
0x0215 : { n : "BrtEndSortCond" , f : parsenoop } ,
0x0216 : { n : "BrtBookProtection" , f : parsenoop } ,
0x0217 : { n : "BrtSheetProtection" , f : parsenoop } ,
0x0218 : { n : "BrtRangeProtection" , f : parsenoop } ,
0x0219 : { n : "BrtPhoneticInfo" , f : parsenoop } ,
0x021A : { n : "BrtBeginECTxtWiz" , f : parsenoop } ,
0x021B : { n : "BrtEndECTxtWiz" , f : parsenoop } ,
0x021C : { n : "BrtBeginECTWFldInfoLst" , f : parsenoop } ,
0x021D : { n : "BrtEndECTWFldInfoLst" , f : parsenoop } ,
0x021E : { n : "BrtBeginECTwFldInfo" , f : parsenoop } ,
0x0224 : { n : "BrtFileSharing" , f : parsenoop } ,
0x0225 : { n : "BrtOleSize" , f : parsenoop } ,
0x0226 : { n : "BrtDrawing" , f : parsenoop } ,
0x0227 : { n : "BrtLegacyDrawing" , f : parsenoop } ,
0x0228 : { n : "BrtLegacyDrawingHF" , f : parsenoop } ,
0x0229 : { n : "BrtWebOpt" , f : parsenoop } ,
0x022A : { n : "BrtBeginWebPubItems" , f : parsenoop } ,
0x022B : { n : "BrtEndWebPubItems" , f : parsenoop } ,
0x022C : { n : "BrtBeginWebPubItem" , f : parsenoop } ,
0x022D : { n : "BrtEndWebPubItem" , f : parsenoop } ,
0x022E : { n : "BrtBeginSXCondFmt" , f : parsenoop } ,
0x022F : { n : "BrtEndSXCondFmt" , f : parsenoop } ,
0x0230 : { n : "BrtBeginSXCondFmts" , f : parsenoop } ,
0x0231 : { n : "BrtEndSXCondFmts" , f : parsenoop } ,
0x0232 : { n : "BrtBkHim" , f : parsenoop } ,
0x0234 : { n : "BrtColor" , f : parsenoop } ,
0x0235 : { n : "BrtBeginIndexedColors" , f : parsenoop } ,
0x0236 : { n : "BrtEndIndexedColors" , f : parsenoop } ,
0x0239 : { n : "BrtBeginMRUColors" , f : parsenoop } ,
0x023A : { n : "BrtEndMRUColors" , f : parsenoop } ,
0x023C : { n : "BrtMRUColor" , f : parsenoop } ,
0x023D : { n : "BrtBeginDVals" , f : parsenoop } ,
0x023E : { n : "BrtEndDVals" , f : parsenoop } ,
0x0241 : { n : "BrtSupNameStart" , f : parsenoop } ,
0x0242 : { n : "BrtSupNameValueStart" , f : parsenoop } ,
0x0243 : { n : "BrtSupNameValueEnd" , f : parsenoop } ,
0x0244 : { n : "BrtSupNameNum" , f : parsenoop } ,
0x0245 : { n : "BrtSupNameErr" , f : parsenoop } ,
0x0246 : { n : "BrtSupNameSt" , f : parsenoop } ,
0x0247 : { n : "BrtSupNameNil" , f : parsenoop } ,
0x0248 : { n : "BrtSupNameBool" , f : parsenoop } ,
0x0249 : { n : "BrtSupNameFmla" , f : parsenoop } ,
0x024A : { n : "BrtSupNameBits" , f : parsenoop } ,
0x024B : { n : "BrtSupNameEnd" , f : parsenoop } ,
0x024C : { n : "BrtEndSupBook" , f : parsenoop } ,
0x024D : { n : "BrtCellSmartTagProperty" , f : parsenoop } ,
0x024E : { n : "BrtBeginCellSmartTag" , f : parsenoop } ,
0x024F : { n : "BrtEndCellSmartTag" , f : parsenoop } ,
0x0250 : { n : "BrtBeginCellSmartTags" , f : parsenoop } ,
0x0251 : { n : "BrtEndCellSmartTags" , f : parsenoop } ,
0x0252 : { n : "BrtBeginSmartTags" , f : parsenoop } ,
0x0253 : { n : "BrtEndSmartTags" , f : parsenoop } ,
0x0254 : { n : "BrtSmartTagType" , f : parsenoop } ,
0x0255 : { n : "BrtBeginSmartTagTypes" , f : parsenoop } ,
0x0256 : { n : "BrtEndSmartTagTypes" , f : parsenoop } ,
0x0257 : { n : "BrtBeginSXFilters" , f : parsenoop } ,
0x0258 : { n : "BrtEndSXFilters" , f : parsenoop } ,
0x0259 : { n : "BrtBeginSXFILTER" , f : parsenoop } ,
0x025A : { n : "BrtEndSXFilter" , f : parsenoop } ,
0x025B : { n : "BrtBeginFills" , f : parsenoop } ,
0x025C : { n : "BrtEndFills" , f : parsenoop } ,
0x025D : { n : "BrtBeginCellWatches" , f : parsenoop } ,
0x025E : { n : "BrtEndCellWatches" , f : parsenoop } ,
0x025F : { n : "BrtCellWatch" , f : parsenoop } ,
0x0260 : { n : "BrtBeginCRErrs" , f : parsenoop } ,
0x0261 : { n : "BrtEndCRErrs" , f : parsenoop } ,
0x0262 : { n : "BrtCrashRecErr" , f : parsenoop } ,
0x0263 : { n : "BrtBeginFonts" , f : parsenoop } ,
0x0264 : { n : "BrtEndFonts" , f : parsenoop } ,
0x0265 : { n : "BrtBeginBorders" , f : parsenoop } ,
0x0266 : { n : "BrtEndBorders" , f : parsenoop } ,
0x0267 : { n : "BrtBeginFmts" , f : parsenoop } ,
0x0268 : { n : "BrtEndFmts" , f : parsenoop } ,
0x0269 : { n : "BrtBeginCellXFs" , f : parsenoop } ,
0x026A : { n : "BrtEndCellXFs" , f : parsenoop } ,
0x026B : { n : "BrtBeginStyles" , f : parsenoop } ,
0x026C : { n : "BrtEndStyles" , f : parsenoop } ,
0x0271 : { n : "BrtBigName" , f : parsenoop } ,
0x0272 : { n : "BrtBeginCellStyleXFs" , f : parsenoop } ,
0x0273 : { n : "BrtEndCellStyleXFs" , f : parsenoop } ,
0x0274 : { n : "BrtBeginComments" , f : parsenoop } ,
0x0275 : { n : "BrtEndComments" , f : parsenoop } ,
0x0276 : { n : "BrtBeginCommentAuthors" , f : parsenoop } ,
0x0277 : { n : "BrtEndCommentAuthors" , f : parsenoop } ,
2014-03-29 02:05:50 +00:00
0x0278 : { n : "BrtCommentAuthor" , f : parse _BrtCommentAuthor } ,
2014-01-28 16:38:02 +00:00
0x0279 : { n : "BrtBeginCommentList" , f : parsenoop } ,
0x027A : { n : "BrtEndCommentList" , f : parsenoop } ,
2014-03-29 02:05:50 +00:00
0x027B : { n : "BrtBeginComment" , f : parse _BrtBeginComment } ,
2014-01-28 16:38:02 +00:00
0x027C : { n : "BrtEndComment" , f : parsenoop } ,
2014-03-29 02:05:50 +00:00
0x027D : { n : "BrtCommentText" , f : parse _BrtCommentText } ,
2014-01-28 16:38:02 +00:00
0x027E : { n : "BrtBeginOleObjects" , f : parsenoop } ,
0x027F : { n : "BrtOleObject" , f : parsenoop } ,
0x0280 : { n : "BrtEndOleObjects" , f : parsenoop } ,
0x0281 : { n : "BrtBeginSxrules" , f : parsenoop } ,
0x0282 : { n : "BrtEndSxRules" , f : parsenoop } ,
0x0283 : { n : "BrtBeginActiveXControls" , f : parsenoop } ,
0x0284 : { n : "BrtActiveX" , f : parsenoop } ,
0x0285 : { n : "BrtEndActiveXControls" , f : parsenoop } ,
0x0286 : { n : "BrtBeginPCDSDTCEMembersSortBy" , f : parsenoop } ,
0x0288 : { n : "BrtBeginCellIgnoreECs" , f : parsenoop } ,
0x0289 : { n : "BrtCellIgnoreEC" , f : parsenoop } ,
0x028A : { n : "BrtEndCellIgnoreECs" , f : parsenoop } ,
0x028B : { n : "BrtCsProp" , f : parsenoop } ,
0x028C : { n : "BrtCsPageSetup" , f : parsenoop } ,
0x028D : { n : "BrtBeginUserCsViews" , f : parsenoop } ,
0x028E : { n : "BrtEndUserCsViews" , f : parsenoop } ,
0x028F : { n : "BrtBeginUserCsView" , f : parsenoop } ,
0x0290 : { n : "BrtEndUserCsView" , f : parsenoop } ,
0x0291 : { n : "BrtBeginPcdSFCIEntries" , f : parsenoop } ,
0x0292 : { n : "BrtEndPCDSFCIEntries" , f : parsenoop } ,
0x0293 : { n : "BrtPCDSFCIEntry" , f : parsenoop } ,
0x0294 : { n : "BrtBeginListParts" , f : parsenoop } ,
0x0295 : { n : "BrtListPart" , f : parsenoop } ,
0x0296 : { n : "BrtEndListParts" , f : parsenoop } ,
0x0297 : { n : "BrtSheetCalcProp" , f : parsenoop } ,
0x0298 : { n : "BrtBeginFnGroup" , f : parsenoop } ,
0x0299 : { n : "BrtFnGroup" , f : parsenoop } ,
0x029A : { n : "BrtEndFnGroup" , f : parsenoop } ,
0x029B : { n : "BrtSupAddin" , f : parsenoop } ,
0x029C : { n : "BrtSXTDMPOrder" , f : parsenoop } ,
0x029D : { n : "BrtCsProtection" , f : parsenoop } ,
0x029F : { n : "BrtBeginWsSortMap" , f : parsenoop } ,
0x02A0 : { n : "BrtEndWsSortMap" , f : parsenoop } ,
0x02A1 : { n : "BrtBeginRRSort" , f : parsenoop } ,
0x02A2 : { n : "BrtEndRRSort" , f : parsenoop } ,
0x02A3 : { n : "BrtRRSortItem" , f : parsenoop } ,
0x02A4 : { n : "BrtFileSharingIso" , f : parsenoop } ,
0x02A5 : { n : "BrtBookProtectionIso" , f : parsenoop } ,
0x02A6 : { n : "BrtSheetProtectionIso" , f : parsenoop } ,
0x02A7 : { n : "BrtCsProtectionIso" , f : parsenoop } ,
0x02A8 : { n : "BrtRangeProtectionIso" , f : parsenoop } ,
0x0400 : { n : "BrtRwDescent" , f : parsenoop } ,
0x0401 : { n : "BrtKnownFonts" , f : parsenoop } ,
0x0402 : { n : "BrtBeginSXTupleSet" , f : parsenoop } ,
0x0403 : { n : "BrtEndSXTupleSet" , f : parsenoop } ,
0x0404 : { n : "BrtBeginSXTupleSetHeader" , f : parsenoop } ,
0x0405 : { n : "BrtEndSXTupleSetHeader" , f : parsenoop } ,
0x0406 : { n : "BrtSXTupleSetHeaderItem" , f : parsenoop } ,
0x0407 : { n : "BrtBeginSXTupleSetData" , f : parsenoop } ,
0x0408 : { n : "BrtEndSXTupleSetData" , f : parsenoop } ,
0x0409 : { n : "BrtBeginSXTupleSetRow" , f : parsenoop } ,
0x040A : { n : "BrtEndSXTupleSetRow" , f : parsenoop } ,
0x040B : { n : "BrtSXTupleSetRowItem" , f : parsenoop } ,
0x040C : { n : "BrtNameExt" , f : parsenoop } ,
0x040D : { n : "BrtPCDH14" , f : parsenoop } ,
0x040E : { n : "BrtBeginPCDCalcMem14" , f : parsenoop } ,
0x040F : { n : "BrtEndPCDCalcMem14" , f : parsenoop } ,
0x0410 : { n : "BrtSXTH14" , f : parsenoop } ,
0x0411 : { n : "BrtBeginSparklineGroup" , f : parsenoop } ,
0x0412 : { n : "BrtEndSparklineGroup" , f : parsenoop } ,
0x0413 : { n : "BrtSparkline" , f : parsenoop } ,
0x0414 : { n : "BrtSXDI14" , f : parsenoop } ,
0x0415 : { n : "BrtWsFmtInfoEx14" , f : parsenoop } ,
0x0416 : { n : "BrtBeginConditionalFormatting14" , f : parsenoop } ,
0x0417 : { n : "BrtEndConditionalFormatting14" , f : parsenoop } ,
0x0418 : { n : "BrtBeginCFRule14" , f : parsenoop } ,
0x0419 : { n : "BrtEndCFRule14" , f : parsenoop } ,
0x041A : { n : "BrtCFVO14" , f : parsenoop } ,
0x041B : { n : "BrtBeginDatabar14" , f : parsenoop } ,
0x041C : { n : "BrtBeginIconSet14" , f : parsenoop } ,
0x041D : { n : "BrtDVal14" , f : parsenoop } ,
0x041E : { n : "BrtBeginDVals14" , f : parsenoop } ,
0x041F : { n : "BrtColor14" , f : parsenoop } ,
0x0420 : { n : "BrtBeginSparklines" , f : parsenoop } ,
0x0421 : { n : "BrtEndSparklines" , f : parsenoop } ,
0x0422 : { n : "BrtBeginSparklineGroups" , f : parsenoop } ,
0x0423 : { n : "BrtEndSparklineGroups" , f : parsenoop } ,
0x0425 : { n : "BrtSXVD14" , f : parsenoop } ,
0x0426 : { n : "BrtBeginSxview14" , f : parsenoop } ,
0x0427 : { n : "BrtEndSxview14" , f : parsenoop } ,
0x042A : { n : "BrtBeginPCD14" , f : parsenoop } ,
0x042B : { n : "BrtEndPCD14" , f : parsenoop } ,
0x042C : { n : "BrtBeginExtConn14" , f : parsenoop } ,
0x042D : { n : "BrtEndExtConn14" , f : parsenoop } ,
0x042E : { n : "BrtBeginSlicerCacheIDs" , f : parsenoop } ,
0x042F : { n : "BrtEndSlicerCacheIDs" , f : parsenoop } ,
0x0430 : { n : "BrtBeginSlicerCacheID" , f : parsenoop } ,
0x0431 : { n : "BrtEndSlicerCacheID" , f : parsenoop } ,
0x0433 : { n : "BrtBeginSlicerCache" , f : parsenoop } ,
0x0434 : { n : "BrtEndSlicerCache" , f : parsenoop } ,
0x0435 : { n : "BrtBeginSlicerCacheDef" , f : parsenoop } ,
0x0436 : { n : "BrtEndSlicerCacheDef" , f : parsenoop } ,
0x0437 : { n : "BrtBeginSlicersEx" , f : parsenoop } ,
0x0438 : { n : "BrtEndSlicersEx" , f : parsenoop } ,
0x0439 : { n : "BrtBeginSlicerEx" , f : parsenoop } ,
0x043A : { n : "BrtEndSlicerEx" , f : parsenoop } ,
0x043B : { n : "BrtBeginSlicer" , f : parsenoop } ,
0x043C : { n : "BrtEndSlicer" , f : parsenoop } ,
0x043D : { n : "BrtSlicerCachePivotTables" , f : parsenoop } ,
0x043E : { n : "BrtBeginSlicerCacheOlapImpl" , f : parsenoop } ,
0x043F : { n : "BrtEndSlicerCacheOlapImpl" , f : parsenoop } ,
0x0440 : { n : "BrtBeginSlicerCacheLevelsData" , f : parsenoop } ,
0x0441 : { n : "BrtEndSlicerCacheLevelsData" , f : parsenoop } ,
0x0442 : { n : "BrtBeginSlicerCacheLevelData" , f : parsenoop } ,
0x0443 : { n : "BrtEndSlicerCacheLevelData" , f : parsenoop } ,
0x0444 : { n : "BrtBeginSlicerCacheSiRanges" , f : parsenoop } ,
0x0445 : { n : "BrtEndSlicerCacheSiRanges" , f : parsenoop } ,
0x0446 : { n : "BrtBeginSlicerCacheSiRange" , f : parsenoop } ,
0x0447 : { n : "BrtEndSlicerCacheSiRange" , f : parsenoop } ,
0x0448 : { n : "BrtSlicerCacheOlapItem" , f : parsenoop } ,
0x0449 : { n : "BrtBeginSlicerCacheSelections" , f : parsenoop } ,
0x044A : { n : "BrtSlicerCacheSelection" , f : parsenoop } ,
0x044B : { n : "BrtEndSlicerCacheSelections" , f : parsenoop } ,
0x044C : { n : "BrtBeginSlicerCacheNative" , f : parsenoop } ,
0x044D : { n : "BrtEndSlicerCacheNative" , f : parsenoop } ,
0x044E : { n : "BrtSlicerCacheNativeItem" , f : parsenoop } ,
0x044F : { n : "BrtRangeProtection14" , f : parsenoop } ,
0x0450 : { n : "BrtRangeProtectionIso14" , f : parsenoop } ,
0x0451 : { n : "BrtCellIgnoreEC14" , f : parsenoop } ,
0x0457 : { n : "BrtList14" , f : parsenoop } ,
0x0458 : { n : "BrtCFIcon" , f : parsenoop } ,
0x0459 : { n : "BrtBeginSlicerCachesPivotCacheIDs" , f : parsenoop } ,
0x045A : { n : "BrtEndSlicerCachesPivotCacheIDs" , f : parsenoop } ,
0x045B : { n : "BrtBeginSlicers" , f : parsenoop } ,
0x045C : { n : "BrtEndSlicers" , f : parsenoop } ,
0x045D : { n : "BrtWbProp14" , f : parsenoop } ,
0x045E : { n : "BrtBeginSXEdit" , f : parsenoop } ,
0x045F : { n : "BrtEndSXEdit" , f : parsenoop } ,
0x0460 : { n : "BrtBeginSXEdits" , f : parsenoop } ,
0x0461 : { n : "BrtEndSXEdits" , f : parsenoop } ,
0x0462 : { n : "BrtBeginSXChange" , f : parsenoop } ,
0x0463 : { n : "BrtEndSXChange" , f : parsenoop } ,
0x0464 : { n : "BrtBeginSXChanges" , f : parsenoop } ,
0x0465 : { n : "BrtEndSXChanges" , f : parsenoop } ,
0x0466 : { n : "BrtSXTupleItems" , f : parsenoop } ,
0x0468 : { n : "BrtBeginSlicerStyle" , f : parsenoop } ,
0x0469 : { n : "BrtEndSlicerStyle" , f : parsenoop } ,
0x046A : { n : "BrtSlicerStyleElement" , f : parsenoop } ,
0x046B : { n : "BrtBeginStyleSheetExt14" , f : parsenoop } ,
0x046C : { n : "BrtEndStyleSheetExt14" , f : parsenoop } ,
0x046D : { n : "BrtBeginSlicerCachesPivotCacheID" , f : parsenoop } ,
0x046E : { n : "BrtEndSlicerCachesPivotCacheID" , f : parsenoop } ,
0x046F : { n : "BrtBeginConditionalFormattings" , f : parsenoop } ,
0x0470 : { n : "BrtEndConditionalFormattings" , f : parsenoop } ,
0x0471 : { n : "BrtBeginPCDCalcMemExt" , f : parsenoop } ,
0x0472 : { n : "BrtEndPCDCalcMemExt" , f : parsenoop } ,
0x0473 : { n : "BrtBeginPCDCalcMemsExt" , f : parsenoop } ,
0x0474 : { n : "BrtEndPCDCalcMemsExt" , f : parsenoop } ,
0x0475 : { n : "BrtPCDField14" , f : parsenoop } ,
0x0476 : { n : "BrtBeginSlicerStyles" , f : parsenoop } ,
0x0477 : { n : "BrtEndSlicerStyles" , f : parsenoop } ,
0x0478 : { n : "BrtBeginSlicerStyleElements" , f : parsenoop } ,
0x0479 : { n : "BrtEndSlicerStyleElements" , f : parsenoop } ,
0x047A : { n : "BrtCFRuleExt" , f : parsenoop } ,
0x047B : { n : "BrtBeginSXCondFmt14" , f : parsenoop } ,
0x047C : { n : "BrtEndSXCondFmt14" , f : parsenoop } ,
0x047D : { n : "BrtBeginSXCondFmts14" , f : parsenoop } ,
0x047E : { n : "BrtEndSXCondFmts14" , f : parsenoop } ,
0x0480 : { n : "BrtBeginSortCond14" , f : parsenoop } ,
0x0481 : { n : "BrtEndSortCond14" , f : parsenoop } ,
0x0482 : { n : "BrtEndDVals14" , f : parsenoop } ,
0x0483 : { n : "BrtEndIconSet14" , f : parsenoop } ,
0x0484 : { n : "BrtEndDatabar14" , f : parsenoop } ,
0x0485 : { n : "BrtBeginColorScale14" , f : parsenoop } ,
0x0486 : { n : "BrtEndColorScale14" , f : parsenoop } ,
0x0487 : { n : "BrtBeginSxrules14" , f : parsenoop } ,
0x0488 : { n : "BrtEndSxrules14" , f : parsenoop } ,
0x0489 : { n : "BrtBeginPRule14" , f : parsenoop } ,
0x048A : { n : "BrtEndPRule14" , f : parsenoop } ,
0x048B : { n : "BrtBeginPRFilters14" , f : parsenoop } ,
0x048C : { n : "BrtEndPRFilters14" , f : parsenoop } ,
0x048D : { n : "BrtBeginPRFilter14" , f : parsenoop } ,
0x048E : { n : "BrtEndPRFilter14" , f : parsenoop } ,
0x048F : { n : "BrtBeginPRFItem14" , f : parsenoop } ,
0x0490 : { n : "BrtEndPRFItem14" , f : parsenoop } ,
0x0491 : { n : "BrtBeginCellIgnoreECs14" , f : parsenoop } ,
0x0492 : { n : "BrtEndCellIgnoreECs14" , f : parsenoop } ,
0x0493 : { n : "BrtDxf14" , f : parsenoop } ,
0x0494 : { n : "BrtBeginDxF14s" , f : parsenoop } ,
0x0495 : { n : "BrtEndDxf14s" , f : parsenoop } ,
0x0499 : { n : "BrtFilter14" , f : parsenoop } ,
0x049A : { n : "BrtBeginCustomFilters14" , f : parsenoop } ,
0x049C : { n : "BrtCustomFilter14" , f : parsenoop } ,
0x049D : { n : "BrtIconFilter14" , f : parsenoop } ,
0x049E : { n : "BrtPivotCacheConnectionName" , f : parsenoop } ,
0x0800 : { n : "BrtBeginDecoupledPivotCacheIDs" , f : parsenoop } ,
0x0801 : { n : "BrtEndDecoupledPivotCacheIDs" , f : parsenoop } ,
0x0802 : { n : "BrtDecoupledPivotCacheID" , f : parsenoop } ,
0x0803 : { n : "BrtBeginPivotTableRefs" , f : parsenoop } ,
0x0804 : { n : "BrtEndPivotTableRefs" , f : parsenoop } ,
0x0805 : { n : "BrtPivotTableRef" , f : parsenoop } ,
0x0806 : { n : "BrtSlicerCacheBookPivotTables" , f : parsenoop } ,
0x0807 : { n : "BrtBeginSxvcells" , f : parsenoop } ,
0x0808 : { n : "BrtEndSxvcells" , f : parsenoop } ,
0x0809 : { n : "BrtBeginSxRow" , f : parsenoop } ,
0x080A : { n : "BrtEndSxRow" , f : parsenoop } ,
0x080C : { n : "BrtPcdCalcMem15" , f : parsenoop } ,
0x0813 : { n : "BrtQsi15" , f : parsenoop } ,
0x0814 : { n : "BrtBeginWebExtensions" , f : parsenoop } ,
0x0815 : { n : "BrtEndWebExtensions" , f : parsenoop } ,
0x0816 : { n : "BrtWebExtension" , f : parsenoop } ,
0x0817 : { n : "BrtAbsPath15" , f : parsenoop } ,
0x0818 : { n : "BrtBeginPivotTableUISettings" , f : parsenoop } ,
0x0819 : { n : "BrtEndPivotTableUISettings" , f : parsenoop } ,
0x081B : { n : "BrtTableSlicerCacheIDs" , f : parsenoop } ,
0x081C : { n : "BrtTableSlicerCacheID" , f : parsenoop } ,
0x081D : { n : "BrtBeginTableSlicerCache" , f : parsenoop } ,
0x081E : { n : "BrtEndTableSlicerCache" , f : parsenoop } ,
0x081F : { n : "BrtSxFilter15" , f : parsenoop } ,
0x0820 : { n : "BrtBeginTimelineCachePivotCacheIDs" , f : parsenoop } ,
0x0821 : { n : "BrtEndTimelineCachePivotCacheIDs" , f : parsenoop } ,
0x0822 : { n : "BrtTimelineCachePivotCacheID" , f : parsenoop } ,
0x0823 : { n : "BrtBeginTimelineCacheIDs" , f : parsenoop } ,
0x0824 : { n : "BrtEndTimelineCacheIDs" , f : parsenoop } ,
0x0825 : { n : "BrtBeginTimelineCacheID" , f : parsenoop } ,
0x0826 : { n : "BrtEndTimelineCacheID" , f : parsenoop } ,
0x0827 : { n : "BrtBeginTimelinesEx" , f : parsenoop } ,
0x0828 : { n : "BrtEndTimelinesEx" , f : parsenoop } ,
0x0829 : { n : "BrtBeginTimelineEx" , f : parsenoop } ,
0x082A : { n : "BrtEndTimelineEx" , f : parsenoop } ,
0x082B : { n : "BrtWorkBookPr15" , f : parsenoop } ,
0x082C : { n : "BrtPCDH15" , f : parsenoop } ,
0x082D : { n : "BrtBeginTimelineStyle" , f : parsenoop } ,
0x082E : { n : "BrtEndTimelineStyle" , f : parsenoop } ,
0x082F : { n : "BrtTimelineStyleElement" , f : parsenoop } ,
0x0830 : { n : "BrtBeginTimelineStylesheetExt15" , f : parsenoop } ,
0x0831 : { n : "BrtEndTimelineStylesheetExt15" , f : parsenoop } ,
0x0832 : { n : "BrtBeginTimelineStyles" , f : parsenoop } ,
0x0833 : { n : "BrtEndTimelineStyles" , f : parsenoop } ,
0x0834 : { n : "BrtBeginTimelineStyleElements" , f : parsenoop } ,
0x0835 : { n : "BrtEndTimelineStyleElements" , f : parsenoop } ,
0x0836 : { n : "BrtDxf15" , f : parsenoop } ,
0x0837 : { n : "BrtBeginDxfs15" , f : parsenoop } ,
0x0838 : { n : "brtEndDxfs15" , f : parsenoop } ,
0x0839 : { n : "BrtSlicerCacheHideItemsWithNoData" , f : parsenoop } ,
0x083A : { n : "BrtBeginItemUniqueNames" , f : parsenoop } ,
0x083B : { n : "BrtEndItemUniqueNames" , f : parsenoop } ,
0x083C : { n : "BrtItemUniqueName" , f : parsenoop } ,
0x083D : { n : "BrtBeginExtConn15" , f : parsenoop } ,
0x083E : { n : "BrtEndExtConn15" , f : parsenoop } ,
0x083F : { n : "BrtBeginOledbPr15" , f : parsenoop } ,
0x0840 : { n : "BrtEndOledbPr15" , f : parsenoop } ,
0x0841 : { n : "BrtBeginDataFeedPr15" , f : parsenoop } ,
0x0842 : { n : "BrtEndDataFeedPr15" , f : parsenoop } ,
0x0843 : { n : "BrtTextPr15" , f : parsenoop } ,
0x0844 : { n : "BrtRangePr15" , f : parsenoop } ,
0x0845 : { n : "BrtDbCommand15" , f : parsenoop } ,
0x0846 : { n : "BrtBeginDbTables15" , f : parsenoop } ,
0x0847 : { n : "BrtEndDbTables15" , f : parsenoop } ,
0x0848 : { n : "BrtDbTable15" , f : parsenoop } ,
0x0849 : { n : "BrtBeginDataModel" , f : parsenoop } ,
0x084A : { n : "BrtEndDataModel" , f : parsenoop } ,
0x084B : { n : "BrtBeginModelTables" , f : parsenoop } ,
0x084C : { n : "BrtEndModelTables" , f : parsenoop } ,
0x084D : { n : "BrtModelTable" , f : parsenoop } ,
0x084E : { n : "BrtBeginModelRelationships" , f : parsenoop } ,
0x084F : { n : "BrtEndModelRelationships" , f : parsenoop } ,
0x0850 : { n : "BrtModelRelationship" , f : parsenoop } ,
0x0851 : { n : "BrtBeginECTxtWiz15" , f : parsenoop } ,
0x0852 : { n : "BrtEndECTxtWiz15" , f : parsenoop } ,
0x0853 : { n : "BrtBeginECTWFldInfoLst15" , f : parsenoop } ,
0x0854 : { n : "BrtEndECTWFldInfoLst15" , f : parsenoop } ,
0x0855 : { n : "BrtBeginECTWFldInfo15" , f : parsenoop } ,
0x0856 : { n : "BrtFieldListActiveItem" , f : parsenoop } ,
0x0857 : { n : "BrtPivotCacheIdVersion" , f : parsenoop } ,
0x0858 : { n : "BrtSXDI15" , f : parsenoop } ,
0xFFFF : { n : "" , f : parsenoop }
} ;
2014-05-29 22:30:03 +00:00
var evert _RE = evert ( RecordEnum , 'n' ) ;
2014-05-16 00:33:34 +00:00
function fix _opts ( defaults ) {
return function ( opts ) {
defaults . forEach ( function ( d ) {
if ( typeof opts [ d [ 0 ] ] === 'undefined' ) opts [ d [ 0 ] ] = d [ 1 ] ;
if ( d [ 2 ] === 'n' ) opts [ d [ 0 ] ] = Number ( opts [ d [ 0 ] ] ) ;
} ) ;
} ;
2014-02-07 10:53:40 +00:00
}
2014-05-16 00:33:34 +00:00
var fix _read _opts = fix _opts ( [
[ 'cellNF' , false ] , /* emit cell number format string as .z */
[ 'cellHTML' , true ] , /* emit html string as .h */
[ 'cellFormula' , true ] , /* emit formulae as .f */
2014-05-29 06:18:23 +00:00
[ 'cellStyles' , false ] , /* emits style/theme as .s */
2014-05-16 00:33:34 +00:00
[ 'sheetStubs' , false ] , /* emit empty cells */
[ 'sheetRows' , 0 , 'n' ] , /* read n rows (0 = read all rows) */
[ 'bookDeps' , false ] , /* parse calculation chains */
[ 'bookSheets' , false ] , /* only try to get sheet names (no Sheets) */
[ 'bookProps' , false ] , /* only try to get properties (no Sheets) */
[ 'bookFiles' , false ] , /* include raw file structure (keys, files) */
[ 'bookVBA' , false ] , /* include vba raw data (vbaraw) */
[ 'WTF' , false ] /* WTF mode (throws errors) */
] ) ;
var fix _write _opts = fix _opts ( [
[ 'bookSST' , false ] , /* Generate Shared String Table */
[ 'bookType' , 'xlsx' ] , /* Type of workbook (xlsx/m/b) */
[ 'WTF' , false ] /* WTF mode (throws errors) */
] ) ;
function parse _zip ( zip , opts ) {
make _ssf ( SSF ) ;
2014-02-07 10:53:40 +00:00
opts = opts || { } ;
2014-05-16 00:33:34 +00:00
fix _read _opts ( opts ) ;
2014-02-05 13:39:21 +00:00
reset _cp ( ) ;
2014-05-16 00:33:34 +00:00
var entries = keys ( zip . files ) . filter ( function ( x ) { return x . substr ( - 1 ) != '/' ; } ) . sort ( ) ;
var dir = parse _ct ( getzipdata ( zip , '[Content_Types].xml' ) , opts ) ;
2014-01-28 16:38:02 +00:00
var xlsb = false ;
2014-04-03 22:51:54 +00:00
var sheets , binname ;
if ( dir . workbooks . length === 0 ) {
binname = "xl/workbook.xml" ;
if ( getzipdata ( zip , binname , true ) ) dir . workbooks . push ( binname ) ;
}
2014-01-28 16:38:02 +00:00
if ( dir . workbooks . length === 0 ) {
2014-04-03 22:51:54 +00:00
binname = "xl/workbook.bin" ;
if ( ! getzipfile ( zip , binname , true ) ) throw new Error ( "Could not find workbook" ) ;
2014-01-28 16:38:02 +00:00
dir . workbooks . push ( binname ) ;
xlsb = true ;
}
2014-05-29 22:30:03 +00:00
if ( dir . workbooks [ 0 ] . substr ( - 3 ) == "bin" ) xlsb = true ;
2014-05-22 12:16:51 +00:00
if ( xlsb ) set _cp ( 1200 ) ;
2013-03-26 23:54:14 +00:00
2014-02-14 06:25:46 +00:00
if ( ! opts . bookSheets && ! opts . bookProps ) {
2014-05-16 00:33:34 +00:00
strs = [ ] ;
2014-02-15 05:08:18 +00:00
if ( dir . sst ) strs = parse _sst ( getzipdata ( zip , dir . sst . replace ( /^\// , '' ) ) , dir . sst , opts ) ;
2014-02-13 06:22:42 +00:00
styles = { } ;
2014-03-23 21:30:00 +00:00
if ( dir . style ) styles = parse _sty ( getzipdata ( zip , dir . style . replace ( /^\// , '' ) ) , dir . style , opts ) ;
2014-05-29 06:18:23 +00:00
themes = { } ;
2014-05-29 22:30:03 +00:00
if ( opts . cellStyles && dir . themes . length ) themes = parse _theme ( getzipdata ( zip , dir . themes [ 0 ] . replace ( /^\// , '' ) ) , dir . themes [ 0 ] , opts ) ;
2014-02-13 06:22:42 +00:00
}
2014-02-15 05:08:18 +00:00
var wb = parse _wb ( getzipdata ( zip , dir . workbooks [ 0 ] . replace ( /^\// , '' ) ) , dir . workbooks [ 0 ] , opts ) ;
2013-03-26 23:54:14 +00:00
2014-02-04 00:00:44 +00:00
var props = { } , propdata = "" ;
2014-05-16 00:33:34 +00:00
if ( dir . coreprops . length !== 0 ) {
propdata = getzipdata ( zip , dir . coreprops [ 0 ] . replace ( /^\// , '' ) , true ) ;
if ( propdata ) props = parse _core _props ( propdata ) ;
if ( dir . extprops . length !== 0 ) {
propdata = getzipdata ( zip , dir . extprops [ 0 ] . replace ( /^\// , '' ) , true ) ;
if ( propdata ) parse _ext _props ( propdata , props ) ;
}
}
2014-02-14 06:25:46 +00:00
2014-02-14 03:39:03 +00:00
var custprops = { } ;
2014-02-14 06:25:46 +00:00
if ( ! opts . bookSheets || opts . bookProps ) {
2014-02-15 05:08:18 +00:00
if ( dir . custprops . length !== 0 ) {
propdata = getzipdata ( zip , dir . custprops [ 0 ] . replace ( /^\// , '' ) , true ) ;
2014-05-16 00:33:34 +00:00
if ( propdata ) custprops = parse _cust _props ( propdata , opts ) ;
2014-02-15 05:08:18 +00:00
}
2014-02-14 03:39:03 +00:00
}
2014-02-13 06:22:42 +00:00
2014-02-14 06:25:46 +00:00
var out = { } ;
if ( opts . bookSheets || opts . bookProps ) {
if ( props . Worksheets && props . SheetNames . length > 0 ) sheets = props . SheetNames ;
else if ( wb . Sheets ) sheets = wb . Sheets . map ( function ( x ) { return x . name ; } ) ;
if ( opts . bookProps ) { out . Props = props ; out . Custprops = custprops ; }
if ( typeof sheets !== 'undefined' ) out . SheetNames = sheets ;
if ( opts . bookSheets ? out . SheetNames : opts . bookProps ) return out ;
2014-02-13 06:22:42 +00:00
}
2014-02-15 05:08:18 +00:00
sheets = { } ;
2014-02-13 06:22:42 +00:00
2012-12-04 19:27:20 +00:00
var deps = { } ;
2014-03-29 22:53:15 +00:00
if ( opts . bookDeps && dir . calcchain ) deps = parse _cc ( getzipdata ( zip , dir . calcchain . replace ( /^\// , '' ) ) , dir . calcchain , opts ) ;
2014-02-15 05:08:18 +00:00
var i = 0 ;
2014-01-28 16:38:02 +00:00
var sheetRels = { } ;
2014-01-29 06:00:09 +00:00
var path , relsPath ;
2013-02-20 16:02:00 +00:00
if ( ! props . Worksheets ) {
2014-01-22 04:58:26 +00:00
var wbsheets = wb . Sheets ;
props . Worksheets = wbsheets . length ;
props . SheetNames = [ ] ;
for ( var j = 0 ; j != wbsheets . length ; ++ j ) {
props . SheetNames [ j ] = wbsheets [ j ] . name ;
}
2014-02-21 16:41:37 +00:00
}
2014-05-22 12:16:51 +00:00
2014-05-29 22:30:03 +00:00
var wbext = xlsb ? "bin" : "xml" ;
var wbrelsfile = 'xl/_rels/workbook.' + wbext + '.rels' ;
2014-05-22 12:16:51 +00:00
var wbrels = parse _rels ( getzipdata ( zip , wbrelsfile , true ) , wbrelsfile ) ;
if ( wbrels ) try {
wbrels = wb . Sheets . map ( function ( w ) { return [ w . name , wbrels [ '!id' ] [ w . id ] . Target ] ; } ) ;
} catch ( e ) { wbrels = null ; }
2014-05-29 22:30:03 +00:00
if ( wbrels && wbrels . length === 0 ) wbrels = null ;
2014-05-22 12:16:51 +00:00
/* Numbers iOS hack */
2014-02-21 16:41:37 +00:00
var nmode = ( getzipdata ( zip , "xl/worksheets/sheet.xml" , true ) ) ? 1 : 0 ;
for ( i = 0 ; i != props . Worksheets ; ++ i ) {
try {
2014-05-22 12:16:51 +00:00
if ( wbrels ) path = 'xl/' + ( wbrels [ i ] [ 1 ] ) . replace ( /[\/]?xl\// , "" ) ;
else {
2014-05-29 22:30:03 +00:00
path = 'xl/worksheets/sheet' + ( i + 1 - nmode ) + "." + wbext ;
2014-05-22 12:16:51 +00:00
path = path . replace ( /sheet0\./ , "sheet." ) ;
}
2014-02-21 16:41:37 +00:00
relsPath = path . replace ( /^(.*)(\/)([^\/]*)$/ , "$1/_rels/$3.rels" ) ;
2014-05-16 00:33:34 +00:00
sheetRels [ props . SheetNames [ i ] ] = parse _rels ( getzipdata ( zip , relsPath , true ) , path ) ;
2014-04-15 09:04:03 +00:00
sheets [ props . SheetNames [ i ] ] = parse _ws ( getzipdata ( zip , path ) , path , opts , sheetRels [ props . SheetNames [ i ] ] ) ;
2014-02-21 16:41:37 +00:00
} catch ( e ) { if ( opts . WTF ) throw e ; }
2012-12-04 19:27:20 +00:00
}
2014-01-22 04:58:26 +00:00
2014-02-12 06:09:42 +00:00
if ( dir . comments ) parse _comments ( zip , dir . comments , sheets , sheetRels , opts ) ;
2014-01-22 04:58:26 +00:00
2014-02-17 08:44:22 +00:00
out = {
2012-12-04 19:27:20 +00:00
Directory : dir ,
Workbook : wb ,
Props : props ,
2014-02-14 03:39:03 +00:00
Custprops : custprops ,
2012-12-04 19:27:20 +00:00
Deps : deps ,
Sheets : sheets ,
SheetNames : props . SheetNames ,
Strings : strs ,
2013-03-26 23:54:14 +00:00
Styles : styles ,
2014-05-29 06:18:23 +00:00
Themes : themes ,
2014-05-16 00:33:34 +00:00
SSF : SSF . get _table ( )
2012-12-04 19:27:20 +00:00
} ;
2014-02-17 08:44:22 +00:00
if ( opts . bookFiles ) {
2014-05-16 00:33:34 +00:00
out . keys = entries ;
2014-02-21 16:41:37 +00:00
out . files = zip . files ;
2014-02-17 08:44:22 +00:00
}
2014-04-03 22:51:54 +00:00
if ( opts . bookVBA ) {
if ( dir . vba . length > 0 ) out . vbaraw = getzipdata ( zip , dir . vba [ 0 ] , true ) ;
else if ( dir . defaults . bin === 'application/vnd.ms-office.vbaProject' ) out . vbaraw = getzipdata ( zip , 'xl/vbaProject.bin' , true ) ;
}
2014-02-17 08:44:22 +00:00
return out ;
2012-12-04 19:27:20 +00:00
}
2014-05-16 00:33:34 +00:00
function add _rels ( rels , rId , f , type , relobj ) {
if ( ! relobj ) relobj = { } ;
if ( ! rels [ '!id' ] ) rels [ '!id' ] = { } ;
relobj . Id = 'rId' + rId ;
2014-05-16 00:50:55 +00:00
relobj . Type = type ;
2014-05-16 00:33:34 +00:00
relobj . Target = f ;
if ( rels [ '!id' ] [ relobj . Id ] ) throw new Error ( "Cannot rewrite rId " + rId ) ;
rels [ '!id' ] [ relobj . Id ] = relobj ;
rels [ ( '/' + relobj . Target ) . replace ( "//" , "/" ) ] = relobj ;
}
function write _zip ( wb , opts ) {
2014-05-22 12:16:51 +00:00
if ( wb && ! wb . SSF ) {
wb . SSF = SSF . get _table ( ) ;
}
2014-05-16 00:33:34 +00:00
if ( wb && wb . SSF ) {
make _ssf ( SSF ) ; SSF . load _table ( wb . SSF ) ;
opts . revssf = evert ( wb . SSF ) ; opts . revssf [ wb . SSF [ 65535 ] ] = 0 ;
}
opts . rels = { } ; opts . wbrels = { } ;
opts . Strings = [ ] ; opts . Strings . Count = 0 ; opts . Strings . Unique = 0 ;
var wbext = opts . bookType == "xlsb" ? "bin" : "xml" ;
var ct = { workbooks : [ ] , sheets : [ ] , calcchains : [ ] , themes : [ ] , styles : [ ] ,
coreprops : [ ] , extprops : [ ] , custprops : [ ] , strs : [ ] , comments : [ ] , vba : [ ] ,
TODO : [ ] , rels : [ ] , xmlns : "" } ;
fix _write _opts ( opts = opts || { } ) ;
var zip = new jszip ( ) ;
var f = "" , rId = 0 ;
opts . cellXfs = [ ] ;
2014-05-22 12:16:51 +00:00
get _cell _style ( opts . cellXfs , { } , { revssf : { "General" : 0 } } ) ;
2014-05-16 00:33:34 +00:00
f = "docProps/core.xml" ;
zip . file ( f , write _core _props ( wb . Props , opts ) ) ;
ct . coreprops . push ( f ) ;
2014-05-22 12:16:51 +00:00
add _rels ( opts . rels , 2 , f , RELS . CORE _PROPS ) ;
2014-05-16 00:33:34 +00:00
f = "docProps/app.xml" ;
2014-05-22 12:16:51 +00:00
if ( ! wb . Props ) wb . Props = { } ;
2014-05-16 00:33:34 +00:00
wb . Props . SheetNames = wb . SheetNames ;
wb . Props . Worksheets = wb . SheetNames . length ;
zip . file ( f , write _ext _props ( wb . Props , opts ) ) ;
ct . extprops . push ( f ) ;
2014-05-22 12:16:51 +00:00
add _rels ( opts . rels , 3 , f , RELS . EXT _PROPS ) ;
2014-05-16 00:33:34 +00:00
2014-05-29 22:30:03 +00:00
if ( wb . Custprops !== wb . Props && keys ( wb . Custprops || { } ) . length > 0 ) {
2014-05-16 00:33:34 +00:00
f = "docProps/custom.xml" ;
zip . file ( f , write _cust _props ( wb . Custprops , opts ) ) ;
ct . custprops . push ( f ) ;
2014-05-22 12:16:51 +00:00
add _rels ( opts . rels , 4 , f , RELS . CUST _PROPS ) ;
2014-05-16 00:33:34 +00:00
}
f = "xl/workbook." + wbext ;
zip . file ( f , write _wb ( wb , f , opts ) ) ;
ct . workbooks . push ( f ) ;
add _rels ( opts . rels , 1 , f , RELS . WB ) ;
wb . SheetNames . forEach ( function ( s , i ) {
rId = i + 1 ; f = "xl/worksheets/sheet" + rId + "." + wbext ;
zip . file ( f , write _ws ( i , f , opts , wb ) ) ;
ct . sheets . push ( f ) ;
add _rels ( opts . wbrels , rId , "worksheets/sheet" + rId + "." + wbext , RELS . WS ) ;
} ) ;
if ( ( opts . Strings || [ ] ) . length > 0 ) {
f = "xl/sharedStrings." + wbext ;
zip . file ( f , write _sst ( opts . Strings , f , opts ) ) ;
ct . strs . push ( f ) ;
add _rels ( opts . wbrels , ++ rId , "sharedStrings." + wbext , RELS . SST ) ;
}
/* TODO: something more intelligent with themes */
2014-05-16 00:50:55 +00:00
2014-05-22 12:16:51 +00:00
f = "xl/theme/theme1.xml" ;
2014-05-16 00:33:34 +00:00
zip . file ( f , write _theme ( ) ) ;
ct . themes . push ( f ) ;
2014-05-22 12:16:51 +00:00
add _rels ( opts . wbrels , ++ rId , "theme/theme1.xml" , RELS . THEME ) ;
2014-05-16 00:33:34 +00:00
/* TODO: something more intelligent with styles */
2014-05-29 22:30:03 +00:00
f = "xl/styles." + wbext ;
2014-05-16 00:33:34 +00:00
zip . file ( f , write _sty ( wb , f , opts ) ) ;
ct . styles . push ( f ) ;
add _rels ( opts . wbrels , ++ rId , "styles." + wbext , RELS . STY ) ;
zip . file ( "[Content_Types].xml" , write _ct ( ct , opts ) ) ;
zip . file ( '_rels/.rels' , write _rels ( opts . rels ) ) ;
2014-05-29 22:30:03 +00:00
zip . file ( 'xl/_rels/workbook.' + wbext + '.rels' , write _rels ( opts . wbrels ) ) ;
2014-05-16 00:33:34 +00:00
return zip ;
}
function readSync ( data , opts ) {
2012-12-04 19:27:20 +00:00
var zip , d = data ;
2014-05-16 00:33:34 +00:00
var o = opts || { } ;
if ( ! o . type ) o . type = ( typeof Buffer !== 'undefined' && data instanceof Buffer ) ? "buffer" : "base64" ;
switch ( o . type ) {
2012-12-04 19:27:20 +00:00
case "base64" : zip = new jszip ( d , { base64 : true } ) ; break ;
case "binary" : zip = new jszip ( d , { base64 : false } ) ; break ;
2014-05-16 00:33:34 +00:00
case "buffer" : zip = new jszip ( d ) ; break ;
case "file" : zip = new jszip ( d = _fs . readFileSync ( data ) ) ; break ;
default : throw new Error ( "Unrecognized type " + o . type ) ;
2012-12-04 19:27:20 +00:00
}
2014-05-16 00:33:34 +00:00
return parse _zip ( zip , o ) ;
2012-12-04 19:27:20 +00:00
}
2014-05-16 00:33:34 +00:00
function readFileSync ( data , opts ) {
var o = opts || { } ; o . type = 'file' ;
2012-12-04 19:27:20 +00:00
return readSync ( data , o ) ;
}
2014-05-16 00:33:34 +00:00
function writeSync ( wb , opts ) {
var o = opts || { } ;
var z = write _zip ( wb , o ) ;
switch ( o . type ) {
case "base64" : return z . generate ( { type : "base64" } ) ;
case "binary" : return z . generate ( { type : "string" } ) ;
case "buffer" : return z . generate ( { type : "nodebuffer" } ) ;
case "file" : return _fs . writeFileSync ( o . file , z . generate ( { type : "nodebuffer" } ) ) ;
default : throw new Error ( "Unrecognized type " + o . type ) ;
}
}
function writeFileSync ( wb , filename , opts ) {
var o = opts || { } ; o . type = 'file' ;
o . file = filename ;
switch ( o . file . substr ( - 5 ) . toLowerCase ( ) ) {
case '.xlsm' : o . bookType = 'xlsm' ; break ;
case '.xlsb' : o . bookType = 'xlsb' ; break ;
}
return writeSync ( wb , o ) ;
}
2014-05-03 18:51:10 +00:00
function decode _row ( rowstr ) { return Number ( unfix _row ( rowstr ) ) - 1 ; }
function encode _row ( row ) { return "" + ( row + 1 ) ; }
function fix _row ( cstr ) { return cstr . replace ( /([A-Z]|^)([0-9]+)$/ , "$1$$$2" ) ; }
function unfix _row ( cstr ) { return cstr . replace ( /\$([0-9]+)$/ , "$1" ) ; }
2013-03-15 23:08:09 +00:00
2014-05-03 18:51:10 +00:00
function decode _col ( colstr ) { var c = unfix _col ( colstr ) , d = 0 , i = 0 ; for ( ; i !== c . length ; ++ i ) d = 26 * d + c . charCodeAt ( i ) - 64 ; return d - 1 ; }
2013-03-15 23:08:09 +00:00
function encode _col ( col ) { var s = "" ; for ( ++ col ; col ; col = Math . floor ( ( col - 1 ) / 26 ) ) s = _chr ( ( ( col - 1 ) % 26 ) + 65 ) + s ; return s ; }
2014-05-03 18:51:10 +00:00
function fix _col ( cstr ) { return cstr . replace ( /^([A-Z])/ , "$$$1" ) ; }
function unfix _col ( cstr ) { return cstr . replace ( /^\$([A-Z])/ , "$1" ) ; }
2012-12-04 19:27:20 +00:00
function split _cell ( cstr ) { return cstr . replace ( /(\$?[A-Z]*)(\$?[0-9]*)/ , "$1,$2" ) . split ( "," ) ; }
function decode _cell ( cstr ) { var splt = split _cell ( cstr ) ; return { c : decode _col ( splt [ 0 ] ) , r : decode _row ( splt [ 1 ] ) } ; }
2014-05-03 18:51:10 +00:00
function encode _cell ( cell ) { return encode _col ( cell . c ) + encode _row ( cell . r ) ; }
function fix _cell ( cstr ) { return fix _col ( fix _row ( cstr ) ) ; }
function unfix _cell ( cstr ) { return unfix _col ( unfix _row ( cstr ) ) ; }
2012-12-04 19:27:20 +00:00
function decode _range ( range ) { var x = range . split ( ":" ) . map ( decode _cell ) ; return { s : x [ 0 ] , e : x [ x . length - 1 ] } ; }
2014-05-03 18:51:10 +00:00
function encode _range ( cs , ce ) {
if ( typeof ce === 'undefined' || typeof ce === 'number' ) return encode _range ( cs . s , cs . e ) ;
if ( typeof cs !== 'string' ) cs = encode _cell ( cs ) ; if ( typeof ce !== 'string' ) ce = encode _cell ( ce ) ;
return cs == ce ? cs : cs + ":" + ce ;
}
function format _cell ( cell , v ) {
if ( ! cell || ! cell . t ) return "" ;
if ( typeof cell . w !== 'undefined' ) return cell . w ;
if ( typeof v === 'undefined' ) v = cell . v ;
if ( typeof cell . z !== 'undefined' ) try { return ( cell . w = SSF . format ( cell . z , v ) ) ; } catch ( e ) { }
if ( ! cell . XF ) return v ;
try { return ( cell . w = SSF . format ( cell . XF . ifmt || 0 , v ) ) ; } catch ( e ) { return v ; }
}
2014-01-23 06:20:19 +00:00
2014-05-29 22:30:03 +00:00
function sheet _to _json ( sheet , opts ) {
var val , row , range , header , offset = 1 , r , hdr = { } , isempty , R , C , v ;
2014-01-23 06:20:19 +00:00
var out = [ ] ;
opts = opts || { } ;
2014-01-23 15:55:07 +00:00
if ( ! sheet || ! sheet [ "!ref" ] ) return out ;
2014-05-29 22:30:03 +00:00
range = opts . range || sheet [ "!ref" ] ;
header = opts . header || "" ;
switch ( typeof range ) {
case 'string' : r = decode _range ( range ) ; break ;
case 'number' : r = decode _range ( sheet [ "!ref" ] ) ; r . s . r = range ; break ;
default : r = range ;
}
if ( header ) offset = 0 ;
2014-01-23 06:20:19 +00:00
for ( R = r . s . r , C = r . s . c ; C <= r . e . c ; ++ C ) {
val = sheet [ encode _cell ( { c : C , r : R } ) ] ;
2014-05-29 22:30:03 +00:00
if ( header === "A" ) hdr [ C ] = encode _col ( C ) ;
else if ( header === 1 ) hdr [ C ] = C ;
else if ( Array . isArray ( header ) ) hdr [ C ] = header [ C - r . s . c ] ;
else if ( ! val ) continue ;
else hdr [ C ] = format _cell ( val ) ;
2014-01-23 06:20:19 +00:00
}
2013-02-18 03:16:38 +00:00
2014-05-29 22:30:03 +00:00
for ( R = r . s . r + offset ; R <= r . e . r ; ++ R ) {
2014-01-23 06:20:19 +00:00
isempty = true ;
2014-05-29 22:30:03 +00:00
row = header === 1 ? [ ] : Object . create ( { _ _rowNum _ _ : R } ) ;
2014-01-23 06:20:19 +00:00
for ( C = r . s . c ; C <= r . e . c ; ++ C ) {
val = sheet [ encode _cell ( { c : C , r : R } ) ] ;
2014-01-23 15:55:07 +00:00
if ( ! val || ! val . t ) continue ;
2014-05-03 18:51:10 +00:00
v = ( val || { } ) . v ;
switch ( val . t ) {
case 'e' : continue ;
case 's' : case 'str' : break ;
case 'b' : case 'n' : break ;
2014-01-23 06:20:19 +00:00
default : throw 'unrecognized type ' + val . t ;
2013-02-18 03:16:38 +00:00
}
2014-05-03 18:51:10 +00:00
if ( typeof v !== 'undefined' ) {
row [ hdr [ C ] ] = opts . raw ? v || val . v : format _cell ( val , v ) ;
isempty = false ;
}
2013-02-18 03:16:38 +00:00
}
2014-01-23 06:20:19 +00:00
if ( ! isempty ) out . push ( row ) ;
2013-02-18 03:16:38 +00:00
}
2014-01-23 06:20:19 +00:00
return out ;
2013-02-18 03:16:38 +00:00
}
2014-05-29 22:30:03 +00:00
function sheet _to _row _object _array ( sheet , opts ) { if ( ! opts ) opts = { } ; delete opts . range ; return sheet _to _json ( sheet , opts ) ; }
2014-01-23 06:20:19 +00:00
function sheet _to _csv ( sheet , opts ) {
2014-02-22 21:36:28 +00:00
var out = [ ] , txt = "" ;
2014-01-23 06:20:19 +00:00
opts = opts || { } ;
2014-02-22 21:36:28 +00:00
if ( ! sheet || ! sheet [ "!ref" ] ) return "" ;
2014-05-03 18:51:10 +00:00
var r = decode _range ( sheet [ "!ref" ] ) ;
2014-02-12 06:09:42 +00:00
var fs = opts . FS || "," , rs = opts . RS || "\n" ;
2014-02-17 08:44:22 +00:00
2014-01-23 06:20:19 +00:00
for ( var R = r . s . r ; R <= r . e . r ; ++ R ) {
var row = [ ] ;
for ( var C = r . s . c ; C <= r . e . c ; ++ C ) {
2014-05-03 18:51:10 +00:00
var val = sheet [ encode _cell ( { c : C , r : R } ) ] ;
2014-01-23 06:20:19 +00:00
if ( ! val ) { row . push ( "" ) ; continue ; }
2014-05-03 18:51:10 +00:00
txt = String ( format _cell ( val ) ) ;
2014-02-12 06:09:42 +00:00
if ( txt . indexOf ( fs ) !== - 1 || txt . indexOf ( rs ) !== - 1 || txt . indexOf ( '"' ) !== - 1 )
txt = "\"" + txt . replace ( /"/g , '""' ) + "\"" ;
row . push ( txt ) ;
2013-02-20 15:25:02 +00:00
}
2014-02-22 21:36:28 +00:00
out . push ( row . join ( fs ) ) ;
2013-02-20 15:25:02 +00:00
}
2014-02-22 21:36:28 +00:00
return out . join ( rs ) + ( out . length ? rs : "" ) ;
2013-02-20 15:25:02 +00:00
}
2013-10-30 22:26:31 +00:00
var make _csv = sheet _to _csv ;
2013-02-20 15:25:02 +00:00
2013-04-13 17:00:01 +00:00
function get _formulae ( ws ) {
var cmds = [ ] ;
2013-04-17 01:32:20 +00:00
for ( var y in ws ) if ( y [ 0 ] !== '!' && ws . hasOwnProperty ( y ) ) {
var x = ws [ y ] ;
2013-04-13 17:00:01 +00:00
var val = "" ;
if ( x . f ) val = x . f ;
2014-02-17 08:44:22 +00:00
else if ( typeof x . w !== 'undefined' ) val = "'" + x . w ;
2014-02-06 22:02:11 +00:00
else if ( typeof x . v === 'undefined' ) continue ;
2013-04-13 17:00:01 +00:00
else val = x . v ;
cmds . push ( y + "=" + val ) ;
2013-04-17 01:32:20 +00:00
}
2013-04-13 17:00:01 +00:00
return cmds ;
}
2014-05-03 18:51:10 +00:00
var utils = {
2012-12-04 19:27:20 +00:00
encode _col : encode _col ,
encode _row : encode _row ,
encode _cell : encode _cell ,
2013-02-20 16:02:00 +00:00
encode _range : encode _range ,
2012-12-04 19:27:20 +00:00
decode _col : decode _col ,
decode _row : decode _row ,
split _cell : split _cell ,
decode _cell : decode _cell ,
2013-02-18 03:16:38 +00:00
decode _range : decode _range ,
2013-02-20 15:25:02 +00:00
sheet _to _csv : sheet _to _csv ,
2013-10-30 22:26:31 +00:00
make _csv : sheet _to _csv ,
2014-05-29 22:30:03 +00:00
make _json : sheet _to _json ,
2013-04-13 17:00:01 +00:00
get _formulae : get _formulae ,
2014-05-03 18:51:10 +00:00
format _cell : format _cell ,
2014-05-29 22:30:03 +00:00
sheet _to _json : sheet _to _json ,
2013-02-18 03:16:38 +00:00
sheet _to _row _object _array : sheet _to _row _object _array
2012-12-04 19:27:20 +00:00
} ;
2014-05-16 00:33:34 +00:00
XLSX . parseZip = parse _zip ;
2014-04-15 09:04:03 +00:00
XLSX . read = readSync ;
XLSX . readFile = readFileSync ;
2014-05-16 00:33:34 +00:00
XLSX . write = writeSync ;
XLSX . writeFile = writeFileSync ;
2014-05-03 18:51:10 +00:00
XLSX . utils = utils ;
2014-04-15 09:04:03 +00:00
XLSX . SSF = SSF ;
} ) ( typeof exports !== 'undefined' ? exports : XLSX ) ;