为了方便使用,我一直在尝试读取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示例!