LPG*_*LPG 4 javascript excel xlsx node.js
我正在使用 node.js 包“xlsx”来读取 Excel 文件。从文件系统同步读取文件工作正常,但流式传输有点棘手。(该文件是远程提供的,我只能以流的形式接收它。)本地流文件会产生相同的问题,因此很容易重现。
我遵循了这里的示例: https: //www.npmjs.com/package/xlsx,但根据方法得到“已达到数据结尾”或“不受支持的文件”。
const XLSX = require('xlsx');
const fs = require('fs');
const stream = fs.createReadStream('sample.xlsx');
// This function returns Error: Unsupported file 48
documentedExample = function(){
var arr = new Array();
stream.on('data', function( arraybuffer ){
var data = new Uint8Array(arraybuffer);
for(var i = 0; i != data.length; ++i) arr[i] = String.fromCharCode(data[i]);
});
stream.on('end', function(){
var bstr = arr.join("");
var workbook = XLSX.read(bstr, {type:"binary"});
});
}
// This function returns Error: End of data reached (data length = 75589, asked index = 77632). Corrupted zip ?
alternateExample = function(){
var bufferArray = [];
stream.on('data', function( thisChunk ){
bufferArray.push( thisChunk );
});
stream.on('end', function(){
var excelDataBuffer = bufferArray.join("");
excelDataBuffer = excelDataBuffer.toString();
var workbook = XLSX.read(excelDataBuffer, {type:"binary"});
});
}
Run Code Online (Sandbox Code Playgroud)
重新组装 xlsx 二进制文件以供本地使用的正确方法是什么?
当前图书馆不支持流读取
\n从他们的文档中:
\n\n\n流式读取注意事项
\n最常见和最有趣的格式(XLS、XLSX/M、XLSB、ODS)最终是 ZIP 或 CFB 文件容器。这两种格式都不将目录结构放在文件的开头:ZIP 文件将中央目录记录放在逻辑文件的末尾,而 CFB 文件可以将 FAT 结构放在文件中的任何位置!因此,为了正确处理这些格式,流函数必须在开始之前缓冲整个文件。这违背了流式传输的期望,因此我们不提供任何流式读取 API。如果你真的想要流式传输,有像 concat-stream 这样的节点模块可以为你做缓冲。
\n
xlsx包中有一些用于在流中写入的内容:
\n\n\nXLSX.stream 对象中提供了流式写入功能。它们采用与普通写入函数相同的参数,但返回一个可读流。它们仅在节点中公开。
\nXLSX.stream.to_csv 是 XLSX.utils.sheet_to_csv 的流版本。
\nXLSX.stream.to_html 是 XLSX.utils.sheet_to_html 的流版本。
\n
我已经写信支持询问 do Pro版是否有它并收到了这个答案:
\n\n\nXLSX 中使用的 zip 格式会阻止真正的流读取(您必须读取到文件末尾才能找出所有子文件的位置)。我不会\xe2\x80\x99t使用https://github.com/thejoshwolfe/yauzl#no-streaming-unzip-api的极端语言但我同意核心信息:
\n任何提供流式解压缩 API 的库要么是不诚实的,要么是不合格的(通常是后者)。
\n我们提供基于事件的阅读,这会跳过构建完整的工作簿对象。您收到行对象,这可以最大限度地减少内存压力。
\n在写入方面,我们提供基于流的 XLSX 写入以及 SpreadsheetML 和其他格式。
\n
就我而言,我不得不重写一切=(
\n| 归档时间: |
|
| 查看次数: |
18217 次 |
| 最近记录: |