@@ -21,6 +21,8 @@ var WorkbookPropertiesManager = require('../../xlsx/xform/book/workbook-properti
2121var WorksheetReader = require ( './worksheet-reader' ) ;
2222var HyperlinkReader = require ( './hyperlink-reader' ) ;
2323
24+ var Temp = require ( 'temp' ) ;
25+
2426var WorkbookReader = module . exports = function ( options ) {
2527 this . options = options = options || { } ;
2628
@@ -40,6 +42,9 @@ var WorkbookReader = module.exports = function(options) {
4042
4143 // end of stream check
4244 this . atEnd = false ;
45+
46+ Temp . track ( ) ;
47+ this . waitingWorkSheets = [ ] ;
4348} ;
4449
4550utils . inherits ( WorkbookReader , events . EventEmitter , {
@@ -73,6 +78,7 @@ utils.inherits(WorkbookReader, events.EventEmitter, {
7378
7479 zip . on ( 'entry' , entry => {
7580 var match , sheetNo ;
81+ // console.log(entry.path);
7682 switch ( entry . path ) {
7783 case '_rels/.rels' :
7884 case 'xl/_rels/workbook.xml.rels' :
@@ -91,7 +97,13 @@ utils.inherits(WorkbookReader, events.EventEmitter, {
9197 if ( entry . path . match ( / x l \/ w o r k s h e e t s \/ s h e e t \d + [ . ] x m l / ) ) {
9298 match = entry . path . match ( / x l \/ w o r k s h e e t s \/ s h e e t ( \d + ) [ . ] x m l / ) ;
9399 sheetNo = match [ 1 ] ;
94- this . _parseWorksheet ( entry , sheetNo , options ) ;
100+ if ( this . sharedStrings ) {
101+ this . _parseWorksheet ( entry , sheetNo , options ) ;
102+ } else {
103+ var stream = Temp . createWriteStream ( ) ;
104+ this . waitingWorkSheets . push ( { sheetNo : sheetNo , options : options , path : stream . path } ) ;
105+ entry . pipe ( stream ) ;
106+ }
95107 } else if ( entry . path . match ( / x l \/ w o r k s h e e t s \/ _ r e l s \/ s h e e t \d + [ . ] x m l .r e l s / ) ) {
96108 match = entry . path . match ( / x l \/ w o r k s h e e t s \/ _ r e l s \/ s h e e t ( \d + ) [ . ] x m l .r e l s / ) ;
97109 sheetNo = match [ 1 ] ;
@@ -104,11 +116,44 @@ utils.inherits(WorkbookReader, events.EventEmitter, {
104116 } ) ;
105117
106118 zip . on ( 'close' , ( ) => {
107- this . emit ( 'end' ) ;
108- this . atEnd = true ;
109- if ( ! this . readers ) {
110- this . emit ( 'finished' ) ;
119+ var self = this ;
120+ if ( this . waitingWorkSheets . length ) {
121+ var currentBook = 0 ;
122+
123+ var processBooks = function ( ) {
124+ var worksheetInfo = self . waitingWorkSheets [ currentBook ] ;
125+ var entry = fs . createReadStream ( worksheetInfo . path ) ;
126+
127+ var sheetNo = worksheetInfo . sheetNo ;
128+ var options = worksheetInfo . options ;
129+ var worksheet = self . _parseWorksheet ( entry , sheetNo , options ) ;
130+
131+ worksheet . on ( 'finished' , function ( node ) {
132+ ++ currentBook ;
133+ if ( currentBook == self . waitingWorkSheets . length ) {
134+ Temp . cleanupSync ( ) ;
135+ // setImmediate(this.emit.bind(this), 'finished');
136+
137+ self . emit ( 'end' ) ;
138+ self . atEnd = true ;
139+ if ( ! self . readers ) {
140+ self . emit ( 'finished' ) ;
141+ }
142+ } else {
143+ setImmediate ( processBooks ) ;
144+ }
145+ } )
146+ }
147+ setImmediate ( processBooks ) ;
148+ } else {
149+ this . emit ( 'end' ) ;
150+ this . atEnd = true ;
151+ if ( ! this . readers ) {
152+ this . emit ( 'finished' ) ;
153+ }
111154 }
155+
156+
112157 } ) ;
113158
114159 zip . on ( 'error' , err => {
@@ -204,6 +249,7 @@ utils.inherits(WorkbookReader, events.EventEmitter, {
204249 this . emit ( 'worksheet' , worksheetReader ) ;
205250 }
206251 worksheetReader . read ( entry , options , this . hyperlinkReaders [ sheetNo ] ) ;
252+ return worksheetReader ;
207253 } ,
208254 _parseHyperlinks : function ( entry , sheetNo , options ) {
209255 this . _emitEntry ( options , { type : 'hyerlinks' , id : sheetNo } ) ;
0 commit comments