javascript - 从导入的 Excel 表中标准化列名
问题描述
我的一个朋友接受客户的订单,客户基本上被要求提交一个包含项目、描述、品牌、数量等字段的 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?
这将允许您设置类型,例如 Book 类型:
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
});
我希望这会对你有所帮助:)
推荐阅读
- c# - 如何绕过 blazor wasm 路由系统并调用服务器
- python - QTableWidget setText 返回属性错误
- r - 在 R 中创建多个列,其中包含由函数创建的多个值
- prolog - Prolog中处理“剩余目标”的方法是什么?
- android - firebase 重置密码链接
- python - 错误NameError:名称'head'未在jupyter笔记本上定义
- r - ggplotly与facet_wrap一起使用时,只出现第一个facet的数据
- json - 我的 FCM http 请求仍然有问题
- list - 元组列表上的Haskell函数如何将所有组件与以下每个组件进行比较
- tensorflow - 无法将 pandas numpy 列转换为张量