javascript - 标准化导入的 Excel 表中的列名称

标签 javascript excel angular typescript

我的一个 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/

相关文章:

javascript - ExpressJS res.render 不适用于 angularjs

javascript - 如何以正确的纵横比显示响应式 5 张扑克牌图像?

java - 使用 Apache POI 获取大型 Excel 文件的 Excel 工作表名称

javascript - React 中对表进行升序/降序排序

excel - 无法自动调整单元格的行高

excel - 在电源查询中,如何指向源文件的当前用户目录?

angular - Observable .catch 不是一个函数

javascript - 如何在 Angular 2 中的无效字段上显示 'has-error' 类

Angular 2- 错误 : Type 'AbstractControl' is not assignable to type 'AbstractControl'

javascript - 使用javascript淡化图像循环