2023-04-19 08:50:07 +00:00
---
title: React Datagrid
pagination_prev: demos/frontend/index
pagination_next: demos/net/index
---
2023-04-27 09:12:19 +00:00
import current from '/version.js';
2023-05-01 01:27:02 +00:00
import CodeBlock from '@theme/CodeBlock';
2023-04-27 09:12:19 +00:00
2023-12-05 03:46:54 +00:00
[React Data Grid ](https://adazzle.github.io/react-data-grid/ ) is a data grid
designed for the ReactJS web framework.
2023-04-19 08:50:07 +00:00
2023-12-05 03:46:54 +00:00
[SheetJS ](https://sheetjs.com ) is a JavaScript library for reading and writing
data from spreadsheets.
2023-04-19 08:50:07 +00:00
2023-12-05 03:46:54 +00:00
This demo uses React Data Grid and SheetJS to pull data from a spreadsheet and
display the content in a data grid. We'll explore how to import data from files
into the data grid and how to export modified data from the grid to workbooks.
2023-04-19 08:50:07 +00:00
2023-12-05 03:46:54 +00:00
The ["Demo" ](#demo ) section includes a complete example that displays data from
user-supplied sheets and exports data to XLSX workbooks:
2023-04-19 08:50:07 +00:00

2023-12-05 03:46:54 +00:00
:::note Tested Deployments
This demo was tested in the following environments:
2025-04-24 00:30:01 +00:00
| Browser | Version | Date | Notes |
|:-------------|:----------------|:-----------|:----------------------------|
| Chromium 135 | `7.0.0-beta.19` | 2025-04-23 | Requires ReactJS 18 |
| Chromium 135 | `7.0.0-beta.52` | 2025-04-23 | No edit support |
| Konqueror 22 | `7.0.0-beta.52` | 2025-04-23 | No edit support, CSS errors |
2023-12-05 03:46:54 +00:00
:::
2024-04-14 07:40:38 +00:00
:::danger pass
2023-12-05 03:46:54 +00:00
2024-06-09 21:48:23 +00:00
When this demo was last tested against the latest version, the grid correctly
displayed data but data could not be edited by the user.
2023-12-05 03:46:54 +00:00
2025-04-24 00:30:01 +00:00
The current recommendation is to use version `7.0.0-beta.19` and to forcefully
downgrade ReactJS to version 18.
2023-12-05 03:46:54 +00:00
:::
2023-04-19 08:50:07 +00:00
## Integration Details
2023-12-05 03:46:54 +00:00
[The "Frameworks" section ](/docs/getting-started/installation/frameworks ) covers
installation with Yarn and other package managers.
Using the `npm` tool, this command installs SheetJS and React Data Grid:
< CodeBlock language = "bash" > {`\
2024-06-09 21:48:23 +00:00
npm i --save https://cdn.sheetjs.com/xlsx-${current}/xlsx-${current}.tgz react-data-grid@7.0.0-beta.19`}
2023-12-05 03:46:54 +00:00
< / CodeBlock >
Methods and components in both libraries can be loaded in pages using `import` :
```js
import { read, utils, writeFile } from 'xlsx';
import DataGrid, { Column } from "react-data-grid";
```
2023-04-19 08:50:07 +00:00
#### Rows and Columns state
`react-data-grid` state consists of an Array of column metadata and an Array of
row objects. Typically both are defined in state:
```jsx
import DataGrid, { Column } from "react-data-grid";
export default function App() {
const [rows, setRows] = useState([]);
const [columns, setColumns] = useState([]);
return ( < DataGrid columns = {columns} rows = {rows} onRowsChange = {setRows} / > );
}
```
The most generic data representation is an array of arrays. To sate the grid,
columns must be objects whose `key` property is the index converted to string:
```ts
import { WorkSheet, utils } from 'xlsx';
import { textEditor, Column } from "react-data-grid";
type Row = any[];
type AOAColumn = Column< Row > ;
type RowCol = { rows: Row[]; columns: AOAColumn[]; };
function ws_to_rdg(ws: WorkSheet): RowCol {
/* create an array of arrays */
const rows = utils.sheet_to_json(ws, { header: 1 });
/* create column array */
const range = utils.decode_range(ws["!ref"]||"A1");
const columns = Array.from({ length: range.e.c + 1 }, (_, i) => ({
key: String(i), // RDG will access row["0"], row["1"], etc
name: utils.encode_col(i), // the column labels will be A, B, etc
editor: textEditor // enable cell editing
}));
return { rows, columns }; // these can be fed to setRows / setColumns
}
```
In the other direction, a worksheet can be generated with `aoa_to_sheet` :
```ts
import { WorkSheet, utils } from 'xlsx';
type Row = any[];
function rdg_to_ws(rows: Row[]): WorkSheet {
return utils.aoa_to_sheet(rows);
}
```
2023-09-24 03:59:48 +00:00
:::caution pass
2023-04-19 08:50:07 +00:00
When the demo was last refreshed, row array objects were preserved. This was
not the case in a later release. The row arrays must be re-created.
The snippet defines a `arrayify` function that creates arrays if necessary.
```ts
import { WorkSheet, utils } from 'xlsx';
type Row = any[];
// highlight-start
function arrayify(rows: any[]): Row[] {
return rows.map(row => {
var length = Object.keys(row).length;
for(; length > 0; --length) if(row[length-1] != null) break;
return Array.from({length, ...row});
});
}
// highlight-end
function rdg_to_ws(rows: Row[]): WorkSheet {
return utils.aoa_to_sheet(arrayify(rows));
}
```
:::
## Demo
2024-06-09 21:48:23 +00:00
1) Create a new ViteJS app using the `react-ts` template:
2023-04-19 08:50:07 +00:00
```bash
2024-06-09 21:48:23 +00:00
npm create vite@latest -- sheetjs-rdg --template react-ts
2023-04-19 08:50:07 +00:00
cd sheetjs-rdg
```
2) Install dependencies:
2023-05-01 01:27:02 +00:00
< CodeBlock language = "bash" > {`\
2024-06-09 21:48:23 +00:00
npm i -S https://cdn.sheetjs.com/xlsx-${current}/xlsx-${current}.tgz react-data-grid@7.0.0-beta.19`}
2023-05-01 01:27:02 +00:00
< / CodeBlock >
2023-04-19 08:50:07 +00:00
2025-04-24 00:30:01 +00:00
< details >
< summary > < b > Installing RDG version that supports editing< / b > (click to show)< / summary >
Editing support requires ReactJS 18 and React DataGrid version `7.0.0-beta.19` :
< CodeBlock language = "bash" > {`\
npm i -S react@18 react-dom@18
npm i -S https://cdn.sheetjs.com/xlsx-${current}/xlsx-${current}.tgz react-data-grid@7.0.0-beta.19`}
< / CodeBlock >
< / details >
2023-04-19 08:50:07 +00:00
3) Download [`App.tsx` ](pathname:///rdg/App.tsx ) and replace `src/App.tsx` .
```bash
curl -L -o src/App.tsx https://docs.sheetjs.com/rdg/App.tsx
```
2023-09-18 06:44:33 +00:00
4) Start the development server:
```bash
2024-06-09 21:48:23 +00:00
npm run dev
2023-09-18 06:44:33 +00:00
```
2024-06-09 21:48:23 +00:00
The terminal window will display a URL (typically `http://localhost:5173` ).
Open the URL with a web browser and confirm that a page loads.
2025-04-24 00:30:01 +00:00
:::caution pass
**There were breaking changes in point releases of React DataGrid!**
The JavaScript console may show an error message referencing `default` :
```
Uncaught SyntaxError: The requested module '/node_modules/.vite/deps/react-data-grid.js?v=f9b1b87a' does not provide an export named 'default' (at App.tsx:2:8)
```
In a point release, `DataGrid` was moved from the default export to a named
export. The `src/App.tsx` script must be edited to reflect the change:
```js title="src/App.tsx (edit highlighted lines)"
import React, { useEffect, useState, ChangeEvent } from "react";
// highlight-next-line
import { textEditor, Column, DataGrid } from "react-data-grid";
import { read, utils, WorkSheet, writeFile } from "xlsx";
```
After updating the script, the webpage must be manually refreshed.
:::
2023-09-18 06:44:33 +00:00
#### Testing
2024-06-09 21:48:23 +00:00
5) Confirm the table shows a list of Presidents.
When the page loads, it will fetch https://docs.sheetjs.com/pres.numbers, parse
with SheetJS, and load the data in the data grid.
6) Click the "export [.xlsx]" button to export the grid data to XLSX. It should
attempt to download `SheetJSRDG.xlsx` .
7) Open the generated file in a spreadsheet editor. Set cell A7 to "SheetJS Dev"
and set cell B7 to 47. Save the file.
2023-09-18 06:44:33 +00:00
2024-06-09 21:48:23 +00:00
8) Use the file picker to select the modified file. The table will refresh and
show the new data.