#javascript #node.js #excel
#JavaScript #node.js #Excel
Вопрос:
Я пытаюсь получить данные из заданного столбца из Excel в nodejs (например, столбец «Электронные письма»), поработать с данными, а затем экспортировать результат в тот же Excel, в новый столбец с именем «Электронные письма-результат».
Это то, что я попробовал, извлекая данные:
const xlsx = require('xlsx');
const emails = [];
var workbook = xlsx.readFile(`./view/assets/uploads/${filename}`);
var first_sheet_name = workbook.SheetNames[0];
var address_of_cell = 'Emails';
var worksheet = workbook.Sheets[first_sheet_name];
var desired_cell = worksheet[address_of_cell];
emails.push(desired_cell.v);
console.log(emails);
но я получаю эту ошибку:
TypeError: Cannot read property 'v' of undefined
таким образом, данные не могут быть извлечены.
Кроме того, как я могу создать новый столбец (если он не существует) и добавить в него результат?
Какие-нибудь идеи, пожалуйста?
Комментарии:
1. дважды проверьте, завершается ли ваш столбец электронной почты, возможно, вы написали его с ошибкой, ошибка говорит о том, что такая ячейка не найдена
2. да, столбец существует и написан правильно. должна быть другая ошибка
3. console.log(desired_cell) и посмотреть, что у вас внутри
4. « undefined « — это вывод
Ответ №1:
Вы не можете просто передать строку и ожидать, что получите этот столбец, вы должны найти имя ячеек, которые вы будете накапливать.
const columnName = Object.keys(worksheet).find(key=> worksheet[key].v === address_of_cell);
Поиск имени выполняется путем передачи «электронных писем» и поиска, какие имена ячеек должны быть проанализированы.
Это будет работать:
const xlsx = require('xlsx');
const emails = [];
var workbook = xlsx.readFile(`./view/assets/uploads/${filename}`);
var first_sheet_name = workbook.SheetNames[0];
var address_of_cell = 'Emails';
var worksheet = workbook.Sheets[first_sheet_name];
const columnName = Object.keys(worksheet).find(key=> worksheet[key].v === address_of_cell);
for (let key in worksheet) {
if (key.toString()[0] === columnName[0]) {
emails.push(worksheet[key].v);
}
}
console.log('Result list', emails)
Аналогично, вместо цикла for в цикле вы могли бы оставаться функциональными и избегать объявления массива и ссылки на объект рабочего листа
const emails = Object.entries(worksheet)
.filter(([key, value]) => key.toString()[0] === columnName[0])
.map(([key, value]) => value.v)