Próbuję uzyskać dane z danej kolumny z programu Excel w NodeJs (na przykład kolumny "e-maile"), pracuj z danymi, a następnie wyeksportuj wynik w tym samym programie Excel, w nowej kolumnie o nazwie "e-maile - wynik" .

Tutaj próbowałem pobierać dane:

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

Ale otrzymuję ten błąd:

TypeError: Cannot read property 'v' of undefined

Dane, więc dane nie zostały pobrane.

Także, jak mogę wykonać nową kolumnę (jeśli nie istnieje) i dodaj wynik w nim?

Jakieś pomysły?

2
Bogdan Doncea 29 październik 2020, 16:54

1 odpowiedź

Najlepsza odpowiedź

Nie możesz po prostu przekazać ciągów i spodziewać się, że otrzymasz tę kolumnę, musisz znaleźć nazwę komórek, które otrzymasz.

const columnName = Object.keys(worksheet).find(key=> worksheet[key].v === address_of_cell);

Znalezienie nazwy odbywa się, przekazując "e-maile" i wyszukiwanie, które nazwy komórki mają być analizowane.

To zadziała:

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)

Podobnie zamiast w pętli w pętli możesz pozostać funkcjonalny i uniknąć deklaracji tablicy i odniesienia do arkusza arkusza

const emails = Object.entries(worksheet)
  .filter(([key, value]) => key.toString()[0] === columnName[0])
  .map(([key, value]) => value.v)
1
Eugen Sunic 29 październik 2020, 15:33