SheetJS 和 FileSaver(vuejs 项目):运行 内存不足
SheetJS and FileSaver (vuejs project): running out of memory
我正在解决以下问题:我想使用 SheetJS 下载 .xlsx 文件(单击)以创建工作簿并使用 FileSaver 保存文件。我遇到的问题是,当超过大约 100k 行时,文件无法写入。
我如何构建整个过程的代码片段(主要取自 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-sheets,每张有 90000 行,但我认为这并不重要,因为我想写的对象对于本地内存来说太大了?而且我认为错误是由文件保护程序在生成八位字节格式时产生的,但我不确定。
所以,我在寻找解决方案时想到了流。我不想生成整个对象然后尝试写入它,而是想在生成行的同时写入并逐行写入。这应该不会占用我的内存吧?
但是我找不到任何关于如何做到这一点的信息(之前从未使用过流等等)。主要问题是内存,因为项目必须离线并且必须 运行 在本地 RAM/system).
在这里找到了下载我的大量数据(尚未完全完成)的解决方案:
Javascript: Exporting large text/csv file crashes Google Chrome
目前正在处理行信息 (How to export JavaScript array info to csv (on client side)?),但这 post 应该可以帮助任何遇到此类问题的人
我正在解决以下问题:我想使用 SheetJS 下载 .xlsx 文件(单击)以创建工作簿并使用 FileSaver 保存文件。我遇到的问题是,当超过大约 100k 行时,文件无法写入。 我如何构建整个过程的代码片段(主要取自 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-sheets,每张有 90000 行,但我认为这并不重要,因为我想写的对象对于本地内存来说太大了?而且我认为错误是由文件保护程序在生成八位字节格式时产生的,但我不确定。
所以,我在寻找解决方案时想到了流。我不想生成整个对象然后尝试写入它,而是想在生成行的同时写入并逐行写入。这应该不会占用我的内存吧?
但是我找不到任何关于如何做到这一点的信息(之前从未使用过流等等)。主要问题是内存,因为项目必须离线并且必须 运行 在本地 RAM/system).
在这里找到了下载我的大量数据(尚未完全完成)的解决方案:
Javascript: Exporting large text/csv file crashes Google Chrome
目前正在处理行信息 (How to export JavaScript array info to csv (on client side)?),但这 post 应该可以帮助任何遇到此类问题的人