xlsx-js从stdin解析

时间:2015-11-25 07:01:20

标签: javascript node.js xlsx

我尝试使用xlsx-js(v0.8.0)解析文件,该文件通过stdin传送。

以下代码:

const data = fs.readFileSync('/dev/stdin').toString();
wb = xlsx.read(data, {type: 'binary'});      
当我将文件(在mac上)管道化为cat foo.xlsx |时,

失败node test.js:

```

  

抛出新的错误("损坏的zip:无法找到中央指挥的结尾                     ^错误:损坏的zip:无法在Object.ZipEntries.readEndOfCentral找到中心目录的末尾   (/Volumes/Macintosh_HD/Users/shauncutts/src/crane-parse-monthly/node_modules/jszip/lib/zipEntries.js:135:19)   在Object.ZipEntries.load   (/Volumes/Macintosh_HD/Users/shauncutts/src/crane-parse-monthly/node_modules/jszip/lib/zipEntries.js:197:14)   在Object.ZipEntries   (/Volumes/Macintosh_HD/Users/shauncutts/src/crane-parse-monthly/node_modules/jszip/lib/zipEntries.js:21:14)   at Object.module.exports [as load]   (/Volumes/Macintosh_HD/Users/shauncutts/src/crane-parse-monthly/node_modules/jszip/lib/load.js:11:18)   在Object.JSZip   (/Volumes/Macintosh_HD/Users/shauncutts/src/crane-parse-monthly/node_modules/jszip/lib/index.js:39:14)   在read_zip   (/Volumes/Macintosh_HD/Users/shauncutts/src/crane-parse-monthly/node_modules/xlsx/xlsx.js:11375:38)   at Object.readSync [as read]   (/Volumes/Macintosh_HD/Users/shauncutts/src/crane-parse-monthly/node_modules/xlsx/xlsx.js:11396:11)

但是,我可以通过以下方式阅读相同的文件:

wb = xlsx.readFile(fn);

没有问题。我应该如何修改我的代码以便能够读取管道文件?

1 个答案:

答案 0 :(得分:1)

再次感谢@LazarevAlexandr ......实际上问题是readFile & readFileSync have problems with stdin。以下代码有效:

  let wb;
  const chunks = [];
  process.stdin
    .on("data", function(chunk) { chunks.push(chunk); })
    .on("end", function() { 
      const buffer = Buffer.concat(chunks);
      wb = xlsx.read(buffer, {binary: true});

      // (call your favorite async continuation method here...)
    });

(注意 - 尝试在@ mbostock的测试中将二进制选项传递给readFileSync,它们仍然停在65535处。)