Angular 6 читает файл XLS и сохраняет его в переменную - PullRequest
0 голосов
/ 30 ноября 2018

Я пытался прочитать файл XLS и сохранить его в локальную переменную для простоты использования, но я постоянно получаю

TypeError: Cannot set property 'songs' of undefined

Я никогда не пытался читать XLS, прежде чем только CSV, которыйнамного проще, но, к сожалению, файлы не могут быть конвертированы.

Это код, который используется в настоящее время:

public songs;

readFile(which_file: string) {
    this.actuallyReadFile().then((data) => {
        var workbook = XLSX.read(data, {
            type: 'binary'
        });

        workbook.SheetNames.forEach(function (sheetName) {
            console.log(XLSX.utils.sheet_to_row_object_array(workbook.Sheets[sheetName]));
            this.songs = XLSX.utils.sheet_to_row_object_array(workbook.Sheets[sheetName]);
        })

    })
}

actuallyReadFile() {
    var reader = new FileReader();

    return new Promise((resolve, reject) => {
        reader.onload = function (e) {
            resolve(reader.result);
        };

        reader.onerror = function (ex) {
            console.log(ex);
        };

        reader.readAsBinaryString(this.file);
    });
}

Я также попытался сначала упорядочить объект, но это все равно приводит кта же ошибка.

Ответы [ 2 ]

0 голосов
/ 30 ноября 2018

В итоге я решил свою проблему, удалив цикл forEach:

this.songs = <any>XLSX.utils.sheet_to_row_object_array(workbook.Sheets[workbook.SheetNames[0]]);

Еще одна вещь, которая работала, это создание временной переменной вне цикла forEach и затем присвоение ей this.songs.Я не знаю, почему это то, что я должен был сделать, но, по крайней мере, это сработало, и мне нужен только первый лист, так что.

0 голосов
/ 30 ноября 2018

Я не уверен, будет ли это работать или нет, но вы можете попробовать это:

Добавить эту строку:

 var ref = this;

До:

workbook.SheetNames.forEach(function (sheetName) {
 console.log(XLSX.utils.sheet_to_row_object_array(workbook.Sheets[sheetName]));
 // add use ref.songs and then try
 ref.songs = XLSX.utils.sheet_to_row_object_array(workbook.Sheets[sheetName]);
 })

Окончательный код:

 var ref = this;

 workbook.SheetNames.forEach(function (sheetName) {
 console.log(XLSX.utils.sheet_to_row_object_array(workbook.Sheets[sheetName]));
 // add use ref.songs and then try
 ref.songs = XLSX.utils.sheet_to_row_object_array(workbook.Sheets[sheetName]);
 })

Если это не работает для вас, пожалуйста, предоставьте пример StackBlitz!

...