sheet_to_json产生数组错误的数组

问题描述

使用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);
}

基本上,它会执行以下操作:

  1. 设置当前步骤的loading属性
  2. 使用FileReader获取文件内容
  3. 获取FileReader结果并将其转换为XLSX.WorkBook
  4. 获取工作簿的第一个工作表
  5. 尝试使用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
});