使用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获取文件内容
- 读取文件内容后将执行步骤3
- 获取FileReader结果并将其转换为
XLSX.WorkBook
- 如果用户上载了一个空工作簿,则取消设置
loading
属性并返回
- 如果用户上载了一个空工作簿,则取消设置
- 获取工作簿的第一个工作表
- 尝试使用
XLSX.utils.sheet_to_json<T>
方法将工作表转换为IRequestItem
的数组
在第5步之前,一切似乎都运行良好,但如果在那一行设置调试器,控制台中的输出将是数组。
我不明白的是,我正在创建.xlsx
文件,方法是查询SSMS中的表,将结果导出为.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
});