Изменение файла xlsx с помощью ExcelJS и NodeJS

Моя цель здесь - прочитать файл xlsx, добавить строку и вывести ее. Достаточно просто, верно?

Это код, который у меня есть до сих пор:

var filename1="input.xlsx";
var filename2="output.xlsx";
var Excel = require('exceljs');
var workbook = new Excel.Workbook();
workbook.xlsx.readFile(filename1);
workbook.getWorksheet("Sheet 1").addRow([1,2,3]);
workbook.xlsx.writeFile(filename2);

Я считаю, что это должно читать эти данные из «input.xlsx», записывать строку в дополнение к данным, уже находящимся на листе, и выводить их. Вместо копирования файла создается пустой файл «output.xlsx».

Я знаю, что делаю что-то глупое, к тому же я совершенно новичок в nodeJS. Какие-нибудь мысли?


person Display name    schedule 17.02.2017    source источник
comment
У вас действительно есть лист 1 в первой книге? В моем Excel имя листа по умолчанию — Sheet1 (без пробела)   -  person Michael Tallino    schedule 17.02.2017
comment
Я добавлю, что основные операции в exceljs кажутся нормальными, но прежде чем зайти слишком далеко, просмотрите средство отслеживания проблем на GitHub и убедитесь, что все необходимые вам функции работают адекватно.   -  person Michael Tallino    schedule 17.02.2017
comment
На самом деле, я изменил Лист 1 из документа Excel, с которым я работаю, с чего-то другого, потому что имя листа - это чье-то имя, и я не хочу публиковать его в Интернете... Достаточно сказать, что я дважды проверил, и название правильное.   -  person Display name    schedule 17.02.2017


Ответы (1)


Проблема, с которой вы столкнулись, связана с асинхронным характером Node.js. Когда вы вызываете readFile(filename1), он начинает читать файл. Но это асинхронная (неблокирующая) функция, поэтому код после этой строки выполняется до завершения чтения.

Есть несколько способов справиться с этим: обратные вызовы (вызываются при выполнении асинхронного вызова), промисы (.then будет вызываться при выполнении вызова), генераторы ES6 и ключевые слова ES7 async/await.

exceljs работает с промисами (согласно документации), поэтому вы можете сделать следующее:

'use strict';

const Excel = require('exceljs');
let filename1 = 'input.xlsx';
let filename2 = 'output.xlsx';
let workbook = new Excel.Workbook();
workbook.xlsx.readFile(filename1)
    .then(() => {
        workbook.getWorksheet('Sheet 1').addRow([1, 2, 3]);
        return workbook.xlsx.writeFile(filename2);
    }).then(() => {
        console.log('File is written');
    }).catch(err => console.error(err));

Также убедитесь, что «Лист 1» действительно существует, потому что для меня имя по умолчанию было «Лист 1».

На эту тему есть много статей подобных этой. в Интернете.

person Antonio Narkevich    schedule 17.02.2017
comment
Используя текущую версию exceljs (1.0.0), я пытаюсь изменить простой лист книги, содержащий другой лист с поворотом. Действие повреждает книгу, и если я восстановлю ее с помощью Excel, она потеряет опорную точку :( - person Alexander; 18.03.2018
comment
@ Александр, не могли бы вы предоставить исходный код того, что вы делаете? В идеале, пожалуйста, создайте отдельный вопрос и пришлите мне ссылку. - person Antonio Narkevich; 21.03.2018
comment
Спасибо @Антонио Наркевич. Это было сделано с помощью вашего кода (просто прочитайте, добавьте строку на пустой лист и сохраните). И это портит Excel (просто попробуйте выполнить это в рабочей книге с опорной точкой). Затем я попробовал несколько пакетов NodeJS и не нашел ни одного, который бы нормально работал с пивотом. Наконец, я написал свой код на Python, так как у него есть библиотека, которая не портит Excel с помощью сводки (openpyxl). - person Alexander; 22.03.2018