RangeTemplate

The RangeTemplate is a very powerful feature allowing the user or developer to define a template of cell ranges as a single CellType and apply that template to a cell to load different data into the template. This could include multiple rows and/or columns, for example allowing you to display a card view in one cell.

The demo is being dynamically compiled to support real-time code editing... For quicker access to features, switch to the "JavaScript" tab for a smoother experience! :)
Description
app.component.ts
index.html
app.component.html
styles.css
Copy to CodeMine

To create a RangeTemplate , follow this example:

    var cellType = new GC.Spread.Sheets.CellTypes.RangeTemplate(templateSheet, 0, 0, 12, 11);
    sheet.setCellType(3, 2, cellType, GC.Spread.Sheets.SheetArea.viewport);

The following is the API definition:

/**
 * @description RangeTemplate provide a template from a range of referenced worksheet,it can apply to a cell.It will render the cell same as the tempalte and fill data different.If the param row,col, rowCount, colCount not set , it will use the whole sheet as the range scope.
 * @extends GC.Spread.Sheets.CellTypes.Base
 * @param {GC.Spread.Sheets.Worksheet} sheet  the referenced worksheet, the sheet could be an individual sheet outside the workbook.
 * @param {number} [row] the template scope start row.
 * @param {number} [col] the template scope start col.
 * @param {number} [rowCount] the template scope row count.
 * @param {number} [colCount] the template scope col count.
 */

The parameters row, col, rowCount, and colCount are optional. If those parameters not set, the whole sheet row will be used to create the RangeTemplate. Here is an example of creating a RangeTemplate with a defined row and column count:

    var templateSheet = new GC.Spread.Sheets.Worksheet();
    templateSheet.setRowCount(12);
    templateSheet.setColumnCount(11);
    var cellType = new GC.Spread.Sheets.CellTypes.RangeTemplate(templateSheet);
    sheet.setCellType(3, 2, cellType, GC.Spread.Sheets.SheetArea.viewport);

You can customize your bindingPath or formula in the template WorkSheet. The RangeTemplate will then use the cell value as the datasource to resolve the bindingPath or formula in the designated range.

Conditional rules, data validation, sparkline data & date ranges, sparklineEx, and formulas can refer to a cell or cell range and they must be contained within the RangeTemplate. In addition, the spans in template WorkSheet must be completely contained inside the RangeTemplate.

The RangeTemplate does not support nesting other RangeTemplates, as it may lose data or cause an endless loop.

To create a RangeTemplate , follow this example: The following is the API definition: The parameters row, col, rowCount, and colCount are optional. If those parameters not set, the whole sheet row will be used to create the RangeTemplate. Here is an example of creating a RangeTemplate with a defined row and column count: You can customize your bindingPath or formula in the template WorkSheet. The RangeTemplate will then use the cell value as the datasource to resolve the bindingPath or formula in the designated range. Conditional rules, data validation, sparkline data & date ranges, sparklineEx, and formulas can refer to a cell or cell range and they must be contained within the RangeTemplate. In addition, the spans in template WorkSheet must be completely contained inside the RangeTemplate. The RangeTemplate does not support nesting other RangeTemplates, as it may lose data or cause an endless loop.
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 { renderSheet: GC.Spread.Sheets.Worksheet; templateSheet: GC.Spread.Sheets.Worksheet; spread: GC.Spread.Sheets.Workbook; hostStyle = { width: 'calc(100% - 280px)', height: '100%', overflow: 'hidden', float: 'left' }; updateRangeCelltype() { let celltype = new GC.Spread.Sheets.CellTypes.RangeTemplate(this.templateSheet); this.renderSheet.setCellType(-1, 0, celltype); } initSpread($event: any) { this.spread = $event.spread; let spread = this.spread; spread.setSheetCount(1); let renderSheet = spread.getActiveSheet(); let templateSheet = new GC.Spread.Sheets.Worksheet(); templateSheet.fromJSON(templatesheetjson); spread.addSheet(1, templateSheet); this.templateSheet = templateSheet; this.renderSheet = renderSheet; renderSheet.suspendPaint(); let celltype = new GC.Spread.Sheets.CellTypes.RangeTemplate(templateSheet); renderSheet.autoGenerateColumns = false; data = this.updateData(renderSheet,data); renderSheet.setDataSource(data); let cardInfo = { displayName: "Person Card", size: 440, value: function (item: any) { return item; }, cellType: celltype }; renderSheet.defaults.rowHeight = 207; renderSheet.bindColumn(0, cardInfo); renderSheet.bindColumn(1, { displayName: "Name", name: 'fullName', size: 150 }); renderSheet.bindColumn(2, { displayName: "Phone", name: 'phone', size: 150 }); renderSheet.bindColumn(3, { displayName: "Email", name: 'email', size: 360 }); renderSheet.bindColumn(4, { displayName: "Registered Date", name: 'registered.date', size: 240 }); renderSheet.resumePaint(); } updateData(sheet:GC.Spread.Sheets.worksheet, data:any[]) { data.forEach(obj => { var url = obj.image; obj.image = GC.Spread.Sheets.CalcEngine.evaluateFormula(sheet, '=IMAGE(\"' + url + '\")'); }); return data; } } @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> <script src="$DEMOROOT$/spread/source/data/rangecelltype-data.js" type="text/javascript"></script> <script src="$DEMOROOT$/spread/source/data/rangecelltype-templatesheet.js" type="text/javascript"></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-spread-sheets> <div class="options-container"> <div class="option-row"> <p>In this example, you can change the template label text. Switch to the Template sheet, change the Email or Phone text, then press Update RangeTemplate to apply your changes to the template. You can switch back to Sheet1 to view your changes.</p> <input type="button" id="update" value="Update RangeTemplate" (click) = "updateRangeCelltype($event)"/> </div> </div> </div>
.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; overflow: auto; padding: 12px; height: 100%; box-sizing: border-box; background: #fbfbfb; } .option-row { padding-bottom: 8px; } label { padding-bottom: 4px; display: block; } input { width: 100%; padding: 4px 8px; 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);