Чтение файла Excel в angular с заголовком в строке номер n - PullRequest
0 голосов
/ 27 апреля 2020

Я хочу прочитать файл Excel в angular, начиная с номера строки 5 (скажем) в качестве заголовка, и прочитать столбцы с заголовком ' colName1 ', ' colName2 'и' colName3 '(Если невозможно прочитать с этой большой спецификацией, возьмите часть данных на основе спецификаций). Есть ли простой способ сделать это? Весь код, с которым я столкнулся, использует несколько встроенных сценариев для выполнения этой работы.

Вот код, который я придумал. Он читает выбранный Excel и отображает его JSON в консоли. Он не может обрабатывать файлы, заголовок которых находится не в 1-й строке и не читает указанные столбцы.

HTML:

<div class="col-md-8 form-group">    
   <input type="file" class="form-control" (change)="uploadedFile($event)" placeholder="Upload file" accept=".xlsx">
</div>

TypeScript :

import { Component, OnInit } from '@angular/core';
import * as XLSX from 'xlsx';  
import * as FileSaver from 'file-saver'; 

@Component({
  selector: 'app-upload',
  templateUrl: './upload.component.html',
  styleUrls: ['./upload.component.css']
})
export class UploadComponent implements OnInit {

  constructor() { }

  ngOnInit(): void {
  }
  storeData: any;  
  jsonData: any;    
  fileUploaded: File;  
  worksheet: any;  

  uploadedFile(event) {  
    this.fileUploaded = event.target.files[0];  
    this.readExcel();  
  }  

  readExcel() {  
    let readFile = new FileReader();  
    readFile.onload = (e) => {  
      this.storeData = readFile.result;  
      var data = new Uint8Array(this.storeData);  
      var arr = new Array();  
      for (var i = 0; i != data.length; ++i) arr[i] = String.fromCharCode(data[i]);  
      var bstr = arr.join("");  
      var workbook = XLSX.read(bstr, { type: "binary" });  
      var first_sheet_name = workbook.SheetNames[0];  
      this.worksheet = workbook.Sheets[first_sheet_name];  
      this.jsonData = XLSX.utils.sheet_to_json(this.worksheet, { raw: false });  
      this.jsonData = JSON.stringify(this.jsonData);  
      console.log(this.jsonData)
    }  
    readFile.readAsArrayBuffer(this.fileUploaded);  
  }
}

Я ищу поведение, аналогичное тому, которое предоставляется pandas в Python:

df = pd.read_excel('fileName.xlsx', sheet_name='sheet1', header=5)
df = df[['colName1','colName2', 'colName3']].copy()

Я новичок в Angular и до сих пор пытаясь найти выход из основ Angular.

1 Ответ

0 голосов
/ 05 мая 2020

Самый простой способ - использовать удивительную библиотеку lib xlsx-import https://github.com/Siemienik/xlsx-import

Он отлично работает с TypeScript, поэтому отлично подойдет для вашего angular приложения:

interface Book {
    Id: number;
    Title: string;
    Author: string;
}

const importer = new Importer(workbook);
const books: Book[] = importer.GetAllItems<Book>( {
    type: 'list',
    worksheet: 'Favourites',
    columns: [
        {
            index: 1, // column index (1,2,3....n) - started form number 1 (not 0)
            key: 'Id', // output item's field (Book.Id)
            mapper: (v: string) => Number.parseInt(v) // nullable, for transformating values
        },
        {index: 2, key: 'Title'}, // (Book.Title)
        {index: 5, key: 'Author'},  // (Book.Author)
    ],
    rowOffset: 6, //offset header row
}); 
...