Skip to content

Commit 890c97d

Browse files
authored
Merge pull request #578 from KMethod/master
Fix some xlsx stream read xlsx not in guaranteed order problem
2 parents 93f375d + 286836b commit 890c97d

File tree

2 files changed

+53
-6
lines changed

2 files changed

+53
-6
lines changed

lib/stream/xlsx/workbook-reader.js

Lines changed: 51 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ var WorkbookPropertiesManager = require('../../xlsx/xform/book/workbook-properti
2121
var WorksheetReader = require('./worksheet-reader');
2222
var HyperlinkReader = require('./hyperlink-reader');
2323

24+
var Temp = require('temp');
25+
2426
var 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

4550
utils.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(/xl\/worksheets\/sheet\d+[.]xml/)) {
9298
match = entry.path.match(/xl\/worksheets\/sheet(\d+)[.]xml/);
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(/xl\/worksheets\/_rels\/sheet\d+[.]xml.rels/)) {
96108
match = entry.path.match(/xl\/worksheets\/_rels\/sheet(\d+)[.]xml.rels/);
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});

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,8 @@
6565
"moment": ">=2.19.3",
6666
"node-unzip-2": "^0.2.7",
6767
"promish": ">=5.0.2",
68-
"sax": "^1.2.2"
68+
"sax": "^1.2.2",
69+
"temp": "0.8.3"
6970
},
7071
"devDependencies": {
7172
"@types/node": "*",

0 commit comments

Comments
 (0)