Angular 6读取XLS文件并将其保存到变量中

时间:2018-11-30 04:03:02

标签: typescript jxls

我一直在尝试读取XLS文件并将其保存到本地变量中,以便于使用,但是我一直在获取

TypeError: Cannot set property 'songs' of undefined

我从来没有尝试过仅用csv读取XLS,但很容易,但是不幸的是文件无法转换。

这是当前正在使用的代码:

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 :(得分:0)

我不确定是否可以使用,但是您可以尝试以下方法:

添加此行:

 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示例!

答案 1 :(得分:0)

我最终通过删除forEach循环解决了我的问题:

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

另一有用的方法是在上述forEach循环之外制作一个temp变量,然后为其分配this.songs。我不知道为什么这是我要做的,但至少它能奏效,所以我只需要第一张纸即可。