---
title: "Excel Import"
framework: angular
version: "36.1.0"
---

# Excel Import

Below we illustrate how you might import an Excel spreadsheet into AG Grid using a third-party library - in this example we're using [xlsx](https://www.jsdelivr.com/package/npm/xlsx).

[Auto-Generate Columns](https://www.ag-grid.com/archive/36.1.0/angular-data-grid/auto-generate-columns/) is used so no column definitions need to be provided upfront — columns are created from the imported data. The `processFileInput` callback parses dropped Excel files using the same library.

Click **Load Sample Excel** to fetch a sample spreadsheet, or drag your own `.xlsx` file onto the grid. Click **Upload File** to re-show the file input overlay. The spreadsheet can also be downloaded [here](https://www.ag-grid.com/example-assets/olympic-data.xlsx).

## Example Import

#### Import Excel into AG Grid

```ts
import { Component } from "@angular/core";
import { AgGridAngular } from "ag-grid-angular";
import "./styles.css";
import {
  AutoGenerateColumnDefsOptions,
  AutoGenerateColumnsModule,
  ClientSideRowModelModule,
  ColDef,
  GridApi,
  GridOptions,
  GridReadyEvent,
  ModuleRegistry,
  ProcessFileInputParams,
  enableDevValidations,
} from "ag-grid-community";
import {
  ColumnMenuModule,
  ContextMenuModule,
  ExcelExportModule,
} from "ag-grid-enterprise";
if (process.env.NODE_ENV !== "production") {
  enableDevValidations();
}

ModuleRegistry.registerModules([
  ClientSideRowModelModule,
  AutoGenerateColumnsModule,
  ExcelExportModule,
  ColumnMenuModule,
  ContextMenuModule,
]);

declare let XLSX: any;

@Component({
  selector: "my-app",
  standalone: true,
  imports: [AgGridAngular],
  template: `<div class="example-wrapper">
    <div style="margin-bottom: 1rem">
      <button (click)="importExcel()">Load Sample Excel</button>
      <button (click)="uploadFile()">Upload File</button>
    </div>
    <ag-grid-angular
      style="width: 100%; height: 100%;"
      [autoGenerateColumnDefs]="true"
      [defaultColDef]="defaultColDef"
      [processFileInput]="processFileInput"
      [rowData]="rowData"
      (gridReady)="onGridReady($event)"
    />
  </div> `,
})
export class AppComponent {
  private gridApi!: GridApi;

  defaultColDef: ColDef = {
    minWidth: 80,
    flex: 1,
  };
  processFileInput: (params: ProcessFileInputParams) => void = (
    params: ProcessFileInputParams,
  ) => {
    const file = params.files[0];
    if (!file) return;
    const reader = new FileReader();
    reader.onerror = () => params.fail("Failed to read file");
    reader.onload = (e) => {
      try {
        const workbook = XLSX.read(
          new Uint8Array(e.target?.result as ArrayBuffer),
        );
        params.success(parseWorkbook(workbook));
      } catch {
        params.fail("Failed to parse file");
      }
    };
    reader.readAsArrayBuffer(file);
  };
  rowData!: any[];

  uploadFile() {
    const curr = this.gridApi.getGridOption("activeOverlay");
    this.gridApi.setGridOption(
      "activeOverlay",
      curr === "agFileInputOverlay" ? undefined : "agFileInputOverlay",
    );
  }

  importExcel() {
    fetch("https://www.ag-grid.com/example-assets/olympic-data.xlsx")
      .then((response) => response.arrayBuffer())
      .then((data: ArrayBuffer) => {
        const workbook = XLSX.read(new Uint8Array(data));
        this.gridApi.updateGridOptions({
          rowData: parseWorkbook(workbook),
          activeOverlay: undefined,
        });
      });
  }

  onGridReady(params: GridReadyEvent) {
    this.gridApi = params.api;
  }
}

function parseWorkbook(workbook: any): Record<string, unknown>[] {
  const firstSheetName = workbook.SheetNames[0];
  const worksheet = workbook.Sheets[firstSheetName];
  return XLSX.utils.sheet_to_json(worksheet);
}
```

[Live example: Import Excel into AG Grid](https://www.ag-grid.com/archive/36.1.0/examples/excel-import/excel-import/angular)
