Creating a format painter button in pure JavaScript
Background:
To create a format painter button, add an event listener to indicate when to copy the formatting of a selected area, and indicate the new are to paste the formatting too. Then bind the selection changed event to the active sheet to invoke copyToOptions for the style and span to copy the formatting.
Steps to Complete:
-
Create a format painter button
-
Add an event listener to the format painter button
-
Create a resetFormatPainting() function
-
Bind the active sheets to the SelectionChanged event
Getting Started:
Step 1: Create a format painter button
Add an HTML element button
// Format painter button <div> <button id="btnFormat">Format Painter</button> </div> // SpreadJS's targeted DOM element <div id="ss" style="width: 100%; height: 400px; border: 1px solid gray;"></div>
Step 2: Add an event listener to the format painter button
Create two variables, fromRange, and isFormatpainint = False.
Add an event listener to the format painter button to get the sheets selection.
Store the selection in a data array and store the data array in the variable fromRange.
Then have the isFormatPainting variable change to True to indicate that when the button is clicked, formatting is occurring.
Finally, change the text content of the Format Painter button to read ‘Formatting’.
// define fromRange var fromRange; // define isFormatPainting and set it to False var isFormatPainting = false; document.getElementById("btnFormat").addEventListener("click", function () { var sheet = spread.getActiveSheet(); // Get the selection from the current sheet var selectionRange = sheet.getSelections(); if (selectionRange.length > 1) { alert("Could not apply to multi selection ranges"); return; } if (isFormatPainting) { resetFormatPainting(sheet); return; } fromRange = selectionRange[0]; // set isFormatPainting variable to True to indicate that when the button is clicked for formatting is occuring isFormatPainting = true; // Change buttons text to "Formatting" this.textContent = "Formatting"; });
Step 3: Create a resetFormatPainting() function
Create a function called resetFormatPainting() that will set the variable isFormatPainting to False and change the text content of the Format Painter button to read “Format Painting”
function resetFormatPainting(sheet) { isFormatPainting = false; document.getElementById("btnFormat").textContent = "Format Painting"; }
Step 4: Bind the active sheets to the SelectionChanged event
Bind the active sheet to the SelectionChanged event that with determine the selected area and the area the formatting will be copied too. This utilizes SpreadJS’s copyToOptions to specify to copy the span and style.
activeSheet.bind(GC.Spread.Sheets.Events.SelectionChanged, function ( e, info ) { // if isformatting is true, if (isFormatPainting) { var sheet = spread.getActiveSheet(); // invoke resetFormatPainting() function resetFormatPainting(sheet); spread.suspendPaint(); // get the selections in the sheet and store in an array var toRange = sheet.getSelections()[0]; //toRange biger than fromRange if (fromRange.rowCount > toRange.rowCount) { toRange.rowCount = fromRange.rowCount; } if (fromRange.colCount > toRange.colCount) { toRange.colCount = fromRange.colCount; } //toRange must in Sheet if (toRange.row + toRange.rowCount > sheet.getRowCount()) { toRange.rowCount = sheet.getRowCount() - toRange.row; } if (toRange.col + toRange.colCount > sheet.getColumnCount()) { toRange.colCount = sheet.getColumnCount() - toRange.col; } var rowStep = fromRange.rowCount, colStep = fromRange.colCount; var endRow = toRange.row + toRange.rowCount - 1, endCol = toRange.col + toRange.colCount - 1; // if toRange bigger than fromRange, repeat paint for ( var startRow = toRange.row; startRow <= endRow; startRow = startRow + rowStep ) { for ( var startCol = toRange.col; startCol <= endCol; startCol = startCol + colStep ) { var rowCount = startRow + rowStep > endRow + 1 ? endRow - startRow + 1 : rowStep; var colCount = startCol + colStep > endCol + 1 ? endCol - startCol + 1 : colStep; sheet.copyTo( fromRange.row, fromRange.col, startRow, startCol, rowCount, colCount, GC.Spread.Sheets.CopyToOptions.style | GC.Spread.Sheets.CopyToOptions.span ); } } spread.resumePaint(); } }
After following these steps you are now able to use the Format Painter button to copy the format of a selected area to a new space in the SpreadJS instance.