Я работаю над следующей проблемой: я хочу загрузить файл .xlsx (по щелчку), используя SheetJS для создания рабочей книги и FileSaver для сохранения файла.Проблема, с которой я сталкиваюсь, заключается в том, что при превышении примерно 100 тыс. Строк файл не может быть записан.Фрагмент кода того, как я строю весь процесс (в основном взят из примеров 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 строками, но я предполагаю,, это не имеет значения, потому что объект, который я хочу написать, просто слишком велик для локальной памяти? И я думаю, что ошибка создается файловой заставкой при создании формата octet, но я не уверен.
Итак, я искал решение и думал о потоках. Вместо того, чтобы генерировать весь объект, а затем пытаться записать его, я хотел бы писать при генерации строк и писать строку за строкой.память, верно?
Пока я не смог найти что-нибудь о том, как это сделать (никогда раньше не работал с потоками и т. д.). Основная проблема - память, так как проект должен быть в автономном режиме и должен запускаться на локальном компьютере.ОЗУ / система).