Overview

The dynamic array is used to replace array formula. Any formula that has the potential to return multiple results can be referred to as a dynamic array formula. Formulas that are currently returning multiple results, and are successfully spilling, can be referred to as spilled array formulas.

In the following example, the value from C3 spills over to the adjacent cells. The value in C9 however will display the #SPILL! error as there is an existing value in the range preventing the spill.

Users can enable dynamic array functions in one of two ways: Spill means that a formula has returned multiple values and those values ‘spill’ into the neighboring cells. Dynamic Array has seven Functions: FILTER function: Filters a range of data based on criteria you defined. RANDARRAY function: Returns an array of random numbers. SEQUENCE function: Generates a list of sequential numbers in an array, such as 1, 2, 3, 4. SORT function: Sorts the contents of a range or array. SORTBY function: Sorts the contents of a range or array based on the values in a corresponding range or array. UNIQUE function: Returns a list of unique values in a list or range. The implicit intersection operator @: Returns a single value using logic known as implicit intersection. The Spill Range Operator # can reference the entire spill range: When you're dealing with spilled array functions, it's possible to reference the entire spill range by placing the spilled range operator (#) after the range. #SPILL errors are returned when a formula returns multiple values that cannot display the results in the spreadsheet for any of the following reasons: Spill range for a spilled array formula isn't blank. Unable to determine the size of the spilled array because it's volatile, and resizes between calculation passes. The spilled array formula you're attempting to enter will extend beyond the worksheet's range. Spilled array formulas in tables. The spilled array formula you're attempting to enter has caused to run out of memory. Spilled array formulas spill into merged cells. The formula cannot recognize or cannot reconcile. #CALC! errors are retuned when any of the following results are true: Calculate an array within an array. Arrays can only contain numbers, strings, errors, Booleans, or linked data types. Range references aren't supported. Return an empty set. Calculation engine encounters an unspecified calculation error with an array.
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; hostStyle = { width: 'calc(100% - 280px)', height: '100%', overflow: 'hidden', float: 'left' }; constructor() { } initSpread($event: any) { this.spread = $event.spread; let spread = this.spread; spread.options.allowDynamicArray = true; let sheet = spread.getActiveSheet(); spread.suspendPaint(); spread.suspendCalcService(); sheet.setValue(1, 2, "=SEQUENCE(3,3)"); sheet.setFormula(2, 2, 'SEQUENCE(3,3)'); sheet.setValue(7, 2, "=SEQUENCE(3,3)"); sheet.setFormula(8, 2, 'SEQUENCE(3,3)'); sheet.setValue(9, 3, 3); spread.resumeCalcService(); spread.resumePaint(); } setAllowDynamicArray($event: any) { let spread = this.spread, sheet = spread.getActiveSheet(); spread.options.allowDynamicArray = $event.target.checked; sheet && sheet.recalcAll(true); } } @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="option-row"> <input style="width: 20px;float: left;" type="checkbox" id="allowDynamicArray" checked="checked" (change)="setAllowDynamicArray($event)" /> <label for="allowDynamicArray">Allow DynamicArray</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 { margin-bottom: 5px; padding: 2px 4px; width: 100%; 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);