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



为了方便使用,我一直在尝试读取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);
});
}

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

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

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

另一件有效的事情是在所说的forEach循环之外创建一个临时变量,然后将this.songs分配给它。我不知道为什么这是我必须做的,但至少它起了作用,我只需要第一张纸

我不确定它能不能工作,但你可以试试这个:

添加此行:

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

最新更新