Events
Jspreadsheet offers comprehensive event handling for building interactive spreadsheet applications. You can respond to user actions and data changes through:
- Individual Event Handlers: Specific methods like
onchange
,onclick
, etc. - Global Event Dispatcher: The
onevent
method that handles all events centrally - Plugin Events: Event handling implementation within spreadsheet plugins
Documentation
Specific Event Handlers
Jspreadsheet provides many specific event handlers for different user interactions and data operations:
Event | Description |
---|---|
onload |
This method is called when the data in the spreadsheet is ready.onload(spreadsheet: Object) => void |
onclick |
When the spreadsheet is clicked. Sections: nested | header | row | cell | select-all | tabs | cloning | toolbar | footeronclick(worksheet: Object, section: String, x: Number, y: Number, event: Object) => void |
onundo |
When undo is appliedonundo(worksheet: Object, historyRecord: Object) => void |
onredo |
When redo is appliedonredo(worksheet: Object, historyRecord: Object) => void |
onerror |
When a new error happens.onerror(spreadsheet: Object, result: Object) => void |
onbeforechange |
Before a column value is changed. It is possible to overwrite the original value, by returning a new value.onbeforechange(worksheet: Object, cell: DOMElement, x: Number, y: Number, value: Any) => Boolean | Any |
onchange |
After a column value is changed.onchange(worksheet: Object, cell: DOMElement, x: Number, y: Number, newValue: Any, oldValue: Any) => void |
onrender |
After a cell value is rendered.onrender(worksheet: Object, cell: HTMLElement, x: Number, y: Number, newValue: Any, options: Column) => void |
onbeforechanges |
Before all changes are applied in the table.onbeforechanges(worksheet: Object, records: Array, origin: string) |
onafterchanges |
After all changes are applied in the table.onafterchanges(worksheet: Object, records: Array, origin: string) |
oncopy |
When a copy is performed in the spreadsheet. Any string returned will overwrite the user data or return null to progress with the default behavior.oncopy(worksheet: Object, selectedCells: Number[], data: String, cut: Boolean) => String |
onbeforepaste |
Before the paste action is performed. Can return parsed or filtered data, can cancel the action when return false.onbeforepaste(worksheet: Object, data: Array, x: Number, y: Number, properties: Object[]) => boolean | Array |
onpaste |
After a paste action is performed in the spreadsheet.onpaste(worksheet: Object, data: Array) => void |
onbeforeinsertrow |
Before a new row is inserted. Return false to cancel the user action.onbeforeinsertrow(worksheet: Object, rows: Object[]) => Boolean | Object[] | void |
oninsertrow |
After a new row is inserted.oninsertrow(worksheet: Object, rows: Object[]) => void |
onbeforedeleterow |
Before a row is deleted. Return false to cancel the user action.onbeforedeleterow(worksheet: Object, rows: Number[]) => Number[] | Boolean | void |
ondeleterow |
After a row is deleted.ondeleterow(worksheet: Object, rows: Number[]) => void |
onbeforeinsertcolumn |
Before a new column is inserted. Return false to cancel the user action.onbeforeinsertcolumn(worksheet: Object, columns: Object[]) => Boolean | Object[] | void |
oninsertcolumn |
After a new column is inserted.oninsertcolumn(worksheet: Object, column: Object[]) => void |
onbeforedeletecolumn |
Before a column is excluded. Return false to cancel the user action.onbeforedeletecolumn(worksheet: Object, cols: Number[]) => boolean | Number[] | void |
ondeletecolumn |
After a column is excluded.ondeletecolumn(worksheet: Object, cols: Number[]) => void |
onmoverow |
After a row is moved to a new position.onmoverow(worksheet: Object, origin: Number, destination: Number, quantity: Number) => void; |
onmovecolumn |
After a column is moved to a new position.onmovecolumn(worksheet: Object, origin: Number, destination: Number, quantity: Number) => void |
onresizerow |
After a height change for one or more rows.onresizerow(worksheet: Object, row: Mixed, height: Mixed, oldHeight: Mixed) => void |
onresizecolumn |
After a column width change for one or more columns.onresizecolumn(worksheet: Object, column: Mixed, width: Mixed, oldWidth: Mixed) => void |
onbeforeselection |
Before a selection happens.onbeforeselection(worksheet: Object, px: Number, py: Number, ux: Number, uy: Number, origin?: Object) => Boolean | void |
onselection |
When the selection is changed.onselection(worksheet: Object, px: Number, py: Number, ux: Number, uy: Number, origin?: Object) => void |
onbeforecomments |
Before a new comment is added or updated. Return false to cancel the event.onbeforecomments(worksheet: Object, newValues: Object) => Boolean | void |
oncomments |
After a new comment is added or updated.oncomments(worksheet: Object, cells: Object, oldValues: Object) => void |
onbeforesort |
It runs before sorting a column. It should return an array with a custom sorting or false to cancel the user action.onbeforesort(worksheet: Object, column: Number, direction: Number, newOrderValues: Array) => Any |
onsort |
When a column is sorted.onsort(worksheet: Object, column: Number, direction: Number, newOrderValues: Array) => void |
onfocus |
When the spreadsheet gets the focus.onfocus(worksheet: Object) => void |
onblur |
When the spreadsheet loses the focus.onblur(worksheet: Object) => void |
onmerge |
When merge cells is executed.onmerge(worksheet: Object, newValue: Object, oldValue: Object) => void |
onchangeheader |
When the header title is changed.onchangeheader(worksheet: Object, column: Number, newValue: String, oldValue: String) => void |
onchangefooter |
When the footers are created or updated.onchangefooter(worksheet: Object, newValue: [], oldValue: []) => void |
onchangefootervalue |
When the value in a cell footer is changed.onchangefootervalue(worksheet: Object, records: object[]) => void |
onrenderfootercell |
When a footer cell is rendered.onrenderfootercell(worksheet: Object, record: object) => void |
onchangenested |
When updating the nested headersonchangenested(worksheet: Object, options: object) => void |
onchangenestedcell |
When updating a nested cellonchangenestedcell(worksheet: Object, x: Number, y: Number, properties: Object) => void |
oncreateeditor |
When an editor is created.oncreateeditor(worksheet: Object, cell: DOMElement, x: Number, y: Number, element: DOMElement, options: Object) => void |
oneditionstart |
When the edition starts.oneditionstart(worksheet: Object, cell: DOMElement, x: Number, y: Number) => void | boolean |
oneditionend |
When the edition ends.oneditionend(worksheet: Object, cell: DOMElement, x: Number, y: Number, newValue: Any, save: Boolean) => void |
onchangestyle |
When the style of a cell is changed.onchangestyle(worksheet: Object, newValue: Object, oldValue: Object) => void |
onchangemeta |
When cell meta information is added or updated.onchangemeta(worksheet: Object, newValue: Object) => void |
onresetmeta |
When cell metadata is reset.onresetmeta(worksheet: Object, cellNames: String[]) => void |
onresetstyle |
When cell style is reset.onresetstyle(worksheet: Object, cellNames: String[]) => void |
onvalidation |
When validation is created, changed, or removed.onvalidation(worksheet: Object, records: Object[]) => void |
onfreezecolumns |
When columns are frozen.onfreezecolumns(worksheet: Object, columns: Number[]) => void |
onfreezerows |
When rows are frozen.onfreezerows(worksheet: Object, rows: Number[]) => void |
onbeforechangepage |
Before the page is changed. Can cancel the action by returning false.onbeforechangepage(worksheet: Object, pageNumber: Number, oldPage: Number, quantityPerPage: Number) => Boolean | void |
onchangepage |
When pagination is enabled and the user changes the page.onchangepage(worksheet: Object, pageNumber: Number, oldPageNumber: Number, quantityPerPage: Number) => void |
onbeforecreateworksheet |
Add or change the options for a new worksheet.onbeforecreateworksheet(worksheetOptions: Object, position: Number) => boolean | Any |
oncreateworksheet |
When the user creates a new worksheet.oncreateworksheet(worksheet: Object, worksheetOptions: Object, position: Number) => void |
onrenameworksheet |
When the user renames a worksheet.onrenameworksheet(worksheet: Object, worksheetIndex: Number, newValue: String, oldValue: String) => void |
ondeleteworksheet |
When the user deletes a worksheet.ondeleteworksheet(worksheet: Object, position: Number) => void |
onmoveworksheet |
When the user updates the worksheet tab position.onmoveworksheet(worksheet: Object, from: Number, to: Number) => void |
onopenworksheet |
When the user opens a worksheet.onopenworksheet(worksheet: Object, worksheet: Number) => void |
onchangerowid |
When there is a row id update.onchangerowid(worksheet: Object, rows: Array) => void |
onbeforefilter |
Action to be executed before filtering rows. It can cancel the action by returning false.onbeforefilter(worksheet: Object, filters: Array, data: Array) => void |
onfilter |
After the filter has been applied to the rows.onfilter(worksheet: Object, filters: Array, data: Array) => void |
oncreatecell |
When a new cell is created.oncreatecell(worksheet: Object, element: HTMLElement, x: Number, y: Number, value: String) => void |
oncreaterow |
After a new row is inserted.oncreaterow(worksheet: Object, rowNumber: Number, tr: HTMLElement) => void |
onbeforeformula |
Before executing a formula.onbeforeformula(worksheet: Object, expression: String, x: Number, y: Number) => void | string | boolean |
onformulachain |
Get the information about the expressions executed from the formula chain.onformulachain(worksheet: Object, expressions: Array) => void |
onopenfilter |
Customize the items available when the filter editor is open.onopenfilter(worksheet: Object, column: number, options: Array) => options | void |
onresize |
Viewport dimensions has changed.onresize(worksheet: Object, w: number, h: number) => void |
onchangedefinednames |
When definedNames is updated.onchangedefinednames(worksheet: Object, data: []) => void |
oninput |
New char is entered on editor.oninput(worksheet: Object, event: Object, text: String) => void |
onkeydown |
Keyboard event handler.onkeydown(worksheet: Object, event: Object) => void |
onchangerowvisibility |
When the visibility of rows changes.onchangerowvisibility(worksheet: Object, state: boolean: affected: []]) => void |
onchangecolumnvisibility |
When the visibility of cols changes.onchangecolumnvisibility(worksheet: Object, state: boolean: affected: []]) => void |
onsearchstart |
It happens before all the search events.onsearchstart(worksheet: Object, terms: String) |
onsearchrow |
It helps to customize the searching process.onsearchrow(worksheet: Object, rowNumber: number, terms: String) |
onbeforesearch |
Action to be executed before the search. It can be used to cancel or to intercept and customize the search process.onbeforesearch(worksheet: Object, terms: String, results: Array, search: Object) |
onsearch |
After the search process is completed.onsearch(worksheet: Object, terms: String, rowNumber: Array, search: Object) |
oncreatecolumn |
When a new column is created.oncreatecolumn(worksheet: Object, columnNumber: number, td: HTMLElement, options: Object) |
ongrouprow |
When the user creates a group of rowsoncreaterowgroup?: (worksheet: object, row: number, elements: number|undefined) => void |
onopenrowgroup |
When the user opens a group of rowsonopenrowgroup?: (worksheet: object, row: number) => void |
oncloserowgroup |
When the user closes a group of rowsoncloserowgroup?: (worksheet: object, row: number) => void |
ongroupcolumn |
When the user creates a group of columnsoncreatecolumngroup?: (worksheet: Object, column: Number, elements: Number|undefined) => void |
onopencolumngroup |
When the user opens a group of columnsonopencolumngroup?: (worksheet: Object, column: Number) => void |
onclosecolumngroup |
When the user closes a group of columnsonclosecolumngroup(worksheet: Object, column: Number) => void |
onchangemedia |
When a media object is added, removed or updated.onchangemedia(worksheet: Object, newValue: Object[], oldValue: Object[], affectedRecords: Object[]) => void |
onbeforeloadimage |
Before loading an image.onbeforeloadimage(worksheet: Object, img: HTMLImageElement, options: Object) => String | false | undefined |
onchangeworksheetstate |
When worksheet visibility is changed.onchangeworksheetstate(spreadsheet: Object, worksheetIndex: Number, state: Boolean) => void |
onchangereferences |
When there is a reference update.onchangereferences?: (worksheet: object, affected: object, deletedTokens: string[], deletedColumns: string[], deletedRows: string[]) => void; |
onchangeproperty |
Updates on cell properties via setProperty or updateProperty.onchangeproperty(worksheet: Object, updates: Object[]) => void |
onchangeconfig |
Fire when there is a change in the configuration.getConfig(config: string, spreadsheetLevel?: boolean) => void |
onbeforedeleteworksheet |
Intercept the exclusion o a worksheet, return false to cancel the user action.onbeforedeleteworksheet(worksheet: Object, worksheetNumber: Number) : false | void |
onbeforemovecolumn |
Before a column is moved to a new position. Return false to cancel the user action.onbeforemovecolumn(worksheet: Object, origin: Number, destination: Number, quantity: Number) => boolean | void |
onbeforemoverow |
Before a row is moved to a new position. Return false to cancel the user action.onbeforemoverow(worksheet: Object, origin: Number, destination: Number) => void | boolean |
Special events
Event | description |
---|---|
onevent |
General method to handler any event. The number of arguments depends on each event.onevent(eventName: String, worksheet: Object, a?: any, b?: any, c?: any, d?: any, e?: any, f?: any) => any |
contextmenu |
Return false to cancel the contextMenu event, or return custom elements for the contextmenu.contextMenu(worksheet: Object, x: Number, y: Number, e: Object, items: [], section: String, a1: Any, a2: Any) => [] |
The global event handler
The onevent
is a global and centralized method that handles all events. It's essential to note that the number of arguments required will depend on the specific event that has been triggered. NOTE: You can see events in the browser console.
<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>
<script>
// Set your JSS license key (The following key only works for one day)
jspreadsheet.setLicense('NzA0ZTYwOWQ5OTdmYmE1ZDM0ZDExYzYyYjAzODM1ZDNhMmUyOGZmOTk3MmJlNzIwZjIwYjBhOTdlYjZlODE1NTM3NGY4NTQyZDk3YWE0ZjA3ZjJhYzE5NGMzNjQ3OTcyOGZlNDc4NTc0ZDhkYjRkYmEwM2JhOTNmZGU3NTNhZGUsZXlKamJHbGxiblJKWkNJNklpSXNJbTVoYldVaU9pSktjM0J5WldGa2MyaGxaWFFpTENKa1lYUmxJam94TnpVNU56azJNamt4TENKa2IyMWhhVzRpT2xzaWFuTndjbVZoWkhOb1pXVjBMbU52YlNJc0ltTnZaR1Z6WVc1a1ltOTRMbWx2SWl3aWFuTm9aV3hzTG01bGRDSXNJbU56WWk1aGNIQWlMQ0p6ZEdGamEySnNhWFI2TG1sdklpd2lkMlZpWTI5dWRHRnBibVZ5TG1sdklpd2lkMlZpSWl3aWJHOWpZV3hvYjNOMElsMHNJbkJzWVc0aU9pSXpOQ0lzSW5OamIzQmxJanBiSW5ZM0lpd2lkamdpTENKMk9TSXNJbll4TUNJc0luWXhNU0lzSW1Ob1lYSjBjeUlzSW1admNtMXpJaXdpWm05eWJYVnNZU0lzSW5CaGNuTmxjaUlzSW5KbGJtUmxjaUlzSW1OdmJXMWxiblJ6SWl3aWFXMXdiM0owWlhJaUxDSmlZWElpTENKMllXeHBaR0YwYVc5dWN5SXNJbk5sWVhKamFDSXNJbkJ5YVc1MElpd2ljMmhsWlhSeklpd2lZMnhwWlc1MElpd2ljMlZ5ZG1WeUlpd2ljMmhoY0dWeklpd2labTl5YldGMElsMHNJbVJsYlc4aU9uUnlkV1Y5');
// Create a new spreadsheet
jspreadsheet(document.getElementById('spreadsheet'), {
worksheets: [{
data: [
['Mazda', 2001, 2000],
['Peugeot', 2010, 5000],
['Honda Fit', 2009, 3000],
['Honda CRV', 2010, 6000],
],
columns:[
{ title:'Model', width:'300px' },
{ title:'Year', width:'80px' },
{ title:'Price', width:'100px' },
],
}],
onevent: function(eventName,worksheet,a,b,c,d,e,f) {
console.log(eventName,worksheet,a,b,c,d,e,f);
}
});
</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('NzA0ZTYwOWQ5OTdmYmE1ZDM0ZDExYzYyYjAzODM1ZDNhMmUyOGZmOTk3MmJlNzIwZjIwYjBhOTdlYjZlODE1NTM3NGY4NTQyZDk3YWE0ZjA3ZjJhYzE5NGMzNjQ3OTcyOGZlNDc4NTc0ZDhkYjRkYmEwM2JhOTNmZGU3NTNhZGUsZXlKamJHbGxiblJKWkNJNklpSXNJbTVoYldVaU9pSktjM0J5WldGa2MyaGxaWFFpTENKa1lYUmxJam94TnpVNU56azJNamt4TENKa2IyMWhhVzRpT2xzaWFuTndjbVZoWkhOb1pXVjBMbU52YlNJc0ltTnZaR1Z6WVc1a1ltOTRMbWx2SWl3aWFuTm9aV3hzTG01bGRDSXNJbU56WWk1aGNIQWlMQ0p6ZEdGamEySnNhWFI2TG1sdklpd2lkMlZpWTI5dWRHRnBibVZ5TG1sdklpd2lkMlZpSWl3aWJHOWpZV3hvYjNOMElsMHNJbkJzWVc0aU9pSXpOQ0lzSW5OamIzQmxJanBiSW5ZM0lpd2lkamdpTENKMk9TSXNJbll4TUNJc0luWXhNU0lzSW1Ob1lYSjBjeUlzSW1admNtMXpJaXdpWm05eWJYVnNZU0lzSW5CaGNuTmxjaUlzSW5KbGJtUmxjaUlzSW1OdmJXMWxiblJ6SWl3aWFXMXdiM0owWlhJaUxDSmlZWElpTENKMllXeHBaR0YwYVc5dWN5SXNJbk5sWVhKamFDSXNJbkJ5YVc1MElpd2ljMmhsWlhSeklpd2lZMnhwWlc1MElpd2ljMlZ5ZG1WeUlpd2ljMmhoY0dWeklpd2labTl5YldGMElsMHNJbVJsYlc4aU9uUnlkV1Y5');
export default function App() {
// Spreadsheet array of worksheets
const spreadsheet = useRef();
// Data
const data = [
['Mazda', 2001, 2000],
['Peugeot', 2010, 5000],
['Honda Fit', 2009, 3000],
['Honda CRV', 2010, 6000],
];
const columns = [
{title: 'Model', width: '300px'},
{title: 'Year', width: '80px'},
{title: 'Price', width: '100px'},
];
// Event handler
const onevent = (eventName, worksheet, a, b, c, d, e, f) => {
console.log(eventName, worksheet, a, b, c, d, e, f);
};
// Render data grid component
return (
<Spreadsheet ref={spreadsheet} onevent={onevent}>
<Worksheet data={data} columns={columns}/>
</Spreadsheet>
);
}
<template>
<Spreadsheet ref="spreadsheet" :onevent="onevent">
<Worksheet :data="data" :columns="columns" />
</Spreadsheet>
</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('NzA0ZTYwOWQ5OTdmYmE1ZDM0ZDExYzYyYjAzODM1ZDNhMmUyOGZmOTk3MmJlNzIwZjIwYjBhOTdlYjZlODE1NTM3NGY4NTQyZDk3YWE0ZjA3ZjJhYzE5NGMzNjQ3OTcyOGZlNDc4NTc0ZDhkYjRkYmEwM2JhOTNmZGU3NTNhZGUsZXlKamJHbGxiblJKWkNJNklpSXNJbTVoYldVaU9pSktjM0J5WldGa2MyaGxaWFFpTENKa1lYUmxJam94TnpVNU56azJNamt4TENKa2IyMWhhVzRpT2xzaWFuTndjbVZoWkhOb1pXVjBMbU52YlNJc0ltTnZaR1Z6WVc1a1ltOTRMbWx2SWl3aWFuTm9aV3hzTG01bGRDSXNJbU56WWk1aGNIQWlMQ0p6ZEdGamEySnNhWFI2TG1sdklpd2lkMlZpWTI5dWRHRnBibVZ5TG1sdklpd2lkMlZpSWl3aWJHOWpZV3hvYjNOMElsMHNJbkJzWVc0aU9pSXpOQ0lzSW5OamIzQmxJanBiSW5ZM0lpd2lkamdpTENKMk9TSXNJbll4TUNJc0luWXhNU0lzSW1Ob1lYSjBjeUlzSW1admNtMXpJaXdpWm05eWJYVnNZU0lzSW5CaGNuTmxjaUlzSW5KbGJtUmxjaUlzSW1OdmJXMWxiblJ6SWl3aWFXMXdiM0owWlhJaUxDSmlZWElpTENKMllXeHBaR0YwYVc5dWN5SXNJbk5sWVhKamFDSXNJbkJ5YVc1MElpd2ljMmhsWlhSeklpd2lZMnhwWlc1MElpd2ljMlZ5ZG1WeUlpd2ljMmhoY0dWeklpd2labTl5YldGMElsMHNJbVJsYlc4aU9uUnlkV1Y5');
export default {
components: {
Spreadsheet,
Worksheet,
},
methods: {
// Event handler
onevent (eventName,worksheet,a,b,c,d,e,f) {
console.log(eventName,worksheet,a,b,c,d,e,f);
},
},
data() {
// Data
const data = [
['Mazda', 2001, 2000],
['Peugeot', 2010, 5000],
['Honda Fit', 2009, 3000],
['Honda CRV', 2010, 6000],
];
const columns = [
{ title:'Model', width:'300px' },
{ title:'Year', width:'80px' },
{ title:'Price', width:'100px' },
];
return {
data,
columns
};
}
}
</script>
import { Component, ViewChild, ElementRef, AfterViewInit } from "@angular/core";
import jspreadsheet from "jspreadsheet";
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('NzA0ZTYwOWQ5OTdmYmE1ZDM0ZDExYzYyYjAzODM1ZDNhMmUyOGZmOTk3MmJlNzIwZjIwYjBhOTdlYjZlODE1NTM3NGY4NTQyZDk3YWE0ZjA3ZjJhYzE5NGMzNjQ3OTcyOGZlNDc4NTc0ZDhkYjRkYmEwM2JhOTNmZGU3NTNhZGUsZXlKamJHbGxiblJKWkNJNklpSXNJbTVoYldVaU9pSktjM0J5WldGa2MyaGxaWFFpTENKa1lYUmxJam94TnpVNU56azJNamt4TENKa2IyMWhhVzRpT2xzaWFuTndjbVZoWkhOb1pXVjBMbU52YlNJc0ltTnZaR1Z6WVc1a1ltOTRMbWx2SWl3aWFuTm9aV3hzTG01bGRDSXNJbU56WWk1aGNIQWlMQ0p6ZEdGamEySnNhWFI2TG1sdklpd2lkMlZpWTI5dWRHRnBibVZ5TG1sdklpd2lkMlZpSWl3aWJHOWpZV3hvYjNOMElsMHNJbkJzWVc0aU9pSXpOQ0lzSW5OamIzQmxJanBiSW5ZM0lpd2lkamdpTENKMk9TSXNJbll4TUNJc0luWXhNU0lzSW1Ob1lYSjBjeUlzSW1admNtMXpJaXdpWm05eWJYVnNZU0lzSW5CaGNuTmxjaUlzSW5KbGJtUmxjaUlzSW1OdmJXMWxiblJ6SWl3aWFXMXdiM0owWlhJaUxDSmlZWElpTENKMllXeHBaR0YwYVc5dWN5SXNJbk5sWVhKamFDSXNJbkJ5YVc1MElpd2ljMmhsWlhSeklpd2lZMnhwWlc1MElpd2ljMlZ5ZG1WeUlpd2ljMmhoY0dWeklpd2labTl5YldGMElsMHNJbVJsYlc4aU9uUnlkV1Y5');
@Component({
standalone: true,
selector: "app-root",
template: `<div #spreadsheet></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, {
worksheets: [{
data: [
['Mazda', 2001, 2000],
['Peugeot', 2010, 5000],
['Honda Fit', 2009, 3000],
['Honda CRV', 2010, 6000],
],
columns:[
{ title:'Model' },
{ title:'Year' },
{ title:'Price' },
],
}],
onevent: function(eventName,worksheet,a,b,c,d,e,f) {
console.log(eventName,worksheet,a,b,c,d,e,f);
}
});
}
}
Plugin-based Event Handling
For complex applications with multiple event handlers, plugins provide a modular approach to event management, enabling code reuse and better maintainability across multiple spreadsheet instances.
const myEventPlugin = {
onevent: function(eventName, worksheet, ...args) {
// Custom event handling logic here
if (eventName === 'onchange') {
// Handle cell changes
} else if (eventName === 'onclick') {
// Handle clicks
}
}
};
// Apply plugin to spreadsheet
jspreadsheet(element, {
plugins: { myEventPlugin },
// other options...
});