我正在使用node.js包'xlsx'来读取excel文件。从文件系统同步读取文件工作正常,但流式传输有点棘手。 (该文件是远程提供的,我只能将其作为流接收。)本地流式文件会产生同样的问题,因此很容易重现。
我已按照此处的示例进行操作:https://www.npmjs.com/package/xlsx但是根据方法获取“已达到数据的结尾”或“不支持的文件”。
public class Context : ApplicationContext
{
public Context()
{
var appHost = new AppHost(i, (ILayout)f);
appHost.Init();
appHost.Start(listeningOn);
}
}
public class AppHost : AppSelfHostBase
{
private readonly Init _init;
private readonly ILayout _activeForm;
public AppHost(Init i, ILayout f)
: base("ClientService", typeof(ClientService).Assembly)
{
_init = i;
_activeForm = f;
}
public override void Configure(Container container)
{
container.Register("init",_init);
container.Register("layout", _activeForm);
}
}
public class ClientService : Service
{
private Init _initConf;
public HttpResult Post(Person request)
{
_initConf = ServiceStackHost.Instance.Container.ResolveNamed<Init>("init");
}
}
重新组装xlsx二进制文件以供本地使用的正确方法是什么?
答案 0 :(得分:0)
当前library不支持阅读流
来自docs:
关于流媒体阅读的说明
最常见和最有趣的格式(XLS,XLSX / M,XLSB,ODS)最终是ZIP或CFB文件容器。两种格式都不将目录结构放在文件的开头:ZIP文件将中央目录记录放在逻辑文件的末尾,而CFB文件可以将FAT结构放在文件的任何位置!因此,要正确处理这些格式,流功能必须在开始之前缓冲整个文件。这掩盖了流媒体的期望,因此我们不提供任何流式读取API。如果你真的想要流式传输,那么像concat-stream这样的节点模块会为你做缓冲。
xlsx 包中的流写入something:
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和其他格式。
在我的情况下,我不得不重写一切=(