Использование потока для изменения существующего файла Excel с помощью ExcelJS

У меня есть файл Excel с шаблоном, и мне нужно записать данные в файл, используя читаемый поток, а затем передать обратно полученный файл в ответ сервера для загрузки.

Это то, что я получил до сих пор, используя exceljs. Но это не «настоящая» потоковая передача, потому что книга была сохранена в памяти перед отправкой в ​​ответ.

const path = require('path')
const Excel = require('exceljs')
const dao = require('./dao')

const stream = dao.getData().stream()
const workbook = new Excel.Workbook()

workbook.xlsx.readFile(path.join(__dirname, 'Template.xlsx'))
.then(() => {
  const detailSheet = workbook.getWorksheet('Detail')
  detailSheet.columns = colName.header.detail

  stream.on('data', (d) => {
    detailSheet.addRow(d).commit()
  })

  stream.on('end', () => {
    workbook.xlsx.write(res)
  })
})

person Truong    schedule 13.03.2018    source источник


Ответы (1)


Я предполагаю, что вы используете exceljs (пакет ExcelJS). В противном случае это не применимо.

Вы инициализируете свои книги по-другому, если хотите использовать потоковую передачу. Вместо того, чтобы настраивать книгу с помощью конструктора, вы должны сделать что-то вроде:

const workbook = new Excel.stream.xlsx.WorkbookReader(options);

Где варианты:

{
    filename: 'filename'
}

Интерфейс для записи Excel.stream.xlsx.WorkbookWriter(options);

После этого все остальное можно делать так же. Пакет действительно перечисляет некоторые незначительные отличия:

  • После того, как лист добавлен в книгу, его нельзя удалить.
  • После фиксации строки она становится недоступной, так как она будет удалена с рабочего листа.
  • unMergeCells () не поддерживается.

Пока вы можете работать в рамках этих ограничений, вариант потоковой передачи, вероятно, будет для вас наиболее эффективным с точки зрения памяти.

person dkimot    schedule 13.03.2018
comment
Спасибо, @dkimot. Функция WorkbookReader не упоминается в документации ExcelJs, это все, что я смог найти: github.com/guyonroche / exceljs / issues / 63, но кажется, что мне нужно получить все данные из книги шаблонов и снова вставить их в новую книгу? Смысл использования шаблона здесь в том, что есть некоторый код vba, который я хочу использовать в книге результатов, поэтому мне интересно, как я могу сохранить этот код vba? - person Truong; 13.03.2018
comment
Я покопался в коде. Сначала я нашел код, ссылающийся на него, на github.com/guyonroche/ exceljs / blob / master / lib / exceljs.nodejs.js. Я не очень хорошо знаком с этим пакетом. Насколько я понимаю, все, что было в файле книги, останется в книге. - person dkimot; 13.03.2018
comment
Извините, я все еще не могу это понять. Когда я использую Excel.stream.xlsx.WorkbookReader для потоковой передачи книги шаблонов, я не могу изменять ее напрямую (потому что workbook.getWorkSheet (...) не существует) - person Truong; 13.03.2018
comment
Хорошо, потому что документация некорректна, я копаюсь в коде. Это привело к объекту чтения книги на github .com / guyonroche / exceljs / blob / master / lib / stream / xlsx /. Внутри этого, похоже, будет событие, которое называется «рабочий лист». Вы можете это проверить? - person dkimot; 13.03.2018