问题描述
使用Angular 9,我正在构建一个步骤向导,第一步是读取并解析.xlsx
文件。
<form [formGroup]="steps[currentStep].form">
<label>Select File to Process</label>
<input accept=".xlsx"
autocomplete="off"
floatPlaceholder="always"
formControlName="input"
placeholder="Input"
type="file"
(change)="fileChanged($event)">
</form>
然后我有一个接口,它表示与数据表的一对一关系,我将定义整个接口,但是有大约100列(在我的控件之外,它们都被可怕地命名了)。但它基本上看起来像:
export interface IRequestItem {
ReqItemId: number;
ReqNum?: string;
_ReqItem?: number;
CatNum?: number;
// ... etc.
}
这个想法是,用户将使用输入上载.xlsx
文件,然后将创建一个IRequestItem数组。为此,以下是设置fileChanged事件处理程序的方式:
fileChanged(e): void {
this.steps[this.currentStep].loading = true;
const reader = new FileReader();
const file = e.target.files[0];
reader.onload = (event) => {
const data = reader.result;
const workBook = XLSX.read(data,{ type: 'binary' });
if (workBook.SheetNames.length === 0) {
this.steps[this.currentStep].loading = false;
return;
}
const worksheet = workBook.Sheets[workBook.SheetNames[0]];
this.workSheet = XLSX.utils.sheet_to_json<IRequestItem>(worksheet,{
blankrows: false,header: 1,raw: true,rawNumbers: true
});
this.steps[this.currentStep].loading = false;
};
reader.readAsBinaryString(file);
}
基本上,它会执行以下操作:
- 设置当前步骤的
loading
属性 - 使用FileReader获取文件内容
- 获取FileReader结果并将其转换为
XLSX.WorkBook
- 获取工作簿的第一个工作表
- 尝试使用
IRequestItem
方法将工作表转换为XLSX.utils.sheet_to_json<T>
的数组
一切似乎都可以正常运行,直到第5步为止,但是如果在那一行上安装调试器,则控制台中的输出就是一个数组数组。
对此我不了解的是,我正在通过查询SSMS中的表来创建.xlsx
文件,将结果导出为.CSV
文件,然后使用.xlsx
扩展名(在Microsoft Excel中)。因此,我知道,不仅文件设置正确,而且数据也代表合法的IRequestItem。
解决方法
经过长时间的搜索,我意识到我误读了文档。对于https://docs.sheetjs.com/#json,我在Sheet2JSONOpts中指定了错误的header
属性。相反,它应该是:
this.workSheet = XLSX.utils.sheet_to_json<IRequestItem>(worksheet,{
blankrows: false,header: 'A',raw: true,rawNumbers: true
});