Стандартизировать имена столбцов из импортированной таблицы Excel - PullRequest
3 голосов
/ 07 января 2020

Мой друг принимает заказы от клиентов, и клиентов в основном просят представить лист Excel с такими полями, как товар, описание, марка, количество и т. Д. c и c. Однако, когда клиенты представляют эти листы, они не всегда приходят с одними и теми же дескрипторами столбцов, поэтому иногда на листе появляются столбцы, например, производитель, а не бренд, или сокращенное «кол-во» для количества или описание товара, а не просто описание, просто чтобы назвать Несколько вариантов.

Я пытаюсь найти способ в основном сделать веб-инструмент, который позволил бы ему взять отправленную ему таблицу и создать инструмент, который будет стандартизировать эти столбцы без необходимости go копировать / paste работа как побочный инструмент для меня, чтобы получить больше понимания о программировании и алгоритмах и т. д. c.

В основном у меня файлы 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) каждая строка импортируется как массив с каждым элементом в массиве, соответствующем ячейке. в этом ряду. Есть ли способ выполнить задачу, которую я описал. Я на самом деле не ищу удержания, моя рука делает это для меня, набираю ответ, в основном желая узнать, возможно ли это, и общее представление о том, как это можно сделать.

1 Ответ

0 голосов
/ 27 апреля 2020

Пытались ли вы использовать специальный инструмент для импорта файлов 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
});

Я надеюсь, это поможет вам:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...