Range Select

Sometimes, you may need to allow end-users to enter ranges (e.g. “Sheet1!$A$5:$C$10”) by selecting the ranges on the spreadsheet instead of manually typing them. The result or returned value of this feature would be the text representing the address of one or more ranges in a textbox (example of two ranges: “Sheet1!A1:B5,Sheet2!G11”).

Description
app.component.ts
index.html
app.component.html
styles.css
Copy to CodeMine

If you want to use range select mode, you just need to create a formulaTextBox that has this option {rangeSelectMode: true}. For example:

    var rangeSelect = createElement("div");
    var fbx = new GC.Spread.Sheets.FormulaTextBox.FormulaTextBox(rangeSelect, {rangeSelectMode: true});

You can use the workbook method of FormulaTextBox to attach this formulaTextBox to a spread. For example:

    var workbook = new GC.Spread.Sheets.workbook(document.getElementById('ss'))
    fbx.workbook(workbook);

If fbx1.workbook() doesn't have arguments, range select does not work.

You can use the text method of FormulaTextBox to get the text of the formula text box.

    var str = fbx.text();

You can use the destroy method to remove the formula text box elements.

    fbx.destroy();
If you want to use range select mode, you just need to create a formulaTextBox that has this option {rangeSelectMode: true}. For example: You can use the workbook method of FormulaTextBox to attach this formulaTextBox to a spread. For example: If fbx1.workbook() doesn't have arguments, range select does not work. You can use the text method of FormulaTextBox to get the text of the formula text box. You can use the destroy method to remove the formula text box elements.
import { Component, NgModule, enableProdMode } from '@angular/core'; import { BrowserModule } from '@angular/platform-browser'; import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; import { SpreadSheetsModule } from '@mescius/spread-sheets-angular'; import GC from '@mescius/spread-sheets'; import './styles.css'; @Component({ selector: 'app-component', templateUrl: 'src/app.component.html' }) export class AppComponent { spread: GC.Spread.Sheets.Workbook; fbx: GC.Spread.Sheets.FormulaTextBox.FormulaTextBox; hostStyle = { width: 'calc(100% - 280px)', height: '100%', overflow: 'hidden', float: 'left' }; constructor() { } initSpread($event: any) { this.spread = $event.spread; let spread = this.spread; let sheet = spread.getActiveSheet(); sheet.suspendPaint(); const cfs = sheet.conditionalFormats; const Range = GC.Spread.Sheets.Range; let row = 0, col = 1; sheet.getCell(row, ++col).value("Icon Set").font("700 11pt Calibri"); sheet.addSpan(row, col, 1, 10); sheet.addSpan(row + 6, col, 1, 10); row++; for (let column = col; column < col + 10; column++) { sheet.getCell(row, column).value(-50); sheet.getCell(row + 1, column).value(-25); sheet.getCell(row + 2, column).value(0); sheet.getCell(row + 3, column).value(25); sheet.getCell(row + 4, column).value(50); sheet.getCell(row + 6, column).value(-50); sheet.getCell(row + 7, column).value(-25); sheet.getCell(row + 8, column).value(0); sheet.getCell(row + 9, column).value(25); sheet.getCell(row + 10, column).value(50); } let rowCount = 5; cfs.addIconSetRule(0, [new Range(row, col, rowCount, 1)]); cfs.addIconSetRule(1, [new Range(row, ++col, rowCount, 1)]); cfs.addIconSetRule(2, [new Range(row, ++col, rowCount, 1)]); cfs.addIconSetRule(3, [new Range(row, ++col, rowCount, 1)]); cfs.addIconSetRule(4, [new Range(row, ++col, rowCount, 1)]); cfs.addIconSetRule(5, [new Range(row, ++col, rowCount, 1)]); cfs.addIconSetRule(6, [new Range(row, ++col, rowCount, 1)]); cfs.addIconSetRule(7, [new Range(row, ++col, rowCount, 1)]); cfs.addIconSetRule(8, [new Range(row, ++col, rowCount, 1)]); cfs.addIconSetRule(9, [new Range(row, ++col, rowCount, 1)]); col = 1; cfs.addIconSetRule(10, [new Range(row + 6, ++col, rowCount, 1)]); cfs.addIconSetRule(11, [new Range(row + 6, ++col, rowCount, 1)]); cfs.addIconSetRule(12, [new Range(row + 6, ++col, rowCount, 1)]); cfs.addIconSetRule(13, [new Range(row + 6, ++col, rowCount, 1)]); cfs.addIconSetRule(14, [new Range(row + 6, ++col, rowCount, 1)]); cfs.addIconSetRule(15, [new Range(row + 6, ++col, rowCount, 1)]); cfs.addIconSetRule(16, [new Range(row + 6, ++col, rowCount, 1)]); cfs.addIconSetRule(17, [new Range(row + 6, ++col, rowCount, 1)]); cfs.addIconSetRule(18, [new Range(row + 6, ++col, rowCount, 1)]); cfs.addIconSetRule(19, [new Range(row + 6, ++col, rowCount, 1)]); sheet.resumePaint(); let fbx = new GC.Spread.Sheets.FormulaTextBox.FormulaTextBox(document.getElementById('formulaBar'), {rangeSelectMode: true}); fbx.workbook(spread); this.fbx = fbx; } getSelectedRangeFormula($event: any) { document.getElementById('rangeText').textContent = this.fbx.text(); } } @NgModule({ imports: [BrowserModule, SpreadSheetsModule], declarations: [AppComponent], exports: [AppComponent], bootstrap: [AppComponent] }) export class AppModule {} enableProdMode(); // Bootstrap application with hash style navigation and global services. platformBrowserDynamic().bootstrapModule(AppModule);
<!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/angular/node_modules/@mescius/spread-sheets/styles/gc.spread.sheets.excel2013white.css"> <!-- Polyfills --> <script src="$DEMOROOT$/en/angular/node_modules/core-js/client/shim.min.js"></script> <script src="$DEMOROOT$/en/angular/node_modules/zone.js/fesm2015/zone.min.js"></script> <!-- SystemJS --> <script src="$DEMOROOT$/en/angular/node_modules/systemjs/dist/system.js"></script> <script src="systemjs.config.js"></script> <script> // workaround to load 'rxjs/operators' from the rxjs bundle System.import('rxjs').then(function (m) { System.import('@angular/compiler'); System.set(SystemJS.resolveSync('rxjs/operators'), System.newModule(m.operators)); System.import('$DEMOROOT$/en/lib/angular/license.ts'); System.import('./src/app.component'); }); </script> </head> <body> <app-component></app-component> </body> </html>
<div class="sample-tutorial"> <gc-spread-sheets [hostStyle]="hostStyle" (workbookInitialized)="initSpread($event)"> <gc-worksheet> </gc-worksheet> </gc-spread-sheets> <div class="options-container"> <div class="top-options"> <p>Click the icon of the rangeSelector, then select a range, then Click the 'Get Value' button.This can be useful for providing users the ability to select ranges for their formulas rather than manually typing them.</p> <div id="formulaBar" spellcheck="false" style="border: 1px solid #808080;width:100%;"></div> </div> <div class="options-row" style="margin-top: 10px"> <input type="button" id="getValue" value="Get Value" style=" font-size: 14px; height: 30px" (click)="getSelectedRangeFormula($event)" /> <label> Range Text: <span id="rangeText" style="border: 0px; outline: none; font-size: 14px;padding: 0px"></span> </label> </div> </div> </div>
.sample-tutorial { position: relative; height: 100%; overflow: hidden; } .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; } input, select { width: 100%; padding: 4px, 8px; margin: 8px 0; box-sizing: border-box; } body { position: absolute; top: 0; bottom: 0; left: 0; right: 0; }
(function (global) { System.config({ transpiler: 'ts', typescriptOptions: { tsconfig: true }, meta: { 'typescript': { "exports": "ts" }, '*.css': { loader: 'css' } }, paths: { // paths serve as alias 'npm:': 'node_modules/' }, // map tells the System loader where to look for things map: { 'core-js': 'npm:core-js/client/shim.min.js', 'zone': 'npm:zone.js/fesm2015/zone.min.js', 'rxjs': 'npm:rxjs/dist/bundles/rxjs.umd.min.js', '@angular/core': 'npm:@angular/core/fesm2022', '@angular/common': 'npm:@angular/common/fesm2022/common.mjs', '@angular/compiler': 'npm:@angular/compiler/fesm2022/compiler.mjs', '@angular/platform-browser': 'npm:@angular/platform-browser/fesm2022/platform-browser.mjs', '@angular/platform-browser-dynamic': 'npm:@angular/platform-browser-dynamic/fesm2022/platform-browser-dynamic.mjs', '@angular/common/http': 'npm:@angular/common/fesm2022/http.mjs', '@angular/router': 'npm:@angular/router/fesm2022/router.mjs', '@angular/forms': 'npm:@angular/forms/fesm2022/forms.mjs', 'jszip': 'npm:jszip/dist/jszip.min.js', 'typescript': 'npm:typescript/lib/typescript.js', 'ts': './plugin.js', 'tslib':'npm:tslib/tslib.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', '@mescius/spread-sheets': 'npm:@mescius/spread-sheets/index.js', '@mescius/spread-sheets-angular': 'npm:@mescius/spread-sheets-angular/fesm2020/mescius-spread-sheets-angular.mjs', '@grapecity/jsob-test-dependency-package/react-components': 'npm:@grapecity/jsob-test-dependency-package/react-components/index.js' }, // packages tells the System loader how to load when no filename and/or no extension packages: { src: { defaultExtension: 'ts' }, rxjs: { defaultExtension: 'js' }, "node_modules": { defaultExtension: 'js' }, "node_modules/@angular": { defaultExtension: 'mjs' }, "@mescius/spread-sheets-angular": { defaultExtension: 'mjs' }, '@angular/core': { defaultExtension: 'mjs', main: 'core.mjs' } } }); })(this);