sheet_to_json 生成错误数组

sheet_to_json producing bad array of array

使用 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>

然后我有一个表示与数据的一对一关系的接口 table,我会定义整个接口,但是大约有 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
  3. 获取 FileReader 结果并将其转换为 XLSX.WorkBook
    • 如果用户上传空工作簿,则取消设置 loading 属性 和 return
  4. 获取工作簿的第一个工作表
  5. 尝试使用 XLSX.utils.sheet_to_json<T> 方法将工作表转换为 IRequestItem 的数组

在第 5 步之前一切似乎 运行 都很好,但是如果在该行设置调试器,控制台中的输出是一个数组数组。

我不明白的是,我通过在 SSMS 中查询 table 创建 .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
});