Footers in Jspreadsheet allow you to display information or calculations at the bottom of a data grid. This section provides instructions for implementing footers during initialization or runtime using programming techniques.
Documentation
Methods
The following methods provide programmatic interaction with the footers of the Jspreadsheet data grid.
Method
Description
getFooter()
Get the current footer settings. getFooter() : Array
setFooter()
Set the footer settings. setFooter(newValue: Array) : void
resetFooter()
Reset and remove the footers. resetFooter() : void
refreshFooter()
Recalculate the values in the footer. refreshFooter() : void
getFooterValue(number, number)
Get the current footer cell value from the coordinates x, y. getFooterValue(x: Number, y: Number) : void
setFooterValue(number, number, string)
Set the value of a footer cell to the coordinates x, y. setFooterValue(x: Number, y: Number, value: String) : void
Events
The following events allow you to intercept user interactions with the Jspreadsheet data grid.
Event
Description
onchangefooter
This method is invoked when the footers undergo modification in the Jspreadsheet data grid. onchangefooter(worksheet: Object, newValue: String, oldValue: String) : null
onchangefootervalue
This method is called when the values of the footers in the Jspreadsheet data grid are modified. onchangefootervalue(worksheet: Object, x: Number, y: Number, newValue: String) : null
onrenderfootercell
This method is called when a footer cell is rendered. onrenderfootercell(worksheet: Object, x: Number, y: Number, newValue: String, td: HTMLElement) : null
Initial Settings
The following property is available during the initialization of the Jspreadsheet online spreadsheet.
Property
Description
footers: string[]
Footers definitions
Examples
Basic footer usage
In the example below the custom SUMCOL formula is implemented to consider only visible rows in the calculations.
Programmatic updates
How to change the formulas in the footers after the initialization.
Sheet1
Search:
A
B
C
1
Cheese
10
6
2
Apples
5
4
3
Carrots
5
1
4
Oranges
6
2
Total
$ 26.00
$ 13.00
<html><scriptsrc="https://jspreadsheet.com/v10/jspreadsheet.js"></script><scriptsrc="https://jsuites.net/v5/jsuites.js"></script><linkrel="stylesheet"href="https://jsuites.net/v5/jsuites.css"type="text/css" /><linkrel="stylesheet"href="https://jspreadsheet.com/v10/jspreadsheet.css"type="text/css" /><linkrel="stylesheet"href="https://fonts.googleapis.com/css?family=Material+Icons" /><divid="spreadsheet"></div><br/><inputtype='button'value='Change to AVERAGE'id="updatebtn"><script>// Set your JSS license key (The following key only works for one day)
jspreadsheet.setLicense('MzIxMThjMjgxNTRjZGYxNTZlNzNjY2EzYzhhY2FiOTAwZDFkNjkyZGY5N2UzZjljNTVkZjAzNWFmMjg5MjI1YWJmNDViZjgyNzA2ZWJjN2ZiOGUwZmFhMjQ1NGFhZWQ4ZGI4ZjllNzExNGZmYTk1YmEyMWZhZGQ5YTRiMmNlNGQsZXlKamJHbGxiblJKWkNJNklpSXNJbTVoYldVaU9pSktjM0J5WldGa2MyaGxaWFFpTENKa1lYUmxJam94TnpRME1EZzFPREV6TENKa2IyMWhhVzRpT2xzaWFuTndjbVZoWkhOb1pXVjBMbU52YlNJc0ltTnZaR1Z6WVc1a1ltOTRMbWx2SWl3aWFuTm9aV3hzTG01bGRDSXNJbU56WWk1aGNIQWlMQ0ozWldJaUxDSnNiMk5oYkdodmMzUWlYU3dpY0d4aGJpSTZJak0wSWl3aWMyTnZjR1VpT2xzaWRqY2lMQ0oyT0NJc0luWTVJaXdpZGpFd0lpd2lkakV4SWl3aVkyaGhjblJ6SWl3aVptOXliWE1pTENKbWIzSnRkV3hoSWl3aWNHRnljMlZ5SWl3aWNtVnVaR1Z5SWl3aVkyOXRiV1Z1ZEhNaUxDSnBiWEJ2Y25SbGNpSXNJbUpoY2lJc0luWmhiR2xrWVhScGIyNXpJaXdpYzJWaGNtTm9JaXdpY0hKcGJuUWlMQ0p6YUdWbGRITWlMQ0pqYkdsbGJuUWlMQ0p6WlhKMlpYSWlMQ0p6YUdGd1pYTWlYU3dpWkdWdGJ5STZkSEoxWlgwPQ==');
// Create the spreadsheetlet worksheets = jspreadsheet(document.getElementById('spreadsheet'), {
worksheets: [{
data: [
['Cheese', 10, 6.00],
['Apples', 5, 4.00],
['Carrots', 5, 1.00],
['Oranges', 6, 2.00],
],
footers: [
[
'Total',
'=SUM(B:B)',
'=SUM(C:C)',
]
],
columns: [
{ width:'400px' }
]
}],
onrenderfootercell: function(worksheet, x, y, value, td) {
if (value && x > 0) {
// Applying a mask to the footer value
td.innerText = jSuites.mask.render(value, { mask: '$ #,##0.00'}, true);
}
}
});
let update = function() {
worksheets[0].setFooterValue(0,0,'Average');
worksheets[0].setFooterValue(1,0,'=AVERAGE(B:B)');
worksheets[0].setFooterValue(2,0,'=AVERAGE(C:C)');
}
document.getElementById("updatebtn").onclick = update
</script></html>
importReact, { useRef } from"react";
import { Spreadsheet, Worksheet } from"@jspreadsheet/react";
import jSuites from"jsuites";
import formula from"@jspreadsheet/formula";
// License
jspreadsheet.setLicense('MzIxMThjMjgxNTRjZGYxNTZlNzNjY2EzYzhhY2FiOTAwZDFkNjkyZGY5N2UzZjljNTVkZjAzNWFmMjg5MjI1YWJmNDViZjgyNzA2ZWJjN2ZiOGUwZmFhMjQ1NGFhZWQ4ZGI4ZjllNzExNGZmYTk1YmEyMWZhZGQ5YTRiMmNlNGQsZXlKamJHbGxiblJKWkNJNklpSXNJbTVoYldVaU9pSktjM0J5WldGa2MyaGxaWFFpTENKa1lYUmxJam94TnpRME1EZzFPREV6TENKa2IyMWhhVzRpT2xzaWFuTndjbVZoWkhOb1pXVjBMbU52YlNJc0ltTnZaR1Z6WVc1a1ltOTRMbWx2SWl3aWFuTm9aV3hzTG01bGRDSXNJbU56WWk1aGNIQWlMQ0ozWldJaUxDSnNiMk5oYkdodmMzUWlYU3dpY0d4aGJpSTZJak0wSWl3aWMyTnZjR1VpT2xzaWRqY2lMQ0oyT0NJc0luWTVJaXdpZGpFd0lpd2lkakV4SWl3aVkyaGhjblJ6SWl3aVptOXliWE1pTENKbWIzSnRkV3hoSWl3aWNHRnljMlZ5SWl3aWNtVnVaR1Z5SWl3aVkyOXRiV1Z1ZEhNaUxDSnBiWEJ2Y25SbGNpSXNJbUpoY2lJc0luWmhiR2xrWVhScGIyNXpJaXdpYzJWaGNtTm9JaXdpY0hKcGJuUWlMQ0p6YUdWbGRITWlMQ0pqYkdsbGJuUWlMQ0p6WlhKMlpYSWlMQ0p6YUdGd1pYTWlYU3dpWkdWdGJ5STZkSEoxWlgwPQ==');
// Load the formula pro extension
jspreadsheet.setExtensions({ formula });
// Create a new data gridexportdefaultfunctionApp() {
// Spreadsheet array of worksheetsconst spreadsheet = useRef();
// Dataconst data = [
['Cheese', 10, 6.00, "=B1*C1"],
['Apples', 5, 4.00, "=B2*C2"],
['Carrots', 5, 1.00, "=B3*C3"],
['Oranges', 6, 2.00, "=B4*C4"],
];
// Columnsconst columns = [
{ width:'400px' }
];
// Data grid cell definitionsconst footers = [
[
'Total',
'=SUM(B:B)',
'=SUM(C:C)',
]
];
// Eventconstonrenderfootercell = (worksheet, x, y, value, td) => {
if (value && x > 0) {
// Applying a mask to the footer value
td.innerText = jSuites.mask.render(value, { mask: '$ #,##0.00'}, true);
}
}
// Updateconstupdate = () => {
spreadsheet.current[0].setFooterValue(0,0,'Avarage');
spreadsheet.current[0].setFooterValue(1,0,'=AVERAGE(B:B)');
spreadsheet.current[0].setFooterValue(2,0,'=AVERAGE(C:C)');
}
// Render data grid componentreturn (
<Spreadsheetref={spreadsheet}onrenderfootercell={onrenderfootercell}><Worksheetdata={data}columns={columns}footers={footers} /></Spreadsheet><inputtype='button'value='Change to AVERAGE'onClick={()=>update()}'>
);
}
import { Component, ViewChild, ElementRef } 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('MzIxMThjMjgxNTRjZGYxNTZlNzNjY2EzYzhhY2FiOTAwZDFkNjkyZGY5N2UzZjljNTVkZjAzNWFmMjg5MjI1YWJmNDViZjgyNzA2ZWJjN2ZiOGUwZmFhMjQ1NGFhZWQ4ZGI4ZjllNzExNGZmYTk1YmEyMWZhZGQ5YTRiMmNlNGQsZXlKamJHbGxiblJKWkNJNklpSXNJbTVoYldVaU9pSktjM0J5WldGa2MyaGxaWFFpTENKa1lYUmxJam94TnpRME1EZzFPREV6TENKa2IyMWhhVzRpT2xzaWFuTndjbVZoWkhOb1pXVjBMbU52YlNJc0ltTnZaR1Z6WVc1a1ltOTRMbWx2SWl3aWFuTm9aV3hzTG01bGRDSXNJbU56WWk1aGNIQWlMQ0ozWldJaUxDSnNiMk5oYkdodmMzUWlYU3dpY0d4aGJpSTZJak0wSWl3aWMyTnZjR1VpT2xzaWRqY2lMQ0oyT0NJc0luWTVJaXdpZGpFd0lpd2lkakV4SWl3aVkyaGhjblJ6SWl3aVptOXliWE1pTENKbWIzSnRkV3hoSWl3aWNHRnljMlZ5SWl3aWNtVnVaR1Z5SWl3aVkyOXRiV1Z1ZEhNaUxDSnBiWEJ2Y25SbGNpSXNJbUpoY2lJc0luWmhiR2xrWVhScGIyNXpJaXdpYzJWaGNtTm9JaXdpY0hKcGJuUWlMQ0p6YUdWbGRITWlMQ0pqYkdsbGJuUWlMQ0p6WlhKMlpYSWlMQ0p6YUdGd1pYTWlYU3dpWkdWdGJ5STZkSEoxWlgwPQ==');
// Create component@Component({
selector: "app-root",
template: `<div #spreadsheet></div>
<button type="button" (click)="update()">Update</button>`,
})
exportclassAppComponent {
@ViewChild("spreadsheet") spreadsheet: ElementRef;
// Worksheetsworksheets: jspreadsheet.worksheetInstance[];
// Create a new data gridngAfterViewInit() {
// Create spreadsheetthis.worksheets = jspreadsheet(this.spreadsheet.nativeElement, {
worksheets: [{
data: [
['Cheese', 10, 6.00],
['Apples', 5, 4.00],
['Carrots', 5, 1.00],
['Oranges', 6, 2.00],
],
footers: [
[
'Total',
'=SUM(B:B)',
'=SUM(C:C)',
]
],
columns: [
{ width:'400px' }
]
}],
onrenderfootercell: function(worksheet, x, y, value, td) {
if (value && x > 0) {
// Applying a mask to the footer value
td.innerText = jSuites.mask.render(value, { mask: '$ #,##0.00'}, true);
}
}
});
}
update() {
this.worksheets[0].setFooterValue(0,0,'Avarage');
this.worksheets[0].setFooterValue(1,0,'=AVERAGE(B:B)');
this.worksheets[0].setFooterValue(2,0,'=AVERAGE(C:C)');
}
}
Cross footer calculations
Footers are used to hold static information, but the following example creates a complete cross-footer calculations with realtime updates using onafterchanges. See our cross spreadsheet footer calculations on jsfiddle
JSS1
Search:
A
B
1
43
64
2
51
46
94
JSS2
Search:
A
B
1
34
53
2
51
35
85
JSS3
Search:
A
B
1
34
53
2
51
35
264
<html><scriptsrc="https://jspreadsheet.com/v10/jspreadsheet.js"></script><scriptsrc="https://jsuites.net/v5/jsuites.js"></script><linkrel="stylesheet"href="https://jsuites.net/v5/jsuites.css"type="text/css" /><linkrel="stylesheet"href="https://jspreadsheet.com/v10/jspreadsheet.css"type="text/css" /><linkrel="stylesheet"href="https://fonts.googleapis.com/css?family=Material+Icons" /><divid="spreadsheet1"></div><br><divid="spreadsheet2"></div><br><divid="spreadsheet3"></div><br><script>// Set your JSS license key (The following key only works for one day)
jspreadsheet.setLicense('MzIxMThjMjgxNTRjZGYxNTZlNzNjY2EzYzhhY2FiOTAwZDFkNjkyZGY5N2UzZjljNTVkZjAzNWFmMjg5MjI1YWJmNDViZjgyNzA2ZWJjN2ZiOGUwZmFhMjQ1NGFhZWQ4ZGI4ZjllNzExNGZmYTk1YmEyMWZhZGQ5YTRiMmNlNGQsZXlKamJHbGxiblJKWkNJNklpSXNJbTVoYldVaU9pSktjM0J5WldGa2MyaGxaWFFpTENKa1lYUmxJam94TnpRME1EZzFPREV6TENKa2IyMWhhVzRpT2xzaWFuTndjbVZoWkhOb1pXVjBMbU52YlNJc0ltTnZaR1Z6WVc1a1ltOTRMbWx2SWl3aWFuTm9aV3hzTG01bGRDSXNJbU56WWk1aGNIQWlMQ0ozWldJaUxDSnNiMk5oYkdodmMzUWlYU3dpY0d4aGJpSTZJak0wSWl3aWMyTnZjR1VpT2xzaWRqY2lMQ0oyT0NJc0luWTVJaXdpZGpFd0lpd2lkakV4SWl3aVkyaGhjblJ6SWl3aVptOXliWE1pTENKbWIzSnRkV3hoSWl3aWNHRnljMlZ5SWl3aWNtVnVaR1Z5SWl3aVkyOXRiV1Z1ZEhNaUxDSnBiWEJ2Y25SbGNpSXNJbUpoY2lJc0luWmhiR2xrWVhScGIyNXpJaXdpYzJWaGNtTm9JaXdpY0hKcGJuUWlMQ0p6YUdWbGRITWlMQ0pqYkdsbGJuUWlMQ0p6WlhKMlpYSWlMQ0p6YUdGd1pYTWlYU3dpWkdWdGJ5STZkSEoxWlgwPQ==');
// Create the spreadsheetlet s1 = jspreadsheet(document.getElementById('spreadsheet1'), {
worksheets: [{
worksheetName: 'JSS1',
data: [
[43, 64],
[51, 46],
],
footers: [
['=SUM(A:A)']
],
}],
onafterchanges: function () {
s3[0].setFooter();
}
});
// Create the spreadsheetlet s2 = jspreadsheet(document.getElementById('spreadsheet2'), {
worksheets: [{
worksheetName: 'JSS2',
data: [
[34, 53],
[51, 35],
],
footers: [
['=SUM(A:A)']
],
}],
onafterchanges: function () {
s3[0].setFooter();
}
});
// Create the spreadsheetlet s3 = jspreadsheet(document.getElementById('spreadsheet3'), {
worksheets: [{
worksheetName: 'JSS3',
data: [
[34, 53],
[51, 35],
],
footers: [
['=SUM(JSS1!A:A,JSS2!A:A,JSS3!A:A)']
],
}],
onafterchanges: function () {
s3[0].setFooter();
}
});
</script></html>
importReact, { useRef } from"react";
import { Spreadsheet, Worksheet, jspreadsheet } from"@jspreadsheet/react";
import formula from"@jspreadsheet/formula";
// License
jspreadsheet.setLicense('MzIxMThjMjgxNTRjZGYxNTZlNzNjY2EzYzhhY2FiOTAwZDFkNjkyZGY5N2UzZjljNTVkZjAzNWFmMjg5MjI1YWJmNDViZjgyNzA2ZWJjN2ZiOGUwZmFhMjQ1NGFhZWQ4ZGI4ZjllNzExNGZmYTk1YmEyMWZhZGQ5YTRiMmNlNGQsZXlKamJHbGxiblJKWkNJNklpSXNJbTVoYldVaU9pSktjM0J5WldGa2MyaGxaWFFpTENKa1lYUmxJam94TnpRME1EZzFPREV6TENKa2IyMWhhVzRpT2xzaWFuTndjbVZoWkhOb1pXVjBMbU52YlNJc0ltTnZaR1Z6WVc1a1ltOTRMbWx2SWl3aWFuTm9aV3hzTG01bGRDSXNJbU56WWk1aGNIQWlMQ0ozWldJaUxDSnNiMk5oYkdodmMzUWlYU3dpY0d4aGJpSTZJak0wSWl3aWMyTnZjR1VpT2xzaWRqY2lMQ0oyT0NJc0luWTVJaXdpZGpFd0lpd2lkakV4SWl3aVkyaGhjblJ6SWl3aVptOXliWE1pTENKbWIzSnRkV3hoSWl3aWNHRnljMlZ5SWl3aWNtVnVaR1Z5SWl3aVkyOXRiV1Z1ZEhNaUxDSnBiWEJ2Y25SbGNpSXNJbUpoY2lJc0luWmhiR2xrWVhScGIyNXpJaXdpYzJWaGNtTm9JaXdpY0hKcGJuUWlMQ0p6YUdWbGRITWlMQ0pqYkdsbGJuUWlMQ0p6WlhKMlpYSWlMQ0p6YUdGd1pYTWlYU3dpWkdWdGJ5STZkSEoxWlgwPQ==');
// Load the formula pro extension
jspreadsheet.setExtensions({ formula });
// Create a new data gridexportdefaultfunctionApp() {
// Spreadsheet array of worksheetsconst spreadsheet = useRef();
// Update footers from the last data gridconst onafterchanges = function () {
s3[0].setFooter();
}
const s1 = [{
worksheetName: 'JSS1',
data: [
[43, 64],
[51, 46],
],
footers: [
['=SUM(A:A)']
],
}]
const s2 = [{
worksheetName: 'JSS2',
data: [
[34, 53],
[51, 35],
],
footers: [
['=SUM(A:A)']
],
}]
const s3 = [{
worksheetName: 'JSS3',
data: [
[34, 53],
[51, 35],
],
footers: [
['=SUM(JSS1!A:A,JSS2!A:A,JSS3!A:A)']
],
}]
// Render data grid componentreturn (
<Spreadsheetworksheets={s1}onafterchanges={onafterchanges} /><Spreadsheetworksheets={s2}onafterchanges={onafterchanges} /><Spreadsheetworksheets={s3}onafterchanges={onafterchanges} />
);
}