我的一个 friend 接受客户的订单,基本上要求客户提交包含项目、描述、品牌、数量等字段的 excel 表。但是,当客户提交这些表时,他们并不总是提供相同的表列描述符,因此有时工作表会包含制造商而不是品牌等列或数量的缩写“数量”,或者项目描述而不是仅描述的列,仅举几例。
我正在尝试找到一种方法来基本上制作一个网络工具,让他可以将发送给他的表格制作一个工具来标准化这些列,而无需通过复制/粘贴工作作为辅助工具让我对编程和算法等有更多的了解。
基本上我是这样将 excel 文件导入网页的
import { Component, ElementRef, ViewChild, OnInit, Output } from '@angular/core';
import * as XLSX from 'xlsx';
type ArrayOfArray = any[][];
@Component({
selector: 'app-read-excel',
templateUrl: './read-excel.component.html',
styleUrls: ['./read-excel.component.css']
})
export class ReadExcelComponent implements OnInit {
constructor() {}
ngOnInit () {
}
data: ArrayOfArray = [];
wopts: XLSX.WritingOptions = { bookType: 'xlsx', type: 'array' };
fileName: string = ' ';
onFileChange(evt: any) {
const inputFile: DataTransfer = <DataTransfer>(evt.target);
if (inputFile.files.length !== 1) throw new Error('Cannot use multiple files');
const fileReader: FileReader = new FileReader();
fileReader.onload = (event: any) => {
/* read workbook */
const binaryString: string = event.target.result;
const workBook: XLSX.WorkBook = XLSX.read(binaryString, { type: 'binary', sheetStubs: true});
console.log(typeof binaryString)
/* grab first sheet */
const workSheetName: string = workBook.SheetNames[0];
console.log(workSheetName)
const workSheet: XLSX.WorkSheet = workBook.Sheets[workSheetName];
/* save data */
this.data = <ArrayOfArray>(XLSX.utils.sheet_to_json(workSheet, { header: 1, blankrows: true }));
};
fileReader.readAsBinaryString(inputFile.files[0]);
}
}
在 html 中
<div>
<h3>File Should Show Here</h3>
<input type="file" (change)="onFileChange($event)" multiple="false" />
<table>
<tbody>
<tr *ngFor="let column of data">
<td *ngFor="let val of column">
{{val}}
</td>
</tr>
</tbody>
</table>
</div>
从逻辑上讲,我心中有一个想法,我将在下面概述
if columnheader contains ("brand" or "manufacturer" or "mfg") then place the data within the column inside a new table under the column "brand".
if column header contains ("quantity" or "qty" or "#") then place the data within the column inside the new table under the column "quantity"
等等等等。但是,当我以这种方式导入表时,有几件事 1) 表是逐行导入而不是逐列导入,以及 2) 每行都作为数组导入,数组中的每个项目对应一个单元格在那一行之内。有没有办法完成我描述的任务。我并不是真的在寻找牵手帮我打字的答案,主要是想知道这是否可能以及如何实现它的一般想法。
最佳答案
您是否尝试使用专用于 excel 文件的导入工具,如 xlsx-import ?
这将允许您设置类型,例如书籍类型:
interface Book {
Id: number;
Title: string;
Author: string;
}
然后按照配置导入:
const factory = new ImporterFactory();
const importer = await factory.From(filePath);
const books = importer.GetAllItems<Book>({
type: 'list',
worksheet: 'Favourites',
columns: [
{index: 1, key: 'Id', mapper: (v: string) => Number.parseInt(v)},
{index: 2, key: 'Title'},
{index: 5, key: 'Author'},
],
rowOffset: 1, //offset header row
});
希望对你有所帮助:)
关于javascript - 标准化导入的 Excel 表中的列名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59619353/