@@ -440,7 +440,7 @@ var SYLK = /*#__PURE__*/(function() {
440
440
wb . Workbook . Names . push ( nn ) ;
441
441
} break ;
442
442
case 'C' : /* cell */
443
- var C_seen_K = false , C_seen_X = false , C_seen_S = false , C_seen_E = false , _R = - 1 , _C = - 1 ;
443
+ var C_seen_K = false , C_seen_X = false , C_seen_S = false , C_seen_E = false , _R = - 1 , _C = - 1 , formula = "" , cell_t = "z" ;
444
444
for ( rj = 1 ; rj < record . length ; ++ rj ) switch ( record [ rj ] . charAt ( 0 ) ) {
445
445
case 'A' : break ; // TODO: comment
446
446
case 'X' : C = parseInt ( record [ rj ] . slice ( 1 ) , 10 ) - 1 ; C_seen_X = true ; break ;
@@ -450,42 +450,46 @@ var SYLK = /*#__PURE__*/(function() {
450
450
break ;
451
451
case 'K' :
452
452
val = record [ rj ] . slice ( 1 ) ;
453
- if ( val . charAt ( 0 ) === '"' ) val = val . slice ( 1 , val . length - 1 ) ;
454
- else if ( val === 'TRUE' ) val = true ;
455
- else if ( val === 'FALSE' ) val = false ;
453
+ if ( val . charAt ( 0 ) === '"' ) { val = val . slice ( 1 , val . length - 1 ) ; cell_t = "s" ; }
454
+ else if ( val === 'TRUE' || val === 'FALSE' ) { val = val === 'TRUE' ; cell_t = "b" ; }
456
455
else if ( ! isNaN ( fuzzynum ( val ) ) ) {
457
- val = fuzzynum ( val ) ;
458
- if ( next_cell_format !== null && fmt_is_date ( next_cell_format ) ) val = numdate ( wb . Workbook . WBProps . date1904 ? val + 1462 : val ) ;
456
+ val = fuzzynum ( val ) ; cell_t = "n" ;
457
+ if ( next_cell_format !== null && fmt_is_date ( next_cell_format ) && opts . cellDates ) { val = numdate ( wb . Workbook . WBProps . date1904 ? val + 1462 : val ) ; cell_t = "d" ; }
459
458
} else if ( ! isNaN ( fuzzydate ( val ) . getDate ( ) ) ) {
460
- val = parseDate ( val ) ;
459
+ val = parseDate ( val ) ; cell_t = "d" ;
460
+ if ( ! opts . cellDates ) { cell_t = "n" ; val = datenum ( val , wb . Workbook . WBProps . date1904 ) ; }
461
461
}
462
462
if ( typeof $cptable !== 'undefined' && typeof val == "string" && ( ( opts || { } ) . type != "string" ) && ( opts || { } ) . codepage ) val = $cptable . utils . decode ( opts . codepage , val ) ;
463
463
C_seen_K = true ;
464
464
break ;
465
465
case 'E' :
466
466
C_seen_E = true ;
467
- var formula = rc_to_a1 ( record [ rj ] . slice ( 1 ) , { r :R , c :C } ) ;
468
- arr [ R ] [ C ] = [ arr [ R ] [ C ] , formula ] ;
467
+ formula = rc_to_a1 ( record [ rj ] . slice ( 1 ) , { r :R , c :C } ) ;
469
468
break ;
470
469
case 'S' :
471
470
C_seen_S = true ;
472
- arr [ R ] [ C ] = [ arr [ R ] [ C ] , "S5S" ] ;
473
471
break ;
474
472
case 'G' : break ; // unknown
475
473
case 'R' : _R = parseInt ( record [ rj ] . slice ( 1 ) , 10 ) - 1 ; break ;
476
474
case 'C' : _C = parseInt ( record [ rj ] . slice ( 1 ) , 10 ) - 1 ; break ;
477
475
default : if ( opts && opts . WTF ) throw new Error ( "SYLK bad record " + rstr ) ;
478
476
}
479
477
if ( C_seen_K ) {
480
- if ( arr [ R ] [ C ] && arr [ R ] [ C ] . length == 2 ) arr [ R ] [ C ] [ 0 ] = val ;
481
- else arr [ R ] [ C ] = val ;
478
+ if ( ! arr [ R ] [ C ] ) arr [ R ] [ C ] = { t : cell_t , v : val } ;
479
+ else { arr [ R ] [ C ] . t = cell_t ; arr [ R ] [ C ] . v = val ; }
480
+ if ( next_cell_format ) arr [ R ] [ C ] . z = next_cell_format ;
481
+ if ( opts . cellText !== false && next_cell_format ) arr [ R ] [ C ] . w = SSF_format ( arr [ R ] [ C ] . z , arr [ R ] [ C ] . v , { date1904 : wb . Workbook . WBProps . date1904 } ) ;
482
482
next_cell_format = null ;
483
483
}
484
484
if ( C_seen_S ) {
485
485
if ( C_seen_E ) throw new Error ( "SYLK shared formula cannot have own formula" ) ;
486
486
var shrbase = _R > - 1 && arr [ _R ] [ _C ] ;
487
487
if ( ! shrbase || ! shrbase [ 1 ] ) throw new Error ( "SYLK shared formula cannot find base" ) ;
488
- arr [ R ] [ C ] [ 1 ] = shift_formula_str ( shrbase [ 1 ] , { r : R - _R , c : C - _C } ) ;
488
+ formula = shift_formula_str ( shrbase [ 1 ] , { r : R - _R , c : C - _C } ) ;
489
+ }
490
+ if ( formula ) {
491
+ if ( ! arr [ R ] [ C ] ) arr [ R ] [ C ] = { t : 'n' , f : formula } ;
492
+ else arr [ R ] [ C ] . f = formula ;
489
493
}
490
494
break ;
491
495
case 'F' : /* Format */
@@ -537,7 +541,8 @@ var SYLK = /*#__PURE__*/(function() {
537
541
function sylk_to_workbook ( d /*:RawData*/ , opts ) /*:Workbook*/ {
538
542
var aoasht = sylk_to_aoa ( d , opts ) ;
539
543
var aoa = aoasht [ 0 ] , ws = aoasht [ 1 ] , wb = aoasht [ 2 ] ;
540
- var o = aoa_to_sheet ( aoa , opts ) ;
544
+ var _opts = dup ( opts ) ; _opts . date1904 = ( ( ( wb || { } ) . Workbook || { } ) . WBProps || { } ) . date1904 ;
545
+ var o = aoa_to_sheet ( aoa , _opts ) ;
541
546
keys ( ws ) . forEach ( function ( k ) { o [ k ] = ws [ k ] ; } ) ;
542
547
var outwb = sheet_to_workbook ( o , opts ) ;
543
548
keys ( wb ) . forEach ( function ( k ) { outwb [ k ] = wb [ k ] ; } ) ;
@@ -581,24 +586,26 @@ var SYLK = /*#__PURE__*/(function() {
581
586
} ) ;
582
587
}
583
588
584
- function sheet_to_sylk ( ws /*:Worksheet*/ , opts /*:?any*/ ) /*:string*/ {
589
+ function sheet_to_sylk ( ws /*:Worksheet*/ , opts /*:?any*/ , wb /*:?WorkBook*/ ) /*:string*/ {
585
590
var preamble /*:Array<string>*/ = [ "ID;PSheetJS;N;E" ] , o /*:Array<string>*/ = [ ] ;
586
591
var r = safe_decode_range ( ws [ '!ref' ] ) , cell /*:Cell*/ ;
587
592
var dense = Array . isArray ( ws ) ;
588
593
var RS = "\r\n" ;
594
+ var d1904 = ( ( ( wb || { } ) . Workbook || { } ) . WBProps || { } ) . date1904 ;
589
595
590
596
preamble . push ( "P;PGeneral" ) ;
591
597
preamble . push ( "F;P0;DG0G8;M255" ) ;
592
598
if ( ws [ '!cols' ] ) write_ws_cols_sylk ( preamble , ws [ '!cols' ] ) ;
593
599
if ( ws [ '!rows' ] ) write_ws_rows_sylk ( preamble , ws [ '!rows' ] ) ;
594
600
595
601
preamble . push ( "B;Y" + ( r . e . r - r . s . r + 1 ) + ";X" + ( r . e . c - r . s . c + 1 ) + ";D" + [ r . s . c , r . s . r , r . e . c , r . e . r ] . join ( " " ) ) ;
602
+ preamble . push ( "O;L;D;B" + ( d1904 ? ";V4" : "" ) + ";K47;G100 0.001" ) ;
596
603
for ( var R = r . s . r ; R <= r . e . r ; ++ R ) {
597
604
for ( var C = r . s . c ; C <= r . e . c ; ++ C ) {
598
605
var coord = encode_cell ( { r :R , c :C } ) ;
599
606
cell = dense ? ( ws [ R ] || [ ] ) [ C ] : ws [ coord ] ;
600
607
if ( ! cell || ( cell . v == null && ( ! cell . f || cell . F ) ) ) continue ;
601
- o . push ( write_ws_cell_sylk ( cell , ws , R , C , opts ) ) ;
608
+ o . push ( write_ws_cell_sylk ( cell , ws , R , C , opts ) ) ; // TODO: pass date1904 info
602
609
}
603
610
}
604
611
return preamble . join ( RS ) + RS + o . join ( RS ) + RS + "E" + RS ;
0 commit comments