@@ -440,6 +440,71 @@ function XLSXLSX(X, filename, opts, cb, idx, query) {
440440 return text ;
441441 }
442442 }
443+
444+ function processSheet ( workbook , sheetid , sheetOpt ) {
445+ var range ;
446+ var sheetRes = [ ] ;
447+ if ( typeof sheetOpt . range === 'undefined' ) {
448+ range = workbook . Sheets [ sheetid ] [ '!ref' ] ;
449+ } else {
450+ range = sheetOpt . range ;
451+ if ( workbook . Sheets [ sheetid ] [ range ] ) {
452+ range = workbook . Sheets [ sheetid ] [ range ] ;
453+ }
454+ }
455+ // if range has some value then data is present in the current sheet
456+ // else current sheet is empty
457+ if ( range ) {
458+ var rg = range . split ( ':' ) ;
459+ var col0 = rg [ 0 ] . match ( / [ A - Z ] + / ) [ 0 ] ;
460+ var row0 = + rg [ 0 ] . match ( / [ 0 - 9 ] + / ) [ 0 ] ;
461+ var col1 = rg [ 1 ] . match ( / [ A - Z ] + / ) [ 0 ] ;
462+ var row1 = + rg [ 1 ] . match ( / [ 0 - 9 ] + / ) [ 0 ] ;
463+
464+ var hh = { } ;
465+ var xlscnCol0 = alasql . utils . xlscn ( col0 ) ;
466+ var xlscnCol1 = alasql . utils . xlscn ( col1 ) ;
467+ for ( var j = xlscnCol0 ; j <= xlscnCol1 ; j ++ ) {
468+ var col = alasql . utils . xlsnc ( j ) ;
469+ if ( sheetOpt . headers ) {
470+ if ( workbook . Sheets [ sheetid ] [ col + '' + row0 ] ) {
471+ hh [ col ] = getHeaderText ( workbook . Sheets [ sheetid ] [ col + '' + row0 ] . v ) ;
472+ } else {
473+ hh [ col ] = getHeaderText ( col ) ;
474+ }
475+ } else {
476+ hh [ col ] = col ;
477+ }
478+ }
479+ if ( sheetOpt . headers ) {
480+ row0 ++ ;
481+ }
482+ for ( var i = row0 ; i <= row1 ; i ++ ) {
483+ var row = { } ;
484+ for ( var j = xlscnCol0 ; j <= xlscnCol1 ; j ++ ) {
485+ var col = alasql . utils . xlsnc ( j ) ;
486+ if ( workbook . Sheets [ sheetid ] [ col + '' + i ] ) {
487+ row [ hh [ col ] ] = workbook . Sheets [ sheetid ] [ col + '' + i ] . v ;
488+ }
489+ }
490+ sheetRes . push ( row ) ;
491+ }
492+ } else {
493+ sheetRes . push ( [ ] ) ;
494+ }
495+
496+ // Remove last empty line (issue #548)
497+ if (
498+ sheetRes . length > 0 &&
499+ sheetRes [ sheetRes . length - 1 ] &&
500+ Object . keys ( sheetRes [ sheetRes . length - 1 ] ) . length == 0
501+ ) {
502+ sheetRes . pop ( ) ;
503+ }
504+
505+ return sheetRes ;
506+ }
507+
443508 filename = alasql . utils . autoExtFilename ( filename , 'xls' , opts ) ;
444509 alasql . utils . loadBinaryFile (
445510 filename ,
@@ -460,71 +525,44 @@ function XLSXLSX(X, filename, opts, cb, idx, query) {
460525 ...opts ,
461526 } ) ;
462527 }
463- // console.log(workbook);
464- var sheetid ;
465- if ( typeof opt . sheetid === 'undefined' ) {
466- sheetid = workbook . SheetNames [ 0 ] ;
467- } else if ( typeof opt . sheetid === 'number' ) {
468- sheetid = workbook . SheetNames [ opt . sheetid ] ;
469- } else {
470- sheetid = opt . sheetid ;
471- }
472- var range ;
473- var res = [ ] ;
474- if ( typeof opt . range === 'undefined' ) {
475- range = workbook . Sheets [ sheetid ] [ '!ref' ] ;
476- } else {
477- range = opt . range ;
478- if ( workbook . Sheets [ sheetid ] [ range ] ) {
479- range = workbook . Sheets [ sheetid ] [ range ] ;
480- }
481- }
482- // if range has some value then data is present in the current sheet
483- // else current sheet is empty
484- if ( range ) {
485- var rg = range . split ( ':' ) ;
486- var col0 = rg [ 0 ] . match ( / [ A - Z ] + / ) [ 0 ] ;
487- var row0 = + rg [ 0 ] . match ( / [ 0 - 9 ] + / ) [ 0 ] ;
488- var col1 = rg [ 1 ] . match ( / [ A - Z ] + / ) [ 0 ] ;
489- var row1 = + rg [ 1 ] . match ( / [ 0 - 9 ] + / ) [ 0 ] ;
490- // console.log(114,rg,col0,col1,row0,row1);
491- // console.log(114,rg,alasql.utils.xlscn(col0),alasql.utils.xlscn(col1));
492-
493- var hh = { } ;
494- var xlscnCol0 = alasql . utils . xlscn ( col0 ) ;
495- var xlscnCol1 = alasql . utils . xlscn ( col1 ) ;
496- for ( var j = xlscnCol0 ; j <= xlscnCol1 ; j ++ ) {
497- var col = alasql . utils . xlsnc ( j ) ;
498- if ( opt . headers ) {
499- if ( workbook . Sheets [ sheetid ] [ col + '' + row0 ] ) {
500- hh [ col ] = getHeaderText ( workbook . Sheets [ sheetid ] [ col + '' + row0 ] . v ) ;
501- } else {
502- hh [ col ] = getHeaderText ( col ) ;
503- }
504- } else {
505- hh [ col ] = col ;
506- }
507- }
508- if ( opt . headers ) {
509- row0 ++ ;
510- }
511- for ( var i = row0 ; i <= row1 ; i ++ ) {
512- var row = { } ;
513- for ( var j = xlscnCol0 ; j <= xlscnCol1 ; j ++ ) {
514- var col = alasql . utils . xlsnc ( j ) ;
515- if ( workbook . Sheets [ sheetid ] [ col + '' + i ] ) {
516- row [ hh [ col ] ] = workbook . Sheets [ sheetid ] [ col + '' + i ] . v ;
528+
529+ // Check if we should process multiple sheets
530+ var shouldProcessMultipleSheets =
531+ opt . sheetid === '*' || ( Array . isArray ( opt . sheetid ) && opt . sheetid . length > 0 ) ;
532+
533+ if ( shouldProcessMultipleSheets ) {
534+ // Process multiple sheets and combine into a single array
535+ res = [ ] ;
536+ var sheetsToProcess = opt . sheetid === '*' ? workbook . SheetNames : opt . sheetid ;
537+
538+ for ( var s = 0 ; s < sheetsToProcess . length ; s ++ ) {
539+ var currentSheetId =
540+ opt . sheetid === '*'
541+ ? sheetsToProcess [ s ]
542+ : typeof sheetsToProcess [ s ] === 'number'
543+ ? workbook . SheetNames [ sheetsToProcess [ s ] ]
544+ : sheetsToProcess [ s ] ;
545+
546+ if ( workbook . Sheets [ currentSheetId ] ) {
547+ var sheetData = processSheet ( workbook , currentSheetId , opt ) ;
548+ // Add sheet name to each row
549+ for ( var r = 0 ; r < sheetData . length ; r ++ ) {
550+ sheetData [ r ] . _sheet = currentSheetId ;
517551 }
552+ res = res . concat ( sheetData ) ;
518553 }
519- res . push ( row ) ;
520554 }
521555 } else {
522- res . push ( [ ] ) ;
523- }
524-
525- // Remove last empty line (issue #548)
526- if ( res . length > 0 && res [ res . length - 1 ] && Object . keys ( res [ res . length - 1 ] ) . length == 0 ) {
527- res . pop ( ) ;
556+ // Process single sheet (original behavior)
557+ var sheetid ;
558+ if ( typeof opt . sheetid === 'undefined' ) {
559+ sheetid = workbook . SheetNames [ 0 ] ;
560+ } else if ( typeof opt . sheetid === 'number' ) {
561+ sheetid = workbook . SheetNames [ opt . sheetid ] ;
562+ } else {
563+ sheetid = opt . sheetid ;
564+ }
565+ res = processSheet ( workbook , sheetid , opt ) ;
528566 }
529567
530568 if ( cb ) {
0 commit comments