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);
}
基本上它做了以下事情:
- 设置当前步骤的
loading
属性
- 使用 FileReader 获取文件内容
- 读取文件内容后执行步骤3
- 获取 FileReader 结果并将其转换为
XLSX.WorkBook
- 如果用户上传空工作簿,则取消设置
loading
属性 和 return
- 获取工作簿的第一个工作表
- 尝试使用
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
});
使用 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);
}
基本上它做了以下事情:
- 设置当前步骤的
loading
属性 - 使用 FileReader 获取文件内容
- 读取文件内容后执行步骤3
- 获取 FileReader 结果并将其转换为
XLSX.WorkBook
- 如果用户上传空工作簿,则取消设置
loading
属性 和 return
- 如果用户上传空工作簿,则取消设置
- 获取工作簿的第一个工作表
- 尝试使用
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
});