Spread Theme

This sample shows how you can apply a built-in theme to the UI of SpreadJS.

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

SpreadJS supports different Excel styles.

They are provided by css files as follows:

  • Excel 2007: gc.spread.sheets.x.x.x.css
  • Excel 2013 White: gc.spread.sheets.excel2013white.x.x.x.css
  • Excel 2013 Light Gray: gc.spread.sheets.excel2013lightgray.x.x.x.css
  • Excel 2013 Dark Gray: gc.spread.sheets.excel2013darkgray.x.x.x.css
  • Excel 2016 Colorful: gc.spread.sheets.excel2016colorful.x.x.x.css
  • Excel 2016 Dark Gray: gc.spread.sheets.excel2016darkgray.x.x.x.css

You can use any one of them by adding a style link in the head section of the page. For example:

<link rel="stylesheet" 
      href="css/gc.spread.sheets.excel2013white.x.x.x.css" />

You can dynamically switch between themes by changing the css reference file. Call the Spread refresh method to apply the change.

SpreadJS supports different Excel styles. They are provided by css files as follows: Excel 2007: gc.spread.sheets.x.x.x.css Excel 2013 White: gc.spread.sheets.excel2013white.x.x.x.css Excel 2013 Light Gray: gc.spread.sheets.excel2013lightgray.x.x.x.css Excel 2013 Dark Gray: gc.spread.sheets.excel2013darkgray.x.x.x.css Excel 2016 Colorful: gc.spread.sheets.excel2016colorful.x.x.x.css Excel 2016 Dark Gray: gc.spread.sheets.excel2016darkgray.x.x.x.css You can use any one of them by adding a style link in the head section of the page. For example: You can dynamically switch between themes by changing the css reference file. Call the Spread refresh method to apply the change.
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 { dataSource } from './data'; import './styles.css'; @Component({ selector: 'app-component', templateUrl: 'src/app.component.html' }) export class AppComponent { spread: GC.Spread.Sheets.Workbook; hostStyle = { width: 'calc(100% - 250px)', height: '100%', overflow: 'hidden', float: 'left' }; addPieContent: any; constructor() { } initSpread($event: any) { this.spread = $event.spread; let spread = this.spread; let sheet = spread.getActiveSheet(); sheet.suspendPaint(); addPieContent(sheet); let dataColumns = ["Interval", "Javascript", "Java", "Python", "Php", "C++", "C", "Ruby"]; let data = [ ["2017", 0.625, 0.397, 0.32, 0.281, 0.223, 0.19, 0.091], ["2018", 0.715, 0.454, 0.379, 0.314, 0.246, 0.221, 0.103], ["2019", 0.678, 0.411, 0.417, 0.264, 0.235, 0.206, 0.084] ]; sheet.tables.addFromDataSource("table1", 1, 1, data, GC.Spread.Sheets.Tables.TableThemes.light14); sheet.getRange(-1, 1, -1, 6).width(80); let table = sheet.tables.findByName("table1"); table.setColumnName(0, dataColumns[0]); table.setColumnName(1, dataColumns[1]); table.setColumnName(2, dataColumns[2]); table.setColumnName(3, dataColumns[3]); table.setColumnName(4, dataColumns[4]); table.setColumnName(5, dataColumns[5]); table.setColumnName(6, dataColumns[6]); table.setColumnName(7, dataColumns[7]); sheet.getRange("C3:I5").formatter("0.0%"); function addPieContent(sheet: any) { sheet.addSpan(6, 2, 12, 5); sheet.setFormula(6, 2, '=PIESPARKLINE(C1:I5, "#115f9a", "#1984c5", "#22a7f0", "#48b5c4", "#76c68f", "#a6d75b", "#c9e52f", "#d0ee11", "#d0f400")'); } sheet.resumePaint(); } applyTheme($event: any) { let header = document.getElementsByTagName('head')[0]; let target: HTMLLinkElement = document.querySelector('link[href*="gc.spread.sheets"]'); let href = target.href, pos = href.indexOf('gc.spread.sheets'), item = href.substr(0, pos) + $event.target.value; header.removeChild(target); if (item) { this.addThemeLink(item); } else { this.spread.refresh(); } } addThemeLink(href: string) { let link = document.createElement('link'); const spread = this.spread; link.type = "text/css"; link.rel = "stylesheet"; link.href = href; link.onload = function () { spread.refresh(); }; let header = document.getElementsByTagName('head')[0]; header.appendChild(link); } } @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"> <label>Define Spread theme below:</label> <select id="spreadThemes" (change)="applyTheme($event)"> <optgroup label="SpreadJS"> <option value="gc.spread.sheets.css">SpreadJS</option> </optgroup> <optgroup label="Excel2013"> <option value="gc.spread.sheets.excel2013white.css" selected>White</option> <option value="gc.spread.sheets.excel2013lightGray.css">Light Gray</option> <option value="gc.spread.sheets.excel2013darkGray.css">Dark Gray</option> </optgroup> <optgroup label="Excel2016"> <option value="gc.spread.sheets.excel2016colorful.css">Colorful</option> <option value="gc.spread.sheets.excel2016darkGray.css">Dark Gray</option> <option value="gc.spread.sheets.excel2016black.css">Black</option> </optgroup> </select> </div> </div> </div>
.sample-tutorial { position: relative; height: 100%; overflow: hidden; } .options-container { float: right; width: 250px; padding: 12px; height: 100%; box-sizing: border-box; background: #fbfbfb; overflow: auto; } .option-row { font-size: 14px; padding: 5px; margin-top: 10px; } label { display: block; margin-bottom: 6px; } input, select { padding: 4px 6px; box-sizing: border-box; margin-bottom: 6px; } 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);