#excel #angular #typescript
#excel #angular #typescript
Вопрос:
Мне нужно, чтобы мое приложение могло считывать подготовленный файл Excel (расположенный в моем домене ( www.***.com/data.xlsx
)) в массив. Следующий код работает как шарм для этой цели, но его клиент основан на том, где пользователь просматривает и вводит xlsx
файл.
import {
Component,
OnInit
} from '@angular/core';
import * as XLSX from 'xlsx';
@Component({
selector: 'app-excelsheet',
templateUrl: './excelsheet.component.html',
styleUrls: ['./excelsheet.component.css']
})
export class ExcelsheetComponent implements OnInit {
data: [][];
constructor() {}
ngOnInit(): void {}
onFileChange(evt: any) {
const target: DataTransfer = <DataTransfer>(evt.target);
if (target.files.length !== 1) throw new Error('Cannot use multiple files');
const reader: FileReader = new FileReader();
reader.onload = (e: any) => {
const bstr: string = e.target.result;
const wb: XLSX.WorkBook = XLSX.read(bstr, {
type: 'binary'
});
const wsname: string = wb.SheetNames[0];
const ws: XLSX.WorkSheet = wb.Sheets[wsname];
console.log(ws);
this.data = (XLSX.utils.sheet_to_json(ws, {
header: 1
}));
console.log(this.data);
let x = this.data.slice(1);
console.log(x);
};
reader.readAsBinaryString(target.files[0]);
}
}
Я пробовал разные способы методом проб и ошибок, тестировал функции и переменные, другие библиотеки, читал о клиенте / сервере, но все же сейчас я как бы в тупике, возможно, потому, что у меня меньше опыта в JavaScript.
Короче говоря, как мое приложение может считывать файл Excel (из URL-адреса) в массив при каждом запуске приложения?
Для дополнительной информации я также попытался вставить файл Excel в каталог приложения, но все же…
Я знаю, что я должен был поставить свою попытку кода для вас, ребята, для устранения неполадок, но я просто подумаю, что это просто странные попытки, поскольку я действительно новичок. Я надеюсь, что вы, ребята, сможете кратко перечислить, что я должен использовать и делать, заранее спасибо, я ценю это.
Комментарии:
1. Более традиционным подходом было бы поместить эти данные в базу данных. В противном случае, почему бы не экспортировать xlsx в формате CSV и использовать его вместо этого? Гораздо проще в использовании.
2. @spender причина отказа от использования базы данных заключается в том, что я собираюсь только прочитать файл. я действительно не против использовать csv, я имею в виду, что если csv проще импортировать либо через URL, либо через локальный каталог приложений, это определенно выбор для меня на данный момент. это проще? в любом случае спасибо за ваш комментарий, ценю это.
Ответ №1:
После дополнительных исследований и тестирования я, наконец, сделал это, используя тот же js-xlsx. Я надеюсь, что это поможет тому, кто беспокоит в будущем.
import * as XLSX from 'xlsx';
@Component({
selector: 'app-home',
templateUrl: 'home.page.html',
styleUrls: ['home.page.scss'],
})
export class HomePage {
constructor() {}
load(){
var url = "http://ururl.com/excelfile.xlsx";
var oReq = new XMLHttpRequest();
oReq.open("GET", url, true);
oReq.responseType = "arraybuffer";
oReq.onload = function(e) {
var arraybuffer = oReq.response;
/* convert data to binary string */
var data = new Uint8Array(arraybuffer);
var arr = new Array();
for(var i = 0; i != data.length; i) arr[i] = String.fromCharCode(data[i]);
var bstr = arr.join("");
/* Call XLSX */
var workbook = XLSX.read(bstr, {type:"binary"});
/* DO SOMETHING WITH workbook HERE */
var first_sheet_name = workbook.SheetNames[0];
/* Get worksheet */
var worksheet = workbook.Sheets[first_sheet_name];
let x = XLSX.utils.sheet_to_json(worksheet,{raw:true});
console.log(x);
}
oReq.send();
}
}