SheetJS и FileSaver (проект vuejs): недостаточно памяти - PullRequest
0 голосов
/ 18 апреля 2019

Я работаю над следующей проблемой: я хочу загрузить файл .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, но я не уверен.

Итак, я искал решение и думал о потоках. Вместо того, чтобы генерировать весь объект, а затем пытаться записать его, я хотел бы писать при генерации строк и писать строку за строкой.память, верно?

Пока я не смог найти что-нибудь о том, как это сделать (никогда раньше не работал с потоками и т. д.). Основная проблема - память, так как проект должен быть в автономном режиме и должен запускаться на локальном компьютере.ОЗУ / система).

1 Ответ

0 голосов
/ 23 апреля 2019

Решение для загрузки моего большого объема данных (еще не полностью) было найдено здесь:

Javascript: экспорт больших текстовых / CSV-файлов приводит к сбою Google Chrome

в настоящее время работает над информацией о строках ( Как экспортировать информацию массива JavaScript в csv (на стороне клиента)? ), но этот пост должен помочь всем, кто сталкивается с такой проблемой

...