Basic Shape

SpreadJS offers 182 built-in shape types. These shapes can be customized with different Excel-like styles, including fill colors, borders, and text.

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

The shape's fill color, border (color and line width) and text (color, font, size, horizontal & vertical alignment) is configurable.

You can add an autoShape and change the shape style using the shape API

    var circle = sheet.shapes.add('circle', GC.Spread.Sheets.Shapes.AutoShapeType.circle, 100, 50, 100, 150);
     var heart = sheet.shapes.add('heart', GC.Spread.Sheets.Shapes.AutoShapeType.heart, 400, 50, 100, 150);
The shape's fill color, border (color and line width) and text (color, font, size, horizontal & vertical alignment) is configurable. You can add an autoShape and change the shape style using the shape API
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 "@mescius/spread-sheets-shapes"; import './styles.css'; @Component({ selector: 'app-component', templateUrl: 'src/app.component.html' }) export class AppComponent { hostStyle = { width: '100%', height: '100%', overflow: 'hidden', float: 'left' }; shapeCategory = [{ type: ['rectangle', 'roundedRectangle', 'snip1Rectangle', 'snip2SameRectangle', 'snip2DiagRectangle', 'snipRoundRectangle', 'round1Rectangle', 'round2SameRectangle', ], desc: "Rectangles", }, { type: ['oval', 'hexagon', 'cube', 'smileyFace', 'heart', 'gear9', 'actionButtonMovie', 'funnel'], desc: "Basic Shapes", }, { type: [ 'rightArrow', 'leftArrow', 'upArrow', 'downArrow', 'leftRightArrow', 'upDownArrow', 'quadArrow', 'leftRightUpArrow', ], desc: "Block Arrows", }, { type: [ 'mathPlus', 'mathMinus', 'mathMultiply', 'mathDivide', 'mathEqual', 'mathNotEqual' ], desc: "Equation Shapes", }, { type: [ 'flowchartProcess', 'flowchartAlternateProcess', 'flowchartDecision', 'flowchartData', 'flowchartPredefinedProcess', 'flowchartInternalStorage', 'flowchartDocument', 'flowchartMultidocument', ], desc: "Flowchart", }, { type: [ 'shape8pointStar', 'explosion2', 'shape4pointStar', 'shape5pointStar', 'star6Point', 'star7Point', 'shape8pointStar', 'star10Point', ], desc: "Stars and Banners", }, { type: [ 'rectangularCallout', 'roundedRectangularCallout', 'ovalCallout', 'cloudCallout', 'lineCallout2', 'lineCallout3', 'lineCallout4', 'lineCallout2AccentBar', ], desc: "Callouts", } ]; constructor() { } initSpread($event: any) { let spread = $event.spread; spread.suspendPaint(); let sheets = spread.sheets; for (let i = 0; i < this.shapeCategory.length; i++) { let sheet = sheets[i]; initShape(sheet, this.shapeCategory[i].type); //add shape } spread.options.tabStripRatio = 0.8; spread.resumePaint(); } } function initShape(sheet: GC.Spread.Sheets.Worksheet, shapeType: GC.Spread.Sheets.Shapes.AutoShapeType) { let left = 50, top = 50, tempX = 0, tempY = 0, tempShape = null, shapeName, row = 1, column = 1; for(let i = 0, len = shapeType.length ; i < len; i++) { shapeName = shapeType[i]; if(GC.Spread.Sheets.Shapes.AutoShapeType[shapeName]){ tempShape = sheet.shapes.add(shapeName, GC.Spread.Sheets.Shapes.AutoShapeType[shapeName], left + tempX * 180, top + tempY, 150, 150); tempX ++; sheet.setText(row,column,shapeName); column = column+3; if(tempX === 4) { tempX = 0; tempY += 200; column = 1; row = 11; } } } } @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 class="sample-spreadsheets" [hostStyle]="hostStyle" (workbookInitialized)="initSpread($event)"> <gc-worksheet *ngFor="let item of shapeCategory" [name]="item.desc"></gc-worksheet> </gc-spread-sheets> </div>
.sample-tutorial { position: relative; width: 100%; height: 100%; overflow: hidden; } 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-shapes': 'npm:@mescius/spread-sheets-shapes/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);