Table With Conditional Formats and Data Validation

Spread supports automatically adding any existing conditional formatting and data validation rules to newly added table rows or columns.

If the existing table has conditional formatting and/or data validation rules and the newly added table row or column intersects or is adjacent to the range of the conditional formatting/data validation, the rules will automatically be applied to the newly added data when one the following actions are done: table insert rows table insert columns table auto expand table resize
import * as React from 'react'; import { createRoot } from 'react-dom/client'; import './styles.css'; import { AppFunc } from './app-func'; // import { App } from './app-class'; // 1. Functional Component sample createRoot(document.getElementById('app')).render(<AppFunc />); // 2. Class Component sample // createRoot(document.getElementById('app')).render(<App />);
import * as React from 'react'; import GC from '@mescius/spread-sheets'; import { SpreadSheets } from '@mescius/spread-sheets-react'; export function AppFunc() { const initSpread = (spread) => { spread.suspendPaint(); let sheet1 = spread.getActiveSheet(); let spreadNS = GC.Spread.Sheets; var table = sheet1.tables.add("Table1", 2, 1, 9, 5, spreadNS.Tables.TableThemes["medium4"]); for (var i = 1; i <= 8; i++) { sheet1.getCell(2 + i, 1).value(i + 1); sheet1.getCell(2 + i, 2).value(i + 2); sheet1.getCell(2 + i, 3).value(i + 3); sheet1.getCell(2 + i, 4).value(i + 4); sheet1.getCell(2 + i, 5).value(i + 5); } sheet1.setColumnWidth(1, 100); sheet1.setColumnWidth(2, 100); sheet1.setColumnWidth(3, 100); sheet1.setColumnWidth(4, 100); sheet1.setColumnWidth(5, 100); var cfs = sheet1.conditionalFormats; var style = new spreadNS.Style(); style.backColor = '#F4F8EB'; style.foreColor = '#82bc00'; //apply style for numbers greater than 8 var cvRule = cfs.addCellValueRule( spreadNS.ConditionalFormatting.ComparisonOperators.greaterThan, 8, 0, style, [new GC.Spread.Sheets.Range(3, 5, 8, 1)]); spread.options.highlightInvalidData = true; //Numbers between 4,6 are invalid sheet1.getRange(3, 1, 8, 5).validator(spreadNS.DataValidation.createNumberValidator(spreadNS.ConditionalFormatting.ComparisonOperators.notBetween, 4, 6, false)); spread.resumePaint(); } return ( <div class="sample-tutorial"> <div class="sample-spreadsheets"> <SpreadSheets workbookInitialized={spread => initSpread(spread)}> </SpreadSheets> </div> <div class="options-container"> <div class="option-row"> <label>Table's columns B:F have data validation rules. Column F also has conditional formatting rules. </label> <br /> <br /> <label>Click in cell F11 (value ‘13’) and press the Tab key. A new row will be added. </label> <br /> <br /> <label><b>You can follow the rules in the above rows to see this in action. </b></label> <br /> <br /> <label>For example, in B12, type ‘5’. This is not a valid value so it will be highlighted. </label> <br /> <br /> <label>Type ‘10’ in F12 to highlight is using the conditional formatting rules.</label> </div> </div> </div> ); }
import * as React from 'react'; import GC from '@mescius/spread-sheets'; import { SpreadSheets } from '@mescius/spread-sheets-react'; const Component = React.Component; export class App extends Component { constructor(props) { super(props); } render() { return ( <div class="sample-tutorial"> <div class="sample-spreadsheets"> <SpreadSheets workbookInitialized={spread => this.initSpread(spread)}> </SpreadSheets> </div> <div class="options-container"> <div class="option-row"> <label>Table's columns B:F have data validation rules. Column F also has conditional formatting rules. </label> <br /> <br /> <label>Click in cell F11 (value ‘13’) and press the Tab key. A new row will be added. </label> <br /> <br /> <label><b>You can follow the rules in the above rows to see this in action. </b></label> <br /> <br /> <label>For example, in B12, type ‘5’. This is not a valid value so it will be highlighted. </label> <br /> <br /> <label>Type ‘10’ in F12 to highlight is using the conditional formatting rules.</label> </div> </div> </div> ); } initSpread(spread) { this.spread = spread; spread.suspendPaint(); let sheet1 = spread.getActiveSheet(); let spreadNS = GC.Spread.Sheets; var table = sheet1.tables.add("Table1", 2, 1, 9, 5, spreadNS.Tables.TableThemes["medium4"]); for (var i = 1; i <= 8; i++) { sheet1.getCell(2 + i, 1).value(i + 1); sheet1.getCell(2 + i, 2).value(i + 2); sheet1.getCell(2 + i, 3).value(i + 3); sheet1.getCell(2 + i, 4).value(i + 4); sheet1.getCell(2 + i, 5).value(i + 5); } sheet1.setColumnWidth(1, 100); sheet1.setColumnWidth(2, 100); sheet1.setColumnWidth(3, 100); sheet1.setColumnWidth(4, 100); sheet1.setColumnWidth(5, 100); var cfs = sheet1.conditionalFormats; var style = new spreadNS.Style(); style.backColor = '#F4F8EB'; style.foreColor = '#82bc00'; //apply style for numbers greater than 8 var cvRule = cfs.addCellValueRule( spreadNS.ConditionalFormatting.ComparisonOperators.greaterThan, 8, 0, style, [new GC.Spread.Sheets.Range(3, 5, 8, 1)]); spread.options.highlightInvalidData = true; //Numbers between 4,6 are invalid sheet1.getRange(3, 1, 8, 5).validator(spreadNS.DataValidation.createNumberValidator(spreadNS.ConditionalFormatting.ComparisonOperators.notBetween, 4, 6, false)); spread.resumePaint(); } }
<!doctype html> <html style="height:100%;font-size:14px;"> <head> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <link rel="stylesheet" type="text/css" href="$DEMOROOT$/en/react/node_modules/@mescius/spread-sheets/styles/gc.spread.sheets.excel2013white.css"> <!-- SystemJS --> <script src="$DEMOROOT$/en/react/node_modules/systemjs/dist/system.src.js"></script> <script src="systemjs.config.js"></script> <script> System.import('$DEMOROOT$/en/lib/react/license.js').then(function () { System.import('./src/app'); }); </script> </head> <body> <div id="app"> </div> </body> </html>
.sample-tutorial { position: relative; height: 100%; overflow: hidden; } .sample-spreadsheets { width: calc(100% - 280px); height: 100%; overflow: hidden; float: left; } .options-container { float: right; width: 280px; padding: 12px; height: 100%; box-sizing: border-box; background: #fbfbfb; overflow: auto; } .option-row { font-size: 14px; padding: 5px; margin-top: 10px; } body { position: absolute; top: 0; bottom: 0; left: 0; right: 0; } #app { height: 100%; }
(function (global) { System.config({ transpiler: 'plugin-babel', babelOptions: { es2015: true, react: true }, meta: { '*.css': { loader: 'css' } }, paths: { // paths serve as alias 'npm:': 'node_modules/' }, // map tells the System loader where to look for things map: { '@mescius/spread-sheets': 'npm:@mescius/spread-sheets/index.js', '@mescius/spread-sheets-react': 'npm:@mescius/spread-sheets-react/index.js', '@grapecity/jsob-test-dependency-package/react-components': 'npm:@grapecity/jsob-test-dependency-package/react-components/index.js', 'react': 'npm:react/cjs/react.production.js', 'react-dom': 'npm:react-dom/cjs/react-dom.production.js', 'react-dom/client': 'npm:react-dom/cjs/react-dom-client.production.js', 'scheduler': 'npm:scheduler/cjs/scheduler.production.js', 'css': 'npm:systemjs-plugin-css/css.js', 'plugin-babel': 'npm:systemjs-plugin-babel/plugin-babel.js', 'systemjs-babel-build':'npm:systemjs-plugin-babel/systemjs-babel-browser.js' }, // packages tells the System loader how to load when no filename and/or no extension packages: { src: { defaultExtension: 'jsx' }, "node_modules": { defaultExtension: 'js' }, } }); })(this);