Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typescript Angular 6读取XLS文件并将其保存到变量中_Typescript_Jxls - Fatal编程技术网

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

Typescript Angular 6读取XLS文件并将其保存到变量中,typescript,jxls,Typescript,Jxls,我一直在尝试读取XLS文件并将其保存到局部变量中以便于使用,但我不断地得到 TypeError: Cannot set property 'songs' of undefined 我从来没有尝试过读取XLS之前只有csv的,这是容易得多,但不幸的是,文件无法转换 这是当前正在使用的代码: public songs; readFile(which_file: string) { this.actuallyReadFile().then((data) => { va

我一直在尝试读取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);
    });
}

我也尝试过先串接对象,但仍然会导致相同的错误。

我不确定它是否有效,但您可以尝试以下方法:

添加此行:

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

我通过删除forEach循环来解决问题:

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

另一个有效的方法是在所说的forEach循环外生成一个temp变量,然后将
this.songs
赋值给该变量。我不知道为什么我必须这样做,但至少它起作用了,我只需要第一张表。

我想它的问题与
这个
有关,你是否尝试将值直接分配给console,而不是分配给局部变量?在该行的正上方有一个console日志,它会输出json数组,将其引用存储到一个变量中,并使用它,如
var ref=this
ref.song=yourvalue
@amedeios添加了一个答案,请检查!是的,它仍然给了我设置song为null的错误,我认为这与循环和作用域有关