Performance Optimization
Jspreadsheet v12 improves performance with intelligent memory management, creating cell objects only when needed. This allows for smooth navigation through large datasets with minimal memory usage.
Key Features
- Virtual DOM: Renders only visible cells for optimal performance
- Lazy Loading: Creates cell objects on demand to minimize memory usage
- Viewport Management: Controls visible area for efficient rendering
Examples
Large Dataset Example
Create a spreadsheet with one billion cells (10,000 columns × 100,000 rows):
<html>
<script src="https://jspreadsheet.com/v12/jspreadsheet.js"></script>
<script src="https://jsuites.net/v6/jsuites.js"></script>
<link rel="stylesheet" href="https://jspreadsheet.com/v12/jspreadsheet.css" type="text/css" />
<link rel="stylesheet" href="https://jsuites.net/v6/jsuites.css" type="text/css" />
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Material+Icons" />
<div id="spreadsheet"></div>
<p id="console"></p>
<script>
// Set your JSS license key (The following key only works for one day)
jspreadsheet.setLicense('OTNhNzk2NGVlODJjMzNjNjViNWViZmJhYzA5ZmNmYWNlYTJhZDY1NGZhODliODRmMjk2OTZjMTJkZTZmZmY2OTJiNTBhOGUzZGIxMjIyOGJmN2E4NDA4NDk5NjhjYmZkNDk1MjRlMjY1ZDFmYTY2NTdlMTc3NjJlZDRhMTdjOTEsZXlKamJHbGxiblJKWkNJNklpSXNJbTVoYldVaU9pSktjM0J5WldGa2MyaGxaWFFpTENKa1lYUmxJam94TnpVNU56azFPREl5TENKa2IyMWhhVzRpT2xzaWFuTndjbVZoWkhOb1pXVjBMbU52YlNJc0ltTnZaR1Z6WVc1a1ltOTRMbWx2SWl3aWFuTm9aV3hzTG01bGRDSXNJbU56WWk1aGNIQWlMQ0p6ZEdGamEySnNhWFI2TG1sdklpd2lkMlZpWTI5dWRHRnBibVZ5TG1sdklpd2lkMlZpSWl3aWJHOWpZV3hvYjNOMElsMHNJbkJzWVc0aU9pSXpOQ0lzSW5OamIzQmxJanBiSW5ZM0lpd2lkamdpTENKMk9TSXNJbll4TUNJc0luWXhNU0lzSW1Ob1lYSjBjeUlzSW1admNtMXpJaXdpWm05eWJYVnNZU0lzSW5CaGNuTmxjaUlzSW5KbGJtUmxjaUlzSW1OdmJXMWxiblJ6SWl3aWFXMXdiM0owWlhJaUxDSmlZWElpTENKMllXeHBaR0YwYVc5dWN5SXNJbk5sWVhKamFDSXNJbkJ5YVc1MElpd2ljMmhsWlhSeklpd2lZMnhwWlc1MElpd2ljMlZ5ZG1WeUlpd2ljMmhoY0dWeklpd2labTl5YldGMElsMHNJbVJsYlc4aU9uUnlkV1Y5');
// Initial time before creating the table
let s = Date.now();
// Create the table
jspreadsheet(document.getElementById('spreadsheet'), {
tableOverflow: true,
tableWidth: '600px',
tableHeight: '300px',
worksheets: [{
minDimensions: [10000,100000],
}],
onload: function() {
// Final time
let e = Date.now();
// Update console
document.getElementById('console').innerText = 'The table was created in: ' + (e - s) + 'ms';
}
})
</script>
</html>
import React, { useRef } from "react";
import { Spreadsheet, Worksheet, jspreadsheet } from "@jspreadsheet/react";
import "jsuites/dist/jsuites.css";
import "jspreadsheet/dist/jspreadsheet.css";
// Set your JSS license key (The following key only works for one day)
jspreadsheet.setLicense('OTNhNzk2NGVlODJjMzNjNjViNWViZmJhYzA5ZmNmYWNlYTJhZDY1NGZhODliODRmMjk2OTZjMTJkZTZmZmY2OTJiNTBhOGUzZGIxMjIyOGJmN2E4NDA4NDk5NjhjYmZkNDk1MjRlMjY1ZDFmYTY2NTdlMTc3NjJlZDRhMTdjOTEsZXlKamJHbGxiblJKWkNJNklpSXNJbTVoYldVaU9pSktjM0J5WldGa2MyaGxaWFFpTENKa1lYUmxJam94TnpVNU56azFPREl5TENKa2IyMWhhVzRpT2xzaWFuTndjbVZoWkhOb1pXVjBMbU52YlNJc0ltTnZaR1Z6WVc1a1ltOTRMbWx2SWl3aWFuTm9aV3hzTG01bGRDSXNJbU56WWk1aGNIQWlMQ0p6ZEdGamEySnNhWFI2TG1sdklpd2lkMlZpWTI5dWRHRnBibVZ5TG1sdklpd2lkMlZpSWl3aWJHOWpZV3hvYjNOMElsMHNJbkJzWVc0aU9pSXpOQ0lzSW5OamIzQmxJanBiSW5ZM0lpd2lkamdpTENKMk9TSXNJbll4TUNJc0luWXhNU0lzSW1Ob1lYSjBjeUlzSW1admNtMXpJaXdpWm05eWJYVnNZU0lzSW5CaGNuTmxjaUlzSW5KbGJtUmxjaUlzSW1OdmJXMWxiblJ6SWl3aWFXMXdiM0owWlhJaUxDSmlZWElpTENKMllXeHBaR0YwYVc5dWN5SXNJbk5sWVhKamFDSXNJbkJ5YVc1MElpd2ljMmhsWlhSeklpd2lZMnhwWlc1MElpd2ljMlZ5ZG1WeUlpd2ljMmhoY0dWeklpd2labTl5YldGMElsMHNJbVJsYlc4aU9uUnlkV1Y5');
// Create a new data grid
export default function App() {
// Spreadsheet array of worksheets
const spreadsheet = useRef();
const console = useRef();
// Initial time before creating the table
let s = Date.now();
// When the data grid is ready
const onload = () => {
// Final time
let e = Date.now();
// Update console
console.current.innerText = 'The table was created in: ' + (e - s) + 'ms';
};
// Render data grid component
return (
<>
<Spreadsheet ref={spreadsheet} onload={onload} tableOverflow={true} tableWidth="600px" tableHeight="300px">
<Worksheet minDimensions={[10000, 100000]} />
</Spreadsheet>
<div ref={console}></div>
</>
);
}
<template>
<Spreadsheet @onload="onload" tableOverflow tableWidth="600px" tableHeight="300px">
<Worksheet :minDimensions="minDimensions" />
</Spreadsheet>
<div ref="console"></div>
</template>
<script>
import { Spreadsheet, Worksheet, jspreadsheet } from "@jspreadsheet/vue";
import "jsuites/dist/jsuites.css";
import "jspreadsheet/dist/jspreadsheet.css";
// Set your JSS license key (The following key only works for one day)
jspreadsheet.setLicense('OTNhNzk2NGVlODJjMzNjNjViNWViZmJhYzA5ZmNmYWNlYTJhZDY1NGZhODliODRmMjk2OTZjMTJkZTZmZmY2OTJiNTBhOGUzZGIxMjIyOGJmN2E4NDA4NDk5NjhjYmZkNDk1MjRlMjY1ZDFmYTY2NTdlMTc3NjJlZDRhMTdjOTEsZXlKamJHbGxiblJKWkNJNklpSXNJbTVoYldVaU9pSktjM0J5WldGa2MyaGxaWFFpTENKa1lYUmxJam94TnpVNU56azFPREl5TENKa2IyMWhhVzRpT2xzaWFuTndjbVZoWkhOb1pXVjBMbU52YlNJc0ltTnZaR1Z6WVc1a1ltOTRMbWx2SWl3aWFuTm9aV3hzTG01bGRDSXNJbU56WWk1aGNIQWlMQ0p6ZEdGamEySnNhWFI2TG1sdklpd2lkMlZpWTI5dWRHRnBibVZ5TG1sdklpd2lkMlZpSWl3aWJHOWpZV3hvYjNOMElsMHNJbkJzWVc0aU9pSXpOQ0lzSW5OamIzQmxJanBiSW5ZM0lpd2lkamdpTENKMk9TSXNJbll4TUNJc0luWXhNU0lzSW1Ob1lYSjBjeUlzSW1admNtMXpJaXdpWm05eWJYVnNZU0lzSW5CaGNuTmxjaUlzSW5KbGJtUmxjaUlzSW1OdmJXMWxiblJ6SWl3aWFXMXdiM0owWlhJaUxDSmlZWElpTENKMllXeHBaR0YwYVc5dWN5SXNJbk5sWVhKamFDSXNJbkJ5YVc1MElpd2ljMmhsWlhSeklpd2lZMnhwWlc1MElpd2ljMlZ5ZG1WeUlpd2ljMmhoY0dWeklpd2labTl5YldGMElsMHNJbVJsYlc4aU9uUnlkV1Y5');
export default {
components: {
Spreadsheet,
Worksheet,
},
data() {
return {
minDimensions: [10000, 100000],
startTime: null,
};
},
methods: {
onload() {
const endTime = Date.now();
this.$refs.console.innerText = 'The table was created in: ' + (endTime - this.startTime) + 'ms';
},
},
mounted() {
this.startTime = Date.now();
},
};
</script>
import { Component, ViewChild, ElementRef, AfterViewInit } from '@angular/core';
import jspreadsheet from 'jspreadsheet';
import "jspreadsheet/dist/jspreadsheet.css";
import "jsuites/dist/jsuites.css";
// Set your JSS license key (The following key only works for one day)
jspreadsheet.setLicense('OTNhNzk2NGVlODJjMzNjNjViNWViZmJhYzA5ZmNmYWNlYTJhZDY1NGZhODliODRmMjk2OTZjMTJkZTZmZmY2OTJiNTBhOGUzZGIxMjIyOGJmN2E4NDA4NDk5NjhjYmZkNDk1MjRlMjY1ZDFmYTY2NTdlMTc3NjJlZDRhMTdjOTEsZXlKamJHbGxiblJKWkNJNklpSXNJbTVoYldVaU9pSktjM0J5WldGa2MyaGxaWFFpTENKa1lYUmxJam94TnpVNU56azFPREl5TENKa2IyMWhhVzRpT2xzaWFuTndjbVZoWkhOb1pXVjBMbU52YlNJc0ltTnZaR1Z6WVc1a1ltOTRMbWx2SWl3aWFuTm9aV3hzTG01bGRDSXNJbU56WWk1aGNIQWlMQ0p6ZEdGamEySnNhWFI2TG1sdklpd2lkMlZpWTI5dWRHRnBibVZ5TG1sdklpd2lkMlZpSWl3aWJHOWpZV3hvYjNOMElsMHNJbkJzWVc0aU9pSXpOQ0lzSW5OamIzQmxJanBiSW5ZM0lpd2lkamdpTENKMk9TSXNJbll4TUNJc0luWXhNU0lzSW1Ob1lYSjBjeUlzSW1admNtMXpJaXdpWm05eWJYVnNZU0lzSW5CaGNuTmxjaUlzSW5KbGJtUmxjaUlzSW1OdmJXMWxiblJ6SWl3aWFXMXdiM0owWlhJaUxDSmlZWElpTENKMllXeHBaR0YwYVc5dWN5SXNJbk5sWVhKamFDSXNJbkJ5YVc1MElpd2ljMmhsWlhSeklpd2lZMnhwWlc1MElpd2ljMlZ5ZG1WeUlpd2ljMmhoY0dWeklpd2labTl5YldGMElsMHNJbVJsYlc4aU9uUnlkV1Y5');
// Initial time before creating the table
let s = Date.now();
@Component({
standalone: true,
selector: 'app-root',
template: `<div #spreadsheet></div><div id="console"></div>`,
})
export class AppComponent implements AfterViewInit {
@ViewChild('spreadsheet') spreadsheet: ElementRef;
// Worksheets
worksheets: jspreadsheet.worksheetInstance[];
// Create a new data grid
ngAfterViewInit() {
// Create spreadsheet
this.worksheets = jspreadsheet(this.spreadsheet.nativeElement, {
tableOverflow: true,
tableWidth: '600px',
tableHeight: '300px',
worksheets: [
{
minDimensions: [10000, 100000],
},
],
onload: function () {
// Final time
let e = Date.now();
// Update console
let console = document.getElementById('console');
if (console) {
console.innerText = 'The table was created in: ' + (e - s) + 'ms';
}
},
});
}
}
Performance Optimization Methods
Spreadsheet Level
Property | Description | Type |
---|---|---|
tableOverflow |
Enable scrollable viewport for large datasets | boolean |
tableWidth |
Set fixed width for the viewport | string |
tableHeight |
Set fixed height for the viewport | string |
fullscreen |
Automatically adjust grid to use full screen space | boolean |
Worksheet level
Property | Description | Type |
---|---|---|
pagination |
Number of rows to display per page | number |