首页 > 解决方案 > 从导入的 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) 每一行都作为数组导入,数组中的每个项目对应于一个单元格该行内。有没有办法完成我描述的任务。我并不是真的在寻找一个握着我的手为我做的答案,主要是想知道它是否可能以及如何完成它的一般想法。

标签: javascriptexcelangulartypescript

解决方案


您是否尝试使用专门的 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
});

我希望这会对你有所帮助:)


推荐阅读