SheetJS和FileSaver(vuejs项目):内存不足

时间:2019-04-18 11:11:34

标签: javascript out-of-memory js-xlsx sheetjs

我正在解决以下问题:我想下载一个.xlsx文件(单击),使用SheetJS创建工作簿,并使用FileSaver保存文件。我遇到的问题是,当超过约10万行时,无法写入文件。 我如何构建整个过程的代码片段(主要取自sheetjs示例和以下教程https://www.youtube.com/watch?v=41rOAt-zCu4):

 let wb = XLSX.utils.book_new()
        wb.Props = {
          Title: 'Test Sheet',
          Subject: 'Test file',
          Author: 'Firstname Lastname'
        }
        // create worksheet in new workbook, write data, use array of arrays
        wb.SheetNames.push('Sheet1')
        // rowData is the array of arrays bigger than 90k
        let wsData = rowData
        let ws = XLSX.utils.aoa_to_sheet(wsData)
        wb.Sheets['Sheet1'] = ws
        let wbout = XLSX.write(wb, {bookType: 'xlsx', type: 'binary'})
        // until here the workbook with the test sheet is created, but not ready to be downloaded by user
        // for saving, we use file-saver. it needs a different format (octet), which can be generated
        // using the s2ab function
        function s2ab (s) {
          let buf = new ArrayBuffer(s.length)
          let view = new Uint8Array(buf)
          for (var i = 0; i < s.length; i++) view[i] = s.charCodeAt(i) & 0xFF
          return buf
        }
        FileSaver.saveAs(new Blob([s2ab(wbout)], {type: 'application/octet-stream'}), 'test.xlsx')

我本来打算编写几个excel表格,每个表格有90000行,但是我认为这没关系,因为我要编写的对象对于本地内存太大了吗?而且我认为该错误是由生成八位位组格式的文件保存程序生成的,但是我不确定。

因此,我正在寻找解决方案,因此想到了流。我不想生成整个对象然后尝试编写它,而是想在生成行时编写并逐行编写。这不应该耗尽我的记忆,对吧?

但是,我找不到有关如何执行操作的任何信息(以前从未在流中使用过)。主要问题是内存,因为项目必须脱机并且必须在本地RAM /系统上运行。

1 个答案:

答案 0 :(得分:0)

在这里找到了下载大量数据(尚未完全完成)的解决方案:

Javascript: Exporting large text/csv file crashes Google Chrome

当前正在处理行信息(How to export JavaScript array info to csv (on client side)?),但是这篇文章应该对遇到这种问题的任何人都提供帮助