[英]Getting decimal from (10:10:00) while trying to load an xlsx excel file with a JavaScript library
[英]Node: trying to stream an Excel file and pass the buffer to 'xlsx' library
我正在使用 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"});
});
}
重新组装 xlsx 二进制文件以供本地使用的正确方法是什么?
当前库不支持读取流
从他们的文档:
流式读取注意事项
最常见和最有趣的格式(XLS、XLSX/M、XLSB、ODS)最终是文件的 ZIP 或 CFB 容器。 这两种格式都没有将目录结构放在文件的开头:ZIP 文件将中央目录记录放在逻辑文件的末尾,而 CFB 文件可以将 FAT 结构放在文件的任何位置! 因此,为了正确处理这些格式,流函数必须在开始之前缓冲整个文件。 这与流式传输的期望背道而驰,因此我们不提供任何流式读取 API。 如果你真的想流式传输,有像 concat-stream 这样的节点模块可以为你做缓冲。
有一些东西可以在xlsx包中写入流:
流写入函数在 XLSX.stream 对象中可用。 它们采用与普通写函数相同的参数,但返回可读流。 它们仅在节点中公开。
XLSX.stream.to_csv 是 XLSX.utils.sheet_to_csv 的流媒体版本。
XLSX.stream.to_html 是 XLSX.utils.sheet_to_html 的流媒体版本。
我已经写信支持询问Pro版本是否有它并收到了这个答案:
XLSX 中使用的 zip 格式阻止了真正的流读取(您必须读取到文件的末尾才能找出所有子文件的位置)。 我不会使用https://github.com/thejoshwolfe/yauzl#no-streaming-unzip-api的极端主义语言,但我同意核心信息:
任何提供流式解压缩 API 的库[都是]不诚实或不符合规范(通常是后者)。
我们提供基于事件的阅读,它跳过构建完整的工作簿对象。 您收到行对象并最大限度地减少内存压力。
在写入方面,我们提供基于流的 XLSX 写入以及 SpreadsheetML 和其他格式。
就我而言,我不得不重写所有内容 =(
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.