Angular 7 читает первый столбец файла Excel и сохраняет его в массив - PullRequest
0 голосов
/ 18 марта 2019

Я пытаюсь загрузить файл Excel, где первый столбец является столбцом идентификатора.

Мне нужно взять все идентификаторы и сохранить их в массив, чтобы потом использовать их для управления данными.

Я использую библиотеку XLSX:

import {read, write, utils} from 'xlsx';

И для HTML:

<input type="file" value="Upload Excel/CSV file" (change)="upload($event)" accept=".xlsx, .xls, .csv"/>

<button mat-fab color="warn" (click)="read()"><mat-icon color="warn">attach_file</mat-icon>Read Data</button>

Я начал с:

read()
{
    const file = new FileReader();
}

Но я не могу сказать читателю файла прочитать загруженный файл.

EDIT

Я пытался использовать событие изменения файла ввода:

upload(e)
  {
    let input = e.target;
    for (var index = 0; index < input.files.length; index++) {
        let reader = new FileReader();
        reader.onload = () => {
            // this 'text' is the content of the file
            var text = reader.result;
            console.log(reader.result)
        }

        reader.readAsText(input.files[index]);
    };
  }

Но результат чтения подобен шифрованию.

Ответы [ 2 ]

1 голос
/ 18 марта 2019

Вы, вероятно, должны позволить библиотеке решить, как читать книгу, а не читать ее, как если бы это был текст.

Я не могу проверить это в данный момент, но это может выглядеть примерно так,используя буфер массива:

var reader = new FileReader();
reader.onload = function(e) {
    var data = new Uint8Array(e.target.result);
    var workbook = XLSX.read(data, {type:"array"});

    // collect your ID's here
};
reader.readAsArrayBuffer(input.files[index]);
1 голос
/ 18 марта 2019

Этот ответ будет работать для файлов .csv:

<input id="file" type="file" accept=".csv" (change)="fileUpload($event.target.files)">
fileUpload(files) {
    if (files && files.length > 0) {
        const file: File = files.item(0);
        const reader: FileReader = new FileReader();
        reader.readAsText(file);
        reader.onload = (e) => {
            const res = reader.result as string; // This variable contains your file as text
            const lines = res.split('\n'); // Splits you file into lines
            const ids = [];
            lines.forEach((line) => {
                ids.push(line.split(',')[0]); // Get first item of line
            });
            console.log(ids);
        };
    }
}
...