我一直在尝试读取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);
});
}
我也尝试过先对对象进行字符串化,但是仍然会导致相同的错误。
答案 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
。我不知道为什么这是我要做的,但至少它能奏效,所以我只需要第一张纸即可。