Skip to content
Open
Show file tree
Hide file tree
Changes from 10 commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
a7662c8
1015310: added content for integrating spreadsheet into existing layo…
Nithishk1 Mar 18, 2026
be5d621
Merge branch 'development' of https://github.com/syncfusion-content/d…
Nithishk1 Mar 18, 2026
cf0726d
1015310: added content for integrating spreadsheet into existing layo…
Nithishk1 Mar 18, 2026
c8bec29
1015310: added code samples for integrating spreadsheet into existing…
Nithishk1 Mar 18, 2026
6d5c375
Merge branch 'development' of https://github.com/syncfusion-content/d…
Nithishk1 Mar 30, 2026
ac57c9d
Merge branch 'development' of https://github.com/syncfusion-content/d…
Nithishk1 Mar 30, 2026
bb4668a
1015310: added code samples for integrating spreadsheet into existing…
Nithishk1 Mar 30, 2026
b965eef
Merge branch 'development' of https://github.com/syncfusion-content/d…
Nithishk1 Mar 30, 2026
deff494
1015310: added code samples for integrate spreadsheet into existing l…
Nithishk1 Apr 10, 2026
4d01b24
Merge branch 'development' of https://github.com/syncfusion-content/d…
Nithishk1 Apr 10, 2026
ab7ca75
Merge branch 'development' of https://github.com/syncfusion-content/d…
Nithishk1 Apr 16, 2026
d4ff0af
1015310: added code samples for integrate spreadsheet into existing l…
Nithishk1 Apr 16, 2026
ff64e76
1015310: added code samples for integrate spreadsheet into existing l…
Nithishk1 Apr 20, 2026
9ad3639
Merge branch 'development' of https://github.com/syncfusion-content/d…
Nithishk1 Apr 20, 2026
6175253
1015310: added code samples for integrate spreadsheet into existing l…
Nithishk1 Apr 20, 2026
e7838b5
1015310: added code samples for integrate spreadsheet into existing l…
Nithishk1 Apr 20, 2026
274206d
1015310: Refactor note on Spreadsheet component visibility
babu-periyasamy Apr 20, 2026
bb0715b
1015310: added code samples for integrate spreadsheet into existing l…
Nithishk1 Apr 21, 2026
fbc25f9
Merge branch 'EJ2-1015310-ug1' of https://github.com/syncfusion-conte…
Nithishk1 Apr 21, 2026
977f2b5
Merge branch 'development' of https://github.com/syncfusion-content/d…
Nithishk1 Apr 21, 2026
2f943ac
1015310: Clarify initialization and resizing of Spreadsheet
babu-periyasamy Apr 21, 2026
d0aa7b3
Merge branch 'development' into EJ2-1015310-ug1
babu-periyasamy Apr 21, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions Document-Processing-toc.html
Original file line number Diff line number Diff line change
Expand Up @@ -5475,6 +5475,7 @@
<li><a href="/document-processing/excel/spreadsheet/react/how-to/get-filtered-data">Get the filtered row data</a></li>
<li><a href="/document-processing/excel/spreadsheet/react/how-to/customize-spreadsheet-like-grid">Customize spreadsheet like a grid</a></li>
<li><a href="/document-processing/excel/spreadsheet/react/how-to/paste-only-values-without-formatting">Paste only values without formatting and styles</a></li>
<li><a href="/document-processing/excel/spreadsheet/react/how-to/existing-react-layout">Integrate spreadsheet into existing react layouts</a></li>
</ul>
</li>
<li><a href="/document-processing/excel/spreadsheet/react/mobile-responsiveness">Mobile Responsiveness</a></li>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
---
layout: post
title: Integrating Spreadsheet into existing React layouts | Syncfusion
description: Guidance on embedding the Spreadsheet into react layouts using the Syncfusion React Spreadsheet component of Syncfusion Essential JS 2 and more.
control: Spreadsheet
platform: document-processing
documentation: ug
---

# Integrating Spreadsheet into Existing React Layouts

## Overview

The React Spreadsheet component can be embedded into dashboards, admin panels, split‑screen views, tabs, dialogs, collapsible/accordion sections, sidebars, and multi‑column layouts. This guide provides concise layout patterns and minimal code examples to ensure the Spreadsheet renders correctly, resizes properly, and refreshes when hosted inside common layout containers.

## How‑To

### Use Spreadsheet inside Tab components

The React Spreadsheet component is supported inside Syncfusion Tab components.
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The React Spreadsheet component is fully supported within [Syncfusion Tab component](API link). You can safely place and render the Spreadsheet inside a Tab item.

The following sample shows how to render the Spreadsheet inside the Tab component.


{% tabs %}
{% highlight js tabtitle="app.jsx" %}
{% include code-snippet/spreadsheet/react/integrate-into-layouts-cs1/app/app.jsx %}
{% endhighlight %}
{% highlight ts tabtitle="app.tsx" %}
{% include code-snippet/spreadsheet/react/integrate-into-layouts-cs1/app/app.tsx %}
{% endhighlight %}
{% endtabs %}

{% previewsample "/document-processing/code-snippet/spreadsheet/react/integrate-into-layouts-cs1" %}

### Use spreadsheet inside Dialog

If the spreadsheet sits inside a dialog, for example Syncfusion Dialog, render or initialize the spreadsheet after the dialog open events. The DOM must be visible for the spreadsheet to measure layout.
Comment thread
NITHISHKUMARRAVIKUMAR marked this conversation as resolved.
Outdated

{% tabs %}
{% highlight js tabtitle="app.jsx" %}
{% include code-snippet/spreadsheet/react/integrate-into-layouts-cs2/app/app.jsx %}
{% endhighlight %}
{% highlight ts tabtitle="app.tsx" %}
{% include code-snippet/spreadsheet/react/integrate-into-layouts-cs2/app/app.tsx %}
{% endhighlight %}
{% endtabs %}

{% previewsample "/document-processing/code-snippet/spreadsheet/react/integrate-into-layouts-cs2" %}

### Use Spreadsheet inside collapsible sections

For accordions or collapsible containers, you can render the Spreadsheet inside an `AccordionItem`. If the item is rendered while hidden, trigger a resize event when the section becomes active so the component can recalculate its layout.
Comment thread
NITHISHKUMARRAVIKUMAR marked this conversation as resolved.
Outdated

{% tabs %}
{% highlight js tabtitle="app.jsx" %}
{% include code-snippet/spreadsheet/react/integrate-into-layouts-cs3/app/app.jsx %}
{% endhighlight %}
{% highlight ts tabtitle="app.tsx" %}
{% include code-snippet/spreadsheet/react/integrate-into-layouts-cs3/app/app.tsx %}
{% endhighlight %}
{% endtabs %}

{% previewsample "/document-processing/code-snippet/spreadsheet/react/integrate-into-layouts-cs3" %}

Comment thread
NITHISHKUMARRAVIKUMAR marked this conversation as resolved.
## Why visibility and height matter

The Spreadsheet measures its host container to calculate column widths, row heights and layout. If the host element has no height (collapsed, `display:none`, or not yet mounted) measurements will be zero and the Spreadsheet may render incorrectly, be clipped, or not display at all.

Initialize or refresh the Spreadsheet when its host becomes visible (tab active, modal opened, accordion expanded) so internal layout code can compute sizes.

## Resize & visibility tips

Dispatch a global resize right after the container becomes visible:

```js
setTimeout(() => window.dispatchEvent(new Event('resize')), 0);
```

Use a `ResizeObserver` when the host size may change frequently — this forwards size changes into the global resize event so the Spreadsheet can re-measure:

```js
const observer = new ResizeObserver(() => {
window.dispatchEvent(new Event('resize'));
});
observer.observe(document.querySelector('#spreadsheet')!);
```

Lazy-render inside tabs/dialogs/accordions: only mount the Spreadsheet when the pane is visible. If you must mount while hidden, call a refresh after showing (for example, call `window.dispatchEvent(new Event('resize'))` or the component's refresh method) so the Spreadsheet recomputes layout.
Comment thread
NITHISHKUMARRAVIKUMAR marked this conversation as resolved.
Outdated

## When to use these patterns

- Use Dialogs for temporary or isolated spreadsheet previews.
- Use Tabs/Accordion patterns for multi-pane UIs — ensure a resize/refresh is triggered when a pane becomes active.
- Avoid placing the Spreadsheet in invisible containers without a resize/refresh strategy; otherwise measurements will be zero and layout will break.

## See also

- [Overview of Syncfusion React Tab component](https://ej2.syncfusion.com/react/documentation/tab/getting-started)
- [Overview of Syncfusion React Dialog component](https://ej2.syncfusion.com/react/documentation/dialog/getting-started)
- [Overview of Syncfusion React Accordion component](https://ej2.syncfusion.com/react/documentation/accordion/getting-started)
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
import * as React from 'react';
import { createRoot } from 'react-dom/client';
import { SpreadsheetComponent } from '@syncfusion/ej2-react-spreadsheet';
import { TabComponent, TabItemsDirective, TabItemDirective } from '@syncfusion/ej2-react-navigations';

function App() {

const SpreadsheetTabContent = () => {
return (
<div className="spreadsheet-pane">
<div>
<SpreadsheetComponent height="100%" width="100%" />
</div>
</div>
);
};

return (
<div className="page">
<header className="header">
<h3 style={{ margin: 0 }}>Spreadsheet in tab</h3>
</header>

<div className="tab-host">
<TabComponent height="100%">
<TabItemsDirective>
<TabItemDirective
header={{ text: 'Overview' }}
content={() => (
<div className="panel">
<h4>Overview</h4>
<p>Put general dashboard content here.</p>
</div>
)}
/>
<TabItemDirective
header={{ text: 'Spreadsheet' }}
content={SpreadsheetTabContent}
/>
<TabItemDirective
header={{ text: 'Settings' }}
content={() => (
<div className="panel">
<h4>Settings</h4>
<p>Any settings or forms can go here.</p>
</div>
)}
/>
</TabItemsDirective>
</TabComponent>
</div>
</div>
);
};

export default App;

const root = createRoot(document.getElementById('root'));
root.render(<App />);
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
import * as React from 'react';
import { createRoot } from 'react-dom/client';
import { SpreadsheetComponent } from '@syncfusion/ej2-react-spreadsheet';
import { TabComponent, TabItemsDirective, TabItemDirective } from '@syncfusion/ej2-react-navigations';

function App(): React.ReactElement {

const SpreadsheetTabContent: any = () => {
return (
<div className="spreadsheet-pane">
<div>
<SpreadsheetComponent height="100%" width="100%" />
</div>
</div>
);
};

return (
<div className="page">
<header className="header">
<h3 style={{ margin: 0 }}>Spreadsheet in tab</h3>
</header>

<div className="tab-host">
<TabComponent height="100%">
<TabItemsDirective>
<TabItemDirective
header={{ text: 'Overview' }}
content={() => (
<div className="panel">
<h4>Overview</h4>
<p>Put general dashboard content here.</p>
</div>
)}
/>
<TabItemDirective
header={{ text: 'Spreadsheet' }}
content={SpreadsheetTabContent}
/>
<TabItemDirective
header={{ text: 'Settings' }}
content={() => (
<div className="panel">
<h4>Settings</h4>
<p>Any settings or forms can go here.</p>
</div>
)}
/>
</TabItemsDirective>
</TabComponent>
</div>
</div>
);
};

export default App;

const root = createRoot(document.getElementById('root')!);
root.render(<App />);
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
<!DOCTYPE html>
<html lang="en">

<head>
<title>Syncfusion React Spreadsheet</title>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="description" content="Essential JS 2 for React Components" />
<meta name="author" content="Syncfusion" />
<link href="https://cdn.syncfusion.com/ej2/33.1.44/tailwind3.css" rel="stylesheet" type="text/css" />
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/systemjs/0.19.38/system.js"></script>
<script src="systemjs.config.js"></script>
<style>
#loader {
color: #008cff;
height: 40px;
left: 45%;
position: absolute;
top: 45%;
width: 30%;
}

body {
overflow: hidden;
}
</style>
</head>

<body>
<div id='root'>
<div id='loader'>Loading....</div>
</div>
</body>

</html>
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
System.config({
transpiler: "ts",
typescriptOptions: {
target: "es5",
module: "commonjs",
moduleResolution: "node",
emitDecoratorMetadata: true,
experimentalDecorators: true,
"jsx": "react"
},
meta: {
'typescript': {
"exports": "ts"
}
},
paths: {
"syncfusion:": "https://cdn.syncfusion.com/ej2/33.1.44/"
},
map: {
app: 'app',
ts: "https://unpkg.com/plugin-typescript@4.0.10/lib/plugin.js",
typescript: "https://unpkg.com/typescript@2.2.2/lib/typescript.js",
"@syncfusion/ej2-base": "syncfusion:ej2-base/dist/ej2-base.umd.min.js",
"@syncfusion/ej2-data": "syncfusion:ej2-data/dist/ej2-data.umd.min.js",
"@syncfusion/ej2-lists": "syncfusion:ej2-lists/dist/ej2-lists.umd.min.js",
"@syncfusion/ej2-navigations": "syncfusion:ej2-navigations/dist/ej2-navigations.umd.min.js",
"@syncfusion/ej2-notifications": "syncfusion:ej2-notifications/dist/ej2-notifications.umd.min.js",
"@syncfusion/ej2-popups": "syncfusion:ej2-popups/dist/ej2-popups.umd.min.js",
"@syncfusion/ej2-dropdowns": "syncfusion:ej2-dropdowns/dist/ej2-dropdowns.umd.min.js",
"@syncfusion/ej2-inputs": "syncfusion:ej2-inputs/dist/ej2-inputs.umd.min.js",
"@syncfusion/ej2-splitbuttons": "syncfusion:ej2-splitbuttons/dist/ej2-splitbuttons.umd.min.js",
"@syncfusion/ej2-buttons": "syncfusion:ej2-buttons/dist/ej2-buttons.umd.min.js",
"@syncfusion/ej2-calendars": "syncfusion:ej2-calendars/dist/ej2-calendars.umd.min.js",
"@syncfusion/ej2-excel-export": "syncfusion:ej2-excel-export/dist/ej2-excel-export.umd.min.js",
"@syncfusion/ej2-pdf-export": "syncfusion:ej2-pdf-export/dist/ej2-pdf-export.umd.min.js",
"@syncfusion/ej2-file-utils": "syncfusion:ej2-file-utils/dist/ej2-file-utils.umd.min.js",
"@syncfusion/ej2-compression": "syncfusion:ej2-compression/dist/ej2-compression.umd.min.js",
"@syncfusion/ej2-grids": "syncfusion:ej2-grids/dist/ej2-grids.umd.min.js",
"@syncfusion/ej2-charts": "syncfusion:ej2-charts/dist/ej2-charts.umd.min.js",
"@syncfusion/ej2-svg-base": "syncfusion:ej2-svg-base/dist/ej2-svg-base.umd.min.js",
"@syncfusion/ej2-spreadsheet": "syncfusion:ej2-spreadsheet/dist/ej2-spreadsheet.umd.min.js",
"@syncfusion/ej2-react-base": "syncfusion:ej2-react-base/dist/ej2-react-base.umd.min.js",
"@syncfusion/ej2-react-spreadsheet": "syncfusion:ej2-react-spreadsheet/dist/ej2-react-spreadsheet.umd.min.js",
"@syncfusion/ej2-react-navigations": "syncfusion:ej2-react-navigations/dist/ej2-react-navigations.umd.min.js",
"react-dom/client": "https://unpkg.com/react-dom@18.2.0/umd/react-dom.production.min.js",
"react-dom": "https://unpkg.com/react-dom@18.2.0/umd/react-dom.production.min.js",
"react": "https://unpkg.com/react@18.2.0/umd/react.production.min.js",

},
packages: {
'app': { main: 'app', defaultExtension: 'tsx' },
}

});

System.import('app');
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
import * as React from 'react';
import { useRef, useCallback } from 'react';
import { createRoot } from 'react-dom/client';
import { SpreadsheetComponent } from '@syncfusion/ej2-react-spreadsheet';
import { DialogComponent } from '@syncfusion/ej2-react-popups';

function App() {

const dialogRef = useRef(null);
const openDialog = () => {
dialogRef.current.show();
};
const closeDialog = () => {
dialogRef.current.hide();
};
const onDialogOpen = useCallback(() => {
setTimeout(() => {
window.dispatchEvent(new Event('resize'));
Comment thread
NITHISHKUMARRAVIKUMAR marked this conversation as resolved.
Outdated
}, 0);
}, []);

return (
<div className="page">
<header className="header">
<h3 style={{ margin: 0 }}>Spreadsheet inside Dialog</h3>
<div style={{ marginLeft: 'auto' }}>
<button onClick={openDialog}>Open Spreadsheet</button>
</div>
</header>
<DialogComponent
ref={(dlg) => (dialogRef.current = dlg)}
isModal={true}
visible={false}
header="Spreadsheet"
showCloseIcon={true}
minHeight="80vh"
width="80vw"
height="80vh"
allowDragging={true}
closeOnEscape={true}
target={document.body}
overlayClick={closeDialog}
open={onDialogOpen}
>
<SpreadsheetComponent height="100%" width="100%" />
</DialogComponent>
</div>
);

}

export default App;

const root = createRoot(document.getElementById('root'));
root.render(<App />);
Loading