Pivot Style

You can apply a pivot table style to highlight any data in the specified dimension(s). The style method can be used to apply styles to row and column fields. Switch between the three sheets below to see the different styles being applied.

PivotTable offers ability to set style to the specified dimensions. No matter how the PivotTable layout changes, the style only follows the specified dimensions. Add/Remove style through setStyle API Get style through getStyle 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 "@mescius/spread-sheets-pivot-addon"; import './styles.css'; @Component({ selector: 'app-component', templateUrl: 'src/app.component.html' }) export class AppComponent { hostStyle = { width: 'calc(100% - 300px)', height: '100%', overflow: 'hidden', float: 'left' }; constructor() { } initSpread($event: any) { let spread = $event.spread; this.initSheets(spread); let markQtrLayout = spread.getSheet(0); let markQtrPivotTable = this.initMarkQtr(markQtrLayout); let markitemLayout = spread.getSheet(1); let markItemPivotTable = this.initMarkItem(markitemLayout); let markOffsetLayout = spread.getSheet(2); let markOffsetPivotTable = this.initMarkOffset(markOffsetLayout); this.setMarkQtrStyle(markQtrPivotTable); this.setMarkItemStyle(markItemPivotTable); this.setMarkOffsetStyle(markOffsetPivotTable); this.bindEvent(spread); } initSheets (spread: GC.Spread.Sheets.Workbook) { spread.suspendPaint(); let sheet = spread.getSheet(3); sheet.name("DataSource"); sheet.setRowCount(117); sheet.setColumnWidth(0, 120); sheet.getCell(-1, 0).formatter("YYYY-mm-DD"); sheet.getRange(-1,4,0,2).formatter("$ #,##0"); let table = sheet.tables.add('tableSales', 0, 0, 117, 6); for(let i=2;i<=117;i++) { sheet.setFormula(i,5,'=D'+i+'*E'+i) } table.style(GC.Spread.Sheets.Tables.TableThemes["none"]); sheet.setArray(0, 0, pivotSales); let sheet0 = spread.getSheet(0); sheet0.name("MarkQtrLayout"); sheet0.setValue(0,0, "A style is applied for the 1st and 3rd Quarter Subtotal."); let sheet1 = spread.getSheet(1); sheet1.name("MarkItemLayout"); sheet1.setValue(0,0, "This style is only applied to 'BMW' and will be applied whether this field is being displayed in the PivotTable or not. "); let sheet2 = spread.getSheet(2); sheet2.name("MarkOffsetLayout"); sheet2.setValue(0,0, "This style is only applied to the offset area of the 'Alan' item"); spread.resumePaint(); } initMarkQtr(sheet: GC.Spread.Sheets.Worksheet) { let myPivotTable = sheet.pivotTables.add("markQtrPivotTable", "tableSales", 1, 1, GC.Spread.Pivot.PivotTableLayoutType.outline, GC.Spread.Pivot.PivotTableThemes.light8); myPivotTable.suspendLayout(); myPivotTable.options.showRowHeader = true; myPivotTable.options.showColumnHeader = true; myPivotTable.add("salesperson", "Salesperson", GC.Spread.Pivot.PivotTableFieldType.rowField); myPivotTable.add("car", "Cars", GC.Spread.Pivot.PivotTableFieldType.rowField); myPivotTable.add("date", "Qt", GC.Spread.Pivot.PivotTableFieldType.columnField); let groupInfo = { originFieldName: "date", dateGroups: [{ by: GC.Pivot.DateGroupType.quarters }] }; myPivotTable.group(groupInfo); myPivotTable.add("quantity", "Sum of Quantity", GC.Spread.Pivot.PivotTableFieldType.valueField, GC.Pivot.SubtotalType.sum); myPivotTable.resumeLayout(); myPivotTable.autoFitColumn(); return myPivotTable; } initMarkItem(sheet: GC.Spread.Sheets.Worksheet) { let myPivotTable = sheet.pivotTables.add("markItemPivotTable", "tableSales", 1, 1, GC.Spread.Pivot.PivotTableLayoutType.outline, GC.Spread.Pivot.PivotTableThemes.light8); myPivotTable.suspendLayout(); myPivotTable.options.showRowHeader = true; myPivotTable.options.showColumnHeader = true; myPivotTable.add("salesperson", "Salesperson", GC.Spread.Pivot.PivotTableFieldType.rowField); myPivotTable.add("car", "Cars", GC.Spread.Pivot.PivotTableFieldType.rowField); myPivotTable.add("date", "Qt", GC.Spread.Pivot.PivotTableFieldType.columnField); myPivotTable.add("quantity", "Sum of Quantity", GC.Spread.Pivot.PivotTableFieldType.valueField, GC.Pivot.SubtotalType.sum); new GC.Spread.Pivot.PivotPanel("myPivotPanel", myPivotTable, document.getElementById("panel")); document.getElementById("panel").style.display = "none"; myPivotTable.resumeLayout(); myPivotTable.autoFitColumn(); return myPivotTable; } initMarkOffset(sheet: GC.Spread.Sheets.Worksheet) { let myPivotTable = sheet.pivotTables.add("markOffsetPivotTable", "tableSales", 1, 1, GC.Spread.Pivot.PivotTableLayoutType.outline, GC.Spread.Pivot.PivotTableThemes.light8); myPivotTable.suspendLayout(); myPivotTable.options.showRowHeader = true; myPivotTable.options.showColumnHeader = true; myPivotTable.add("salesperson", "Salesperson", GC.Spread.Pivot.PivotTableFieldType.rowField); myPivotTable.add("car", "Cars", GC.Spread.Pivot.PivotTableFieldType.rowField); myPivotTable.add("date", "Qt", GC.Spread.Pivot.PivotTableFieldType.columnField); myPivotTable.add("quantity", "Sum of Quantity", GC.Spread.Pivot.PivotTableFieldType.valueField, GC.Pivot.SubtotalType.sum); myPivotTable.resumeLayout(); myPivotTable.autoFitColumn(); return myPivotTable; } setMarkQtrStyle (pivotTable: any) { let style = new GC.Spread.Sheets.Style(); style.backColor = "#82bc00"; style.foreColor = "white"; let labelPivotArea = { labelOnly: true, references: [{ fieldName: "Qt", subtotals: true, items: ["Qtr1", "Qtr3"] }] }; pivotTable.setStyle(labelPivotArea, style); let dataPivotArea = { dataOnly: true, references: [{ fieldName: "Qt", subtotals: true, items: ["Qtr1", "Qtr3"] }] }; pivotTable.setStyle(dataPivotArea, style); } setMarkItemStyle (pivotTable: any) { let style = new GC.Spread.Sheets.Style(); style.backColor = "rgb(247, 167, 17)"; let labelPivotArea = { labelOnly: true, references: [{ fieldName: "Cars", items: ["BMW"] }] }; pivotTable.setStyle(labelPivotArea, style); let dataPivotArea = { dataOnly: true, references: [{ fieldName: "Cars", items: ["BMW"] }] }; pivotTable.setStyle(dataPivotArea, style); } setMarkOffsetStyle (pivotTable) { let style = new GC.Spread.Sheets.Style(); style.backColor = "rgb(247, 167, 17)"; let labelPivotAreaWithOffset = { labelOnly: true, references: [{ fieldName: "Salesperson", items: ["Alan"] }], offset: { row: 1, col: 0, rowCount: 3, colCount: 1 } }; pivotTable.setStyle(labelPivotAreaWithOffset, style); let cornerPivotAreaWithOffset = { type: GC.Spread.Pivot.PivotAreaType.corner, offset: { row: 0, col: 1, rowCount: 1, colCount: 1 } }; pivotTable.setStyle(cornerPivotAreaWithOffset, style); let topRightPivotAreaWithOffset = { type: GC.Spread.Pivot.PivotAreaType.topRight, offset: { row: 0, col: 0, rowCount: 1, colCount: 4 } }; pivotTable.setStyle(topRightPivotAreaWithOffset, style); } bindEvent(spread){ spread.bind(GC.Spread.Sheets.Events.ActiveSheetChanged, function(e, args) { args.newSheet.name() === "MarkItemLayout" ? document.getElementById("panel").style.display = "unset": document.getElementById("panel").style.display = "none" }); } } @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"> <script src="$DEMOROOT$/spread/source/data/pivot-data.js" type="text/javascript"></script> <!-- 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-worksheet> </gc-worksheet> <gc-worksheet> </gc-worksheet> <gc-worksheet> </gc-worksheet> </gc-spread-sheets> <div class="sample-panel"> <div id="panel"></div> </div> </div>
.sample-tutorial { position: relative; height: 100%; } .sample-spreadsheets { width: calc(100% - 300px); height: 100%; overflow: hidden; float: left; } body { position: absolute; top: 0; bottom: 0; left: 0; right: 0; overflow: hidden; } .sample-panel { float: right; width: 300px; padding: 12px; height: 100%; box-sizing: border-box; background: #fbfbfb; overflow: auto; } .gc-panel { padding: 10px; background-color: rgb(230, 230, 230); } #panel { position: absolute; right: 0; width: 300px; height: 100%; top: 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-pivot-addon': 'npm:@mescius/spread-sheets-pivot-addon/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);