流式写入Microsoft Excel文件

时间:2018-04-09 14:22:34

标签: excel openxml

我正在尝试在浏览器应用程序中生成非常大的Microsoft Excel文件。虽然有JavaScript库允许我从浏览器生成XLSX文件,但它们的问题是它们需要在写入之前将所有文档内容加载到内存中,这给了我可以存储多少内容的上限在浏览器崩溃之前的单个文件中。因此,我希望有一个写入流,允许我使用类似StreamSaver.js的内容将数据顺序写入Excel文件。

用CSV做这样的事情是微不足道的:

for (let i = 0; i < paginatedRequest.length; i++) {
    writer.write(paginatedRequest[i].join(",") + "\n");
}

上面的方法允许我将非常大量的CSV行写入输出流,而不必将所有数据存储在内存中。我的问题是:这在技术上是否可以使用XLSX文件?

我主要担心的是内部XLSX文件是ZIP存档,所以我的第一个想法是使用未压缩的ZIP存档并对其进行流写入,但ZIP存档中的每个文件都带有一个标题,表示其大小和我事先不可能知道。有没有我可以使用的解决方法?

最后,如果不可能,是否有其他可流式电子表格格式可以在Excel中打开并“看起来不错”? (有一个带有.fods扩展名的平面OpenDocument规范,所以我可以将写入流传输到这样的文件。遗憾的是,Microsoft Office不支持平面OpenDocument文件。)

1 个答案:

答案 0 :(得分:0)

一种可能的解决方案是生成一个小的静态XLSX文件,该文件使用Excel Data Model导入外部CSV文件。由于生成流式CSV文件几乎是微不足道的,这可能是一个可行的解决方案。但是,它有些令人不满意:

  1. 让用户下载两个文件而不是一个(或者他们需要解压缩的压缩文件)相当烦人。
  2. Excel不支持相对于外部CSV文件的路由,因此我们还需要一个宏来确保每次打开文件时都更新路由(如果可行的话)。这需要用户接受宏的使用,这带有安全警告,对他们来说并不是非常好。