使用 XLSX 加载 Excel 文件内容并将其显示为 HTML Table Angular

Load and Show Excel File Contents as HTML Table Angular with XLSX

我想要的:

我正在尝试加载 excel 文件并将其内容显示为 HTML 元素。显然,一切正常(控制台日志打印出正确的数据)。

问题

Excel 内容不会显示在 HTML 直到您上传两次 文件!

一些线索

使用这个例子:https://stackblitz.com/edit/angular-excel-read-table?file=src%2Fapp%2Fsheet.component.ts

Excel 内容加载第二次代码传递抛出:reader.readAsBinaryString(changeEvent.target.files[0]);

import * as XLSX from 'xlsx';

type AOA = any[][];

  data: AOA = [
    ['default']
  ];

  onFileChange(changeEvent: any) {

    const reader = new FileReader();

    reader.onload = () => {

      const wb = XLSX.read(reader.result, { type: 'binary' });
      
      const firstSheetName = wb.SheetNames[0];
      const firstSheetWBook = wb.Sheets[firstSheetName];

      this.data = <AOA>(XLSX.utils.sheet_to_json(firstSheetWBook, { header: 1 }));
      console.log(this.data) // prints correct data at console
    };

    reader.readAsBinaryString(changeEvent.target.files[0]);

  }

<input type="file" (change)="onFileChange($event)" multiple="false">
<span>{{ data }}</span> 

这可能是因为 reader.onload “在 Angular 的世界之外”,所以 Angular 没有接受零钱。

强制 Angular 刷新并获取更改的解决方法是使用 NgZone。试试这个:

import { Component, NgZone } from '@angular/core';
    
constructor(private ngZone: NgZone) { }
console.log(this.data) // prints correct data at console
this.ngZone.run(() => {});

你不应该使用 readAsArrayBuffer MDN 状态:

Note that this method was once removed from the File API specification, but re-introduced for backward compatibility. Using FileReader.readAsArrayBuffer() is recommended.

但是,也不鼓励使用 FileReader,因为您也可以在 blob 上使用新的读取方法。 NodeJS v15.7 内置了 blob,但没有 FileReader 因为它被认为是遗留的 api 现在有新的读取方法

示例如下:

import * as XLSX from 'xlsx';

async function onFileChange (evt) {
  const buffer = await evt.target.files[0].arrayBuffer()
  const wb = XLSX.read(buffer);
  
  const firstSheetName = wb.SheetNames[0];
  const firstSheetWBook = wb.Sheets[firstSheetName];

  this.data = XLSX.utils.sheet_to_json(firstSheetWBook, { header: 1 });
  console.log(this.data) // prints correct data at console
}