Как читать данные из столбца A из Excel

#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)