Cell Edit Overview

SpreadJS supports setting the editable status of cells. The allowEditInCell property of Style controls whether users can enter edit mode for editing cells. The tabStop property of Style controls whether the tab can stop on cells.

You can set allow/disallow edit in cell using the allowEditIncell proprity of Style. The following code will disable enter edit mode in a cell for editing. The following code will disable enter edit mode in a cell range for editing. The following code will disable tab stop on cell. The following code will disable tab stop on cell range.
import * as React from 'react'; import { createRoot } from 'react-dom/client'; import './styles.css'; import { AppFunc } from './app-func'; createRoot(document.getElementById('app')).render(<AppFunc />);
import * as React from 'react'; import GC from '@mescius/spread-sheets'; import { SpreadSheets } from '@mescius/spread-sheets-react'; let spread = null; const spreadNS = GC.Spread.Sheets; export function AppFunc() { const [allowEditInCell, setAllowEditInCell] = React.useState(true); const [tabStop, setTabStop] = React.useState(true); const initSpread = (workBook) => { spread = workBook; spread.setSheetCount(1); let sheet = spread.getSheet(0); initSheet(sheet, false); } const initSheet = (sheet, multiSelect) => { sheet.suspendPaint(); sheet.setColumnWidth(1, 120); sheet.setColumnWidth(2, 200); sheet.setColumnWidth(4, 120); sheet.setColumnWidth(5, 300); sheet.setValue(1, 1, "Cell Types:"); sheet.getCell(1, 1).fontWeight("bold"); // -------------------- checkbox --------------------- sheet.setValue(2, 1, "Checkbox"); sheet.getCell(2, 1).vAlign(GC.Spread.Sheets.VerticalAlign.center).foreColor("green"); var captionCellType = new GC.Spread.Sheets.CellTypes.CheckBox(); captionCellType.caption("Checkbox"); sheet.setCellType(2, 2, captionCellType); sheet.getCell(2, 2).vAlign(GC.Spread.Sheets.VerticalAlign.center); // -------------------- checkbox list --------------------- sheet.setValue(2, 4, "Checkbox List"); sheet.getCell(2, 4).vAlign(GC.Spread.Sheets.VerticalAlign.center).foreColor("green"); var checkBoxList = new GC.Spread.Sheets.CellTypes.CheckBoxList(); checkBoxList.items([ { text: "Checkbox1", value: "0" }, { text: "Checkbox2", value: "1" }, { text: "Checkbox3", value: "2" }, ]); sheet.setCellType(2, 5, checkBoxList); // -------------------- combox cell type --------------------- var combo = new spreadNS.CellTypes.ComboBox(); combo.items([{ text: "Oranges", value: "11k" }, { text: "Apples", value: "15k" }, { text: "Grape", value: "100k" }]) .editorValueType(spreadNS.CellTypes.EditorValueType.text); sheet.getCell(4, 2, spreadNS.SheetArea.viewport).cellType(combo).value("Apples"); sheet.getCell(4, 2).vAlign(GC.Spread.Sheets.VerticalAlign.center); sheet.setValue(4, 1, "ComboBox"); sheet.getCell(4, 1).vAlign(GC.Spread.Sheets.VerticalAlign.center).foreColor("green"); // -------------------- radio cell type --------------------- var radio = new GC.Spread.Sheets.CellTypes.RadioButtonList(); radio.items([ { text: "Radio1", value: "0" }, { text: "Radio2", value: "1" }, { text: "Radio3", value: "2" }, ]); sheet.setCellType(4, 5, radio); sheet.getCell(4, 5).vAlign(GC.Spread.Sheets.VerticalAlign.center); sheet.setValue(4, 4, "Radio"); sheet.getCell(4, 4).vAlign(GC.Spread.Sheets.VerticalAlign.center).foreColor("green"); // -------------------- HyperLink cell type --------------------- var h1 = new spreadNS.CellTypes.HyperLink(); h1.text("SpreadJS Overview"); sheet.setCellType(6, 2, h1, spreadNS.SheetArea.viewport); sheet.getCell(6, 2, spreadNS.SheetArea.viewport).value("http://developer.mescius.com/en/spreadjs/").vAlign(spreadNS.HorizontalAlign.center); sheet.setValue(6, 1, "Hyperlink:"); sheet.getCell(6, 1).vAlign(GC.Spread.Sheets.VerticalAlign.center).foreColor("green"); sheet.setValue(9, 1, "Cell Dropdowns:"); sheet.getCell(9, 1).fontWeight("bold"); // -------------------- Vertical text list --------------------- var verticalStyle = new GC.Spread.Sheets.Style(); verticalStyle.cellButtons = [ { imageType: GC.Spread.Sheets.ButtonImageType.dropdown, command: "openList", useButtonStyle: true, } ]; verticalStyle.dropDowns = [ { type: GC.Spread.Sheets.DropDownType.list, option: { multiSelect: multiSelect, items: [ { text: 'item1', value: 'item1' }, { text: 'item2', value: 'item2' }, { text: 'item3', value: 'item3' }, { text: 'item4', value: 'item4' } ], } } ]; sheet.setText(10, 1, "Dropdown List"); sheet.getCell(10, 1).vAlign(GC.Spread.Sheets.VerticalAlign.center).foreColor("green"); sheet.setStyle(10, 2, verticalStyle); sheet.getCell(10, 2).vAlign(GC.Spread.Sheets.VerticalAlign.center); // -------------------------- time picker ----------------------- sheet.setText(10, 4, "Time Picker"); sheet.getCell(10, 4).vAlign(GC.Spread.Sheets.VerticalAlign.center).foreColor("green"); function createPickerStyle(option) { var timePickerStyle = new GC.Spread.Sheets.Style(); timePickerStyle.cellButtons = [ { imageType: GC.Spread.Sheets.ButtonImageType.dropdown, command: "openTimePicker", useButtonStyle: true, } ]; timePickerStyle.dropDowns = [ { type: GC.Spread.Sheets.DropDownType.timePicker, option: option } ]; return timePickerStyle; } sheet.setStyle(10, 5, createPickerStyle({ min: { hour: 8 }, max: { hour: 19 }, step: { minute: 30 }, formatString: "h:mm AM/PM", })); sheet.getCell(10, 5).vAlign(GC.Spread.Sheets.VerticalAlign.center); // -------------------- Month Picker --------------------- var monthPickerStyle = new GC.Spread.Sheets.Style(); monthPickerStyle.cellButtons = [ { imageType: GC.Spread.Sheets.ButtonImageType.dropdown, command: "openMonthPicker", useButtonStyle: true, } ]; monthPickerStyle.dropDowns = [ { type: GC.Spread.Sheets.DropDownType.monthPicker, option: { startYear: 2009, stopYear: 2019, height: 300, } } ]; sheet.setText(12, 1, "Month Picker"); sheet.getCell(12, 1).vAlign(GC.Spread.Sheets.VerticalAlign.center).foreColor("green"); sheet.setStyle(12, 2, monthPickerStyle); sheet.getCell(12, 2).vAlign(GC.Spread.Sheets.VerticalAlign.center); // -------------------- Date Time Picker --------------------- var showTimeStyle = new GC.Spread.Sheets.Style(); showTimeStyle.cellButtons = [ { imageType: GC.Spread.Sheets.ButtonImageType.dropdown, command: "openDateTimePicker", useButtonStyle: true, } ]; showTimeStyle.dropDowns = [ { type: GC.Spread.Sheets.DropDownType.dateTimePicker, option: { showTime: true } } ]; sheet.setText(12, 4, "Date Time Picker"); sheet.getCell(12, 4).vAlign(GC.Spread.Sheets.VerticalAlign.center).foreColor("green"); sheet.setStyle(12, 5, showTimeStyle); sheet.getCell(12, 5).vAlign(GC.Spread.Sheets.VerticalAlign.center); // --------------------------- Slider --------------------------- function createSliderStyle(option) { let sliderStyle = new GC.Spread.Sheets.Style(); sliderStyle.cellButtons = [{ imageType: GC.Spread.Sheets.ButtonImageType.dropdown, command: "openSlider", useButtonStyle: true }]; sliderStyle.dropDowns = [{ type: GC.Spread.Sheets.DropDownType.slider, option: option }]; return sliderStyle } sheet.setText(14, 1, "Slider"); sheet.getCell(14, 1).vAlign(GC.Spread.Sheets.VerticalAlign.center).foreColor("green"); sheet.setStyle(14, 2, createSliderStyle({ max: 45, min: 32, marks: ["36"], step: 1, direction: GC.Spread.Sheets.LayoutDirection.vertical, formatString: "0°C" })); sheet.getCell(14, 2).vAlign(GC.Spread.Sheets.VerticalAlign.center); // --------------------------- Calculator --------------------------- var calculatorStyle = new GC.Spread.Sheets.Style(); calculatorStyle.cellButtons = [ { imageType: GC.Spread.Sheets.ButtonImageType.dropdown, command: "openCalculator", useButtonStyle: true, } ]; sheet.setText(14, 4, "Calculator"); sheet.getCell(14, 4).vAlign(GC.Spread.Sheets.VerticalAlign.center).foreColor("green"); sheet.setStyle(14, 5, calculatorStyle); sheet.getCell(14, 5).vAlign(GC.Spread.Sheets.VerticalAlign.center); // --------------------------- Color Picker --------------------------- var colorStyle = new GC.Spread.Sheets.Style(); colorStyle.cellButtons = [ { imageType: GC.Spread.Sheets.ButtonImageType.dropdown, command: "openColorPicker", useButtonStyle: true, } ]; sheet.setText(16, 1, "Color Picker"); sheet.getCell(16, 1).vAlign(GC.Spread.Sheets.VerticalAlign.center).foreColor("green"); sheet.setStyle(16, 2, colorStyle); sheet.getCell(16, 2).vAlign(GC.Spread.Sheets.VerticalAlign.center); // -------------------- WorkFlow --------------------- let workFlowstyle = new GC.Spread.Sheets.Style(); workFlowstyle.cellButtons = [ { imageType: GC.Spread.Sheets.ButtonImageType.dropdown, command: "openWorkflowList", useButtonStyle: true, } ]; workFlowstyle.dropDowns = [ { type: GC.Spread.Sheets.DropDownType.workflowList, option: { items: [ { value: "New", transitions: [1] }, { value: "Open",transitions: [0,2,3,5] }, { value: "In Progress", transitions: [1, 3, 5] }, { value: "Resolved", transitions: [5, 4] }, { value: "Reopened",transitions: [5, 3, 2] }, { value: "Closed", transitions: [4] }, ] } } ]; sheet.setText(16, 4, "Workflow List"); sheet.getCell(16, 4).vAlign(GC.Spread.Sheets.VerticalAlign.center).foreColor("green"); sheet.setStyle(16, 5, workFlowstyle); sheet.getCell(16, 5).vAlign(GC.Spread.Sheets.VerticalAlign.center); // -------------------------------------------------------------- sheet.bind(GC.Spread.Sheets.Events.SelectionChanged, onSelectionChanged); sheet.resumePaint(); } const checkAllowEditInCell = (e) => { setAllowEditInCell(e.target.checked); } const checkTabStop = (e) => { setTabStop(e.target.checked); } const setStyle = () => { const sheet = spread.getActiveSheet(); const range = sheet.getSelections()[0]; const cellRange = sheet.getRange(range.row, range.col, range.rowCount, range.colCount); cellRange.allowEditInCell(allowEditInCell); } const btnSetTabStop = () => { const sheet = spread.getActiveSheet(); const range = sheet.getSelections()[0]; const cellRange = sheet.getRange(range.row, range.col, range.rowCount, range.colCount); cellRange.tabStop(tabStop); } const onSelectionChanged = (eventName, args) => { const sheet = spread.getActiveSheet(); const range = args.newSelections[0]; const cellRange = sheet.getRange(range.row, range.col, range.rowCount, range.colCount); const allowEditInCell = cellRange.allowEditInCell() !== false; setAllowEditInCell(allowEditInCell); setTabStop(cellRange.tabStop() !== false); } return ( <div class="sample-tutorial"> <div class="sample-spreadsheets"> <SpreadSheets workbookInitialized={initSpread}></SpreadSheets> </div> <Panel allowEditInCell={allowEditInCell} checkAllowEditInCell={checkAllowEditInCell} setStyle={setStyle} tabStop={tabStop} checkTabStop={checkTabStop} setTabStop={btnSetTabStop} /> </div> ); } function Panel(props) { return ( <div class="options-container"> <p>Uncheck the option below to disable entering edit mode to edit cell.</p> <div class="settings-row"> <label> <input id="allowEditInCell" type="checkbox" checked={props.allowEditInCell} onChange={props.checkAllowEditInCell} /> Allow Edit In Cell </label> </div> <div class="settings-row settings-button"> <button id="set-style" class="settings-btn" onClick={props.setStyle}>Set Allow Edit in Cell</button> </div> <p>Uncheck the option below to disable tab stop on cell.</p> <div class="settings-row"> <label> <input id="tab-stop" type="checkbox" checked={props.tabStop} onChange={props.checkTabStop} /> Tab Stop </label> </div> <div class="settings-row settings-button"> <button id="set-tab-stop" class="settings-btn" onClick={props.setTabStop}>Set Tab Stop</button> </div> </div> ); }
<!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>
#app { height: 100%; } body { position: absolute; top: 0; bottom: 0; left: 0; right: 0; } .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; } .settings-row { width: 100%; height: 30px; font-size: 13px; } .settings-button { margin-top: 15px; } label { margin-bottom: 6px; } input { padding: 4px 6px; } .settings-btn { display: inline-block; width: 220px; height: 21px; }
(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);