Custom

You can customize how groups are shown to fit your needs.

The detail columns and grouping outline can be hidden, and each group can be collapsed.

TableSheet can be grouped by multiple group fields. After TableSheet is grouped, the detail columns can be hidden. After TableSheet is grouped, the grouping outline in the row header can be hidden. After TableSheet is grouped, the groups that are separated by the "month field can be collapsed. After TableSheet is grouped, the group which level is 2 and start index is 0 could be collapsed.
/*REPLACE_MARKER*/ /*DO NOT DELETE THESE COMMENTS*/ 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-tablesheet"; import './styles.css'; declare let airline_delay_causes: any; @Component({ selector: 'app-component', templateUrl: 'src/app.component.html' }) export class AppComponent { hostStyle = { width: 'calc(100% - 280px)', height: '100%', overflow: 'hidden', float: 'left' }; spread: GC.Spread.Sheets.Workbook; constructor() { } initSpread($event: any) { let spread = this.spread = $event.spread; spread.suspendPaint(); spread.clearSheets(); spread.options.autoFitType = GC.Spread.Sheets.AutoFitType.cellWithHeader; //init a data manager var dataManager = spread.dataManager(); var myTable = dataManager.addTable("myTable", { data: airline_delay_causes, schema: { type: "csv", columns: { year: { dataType: "number" }, month: { dataType: "number" }, arr_flights: { dataType: "number" }, arr_del15: { dataType: "number" }, carrier_ct: { dataType: "number" }, weather_ct: { dataType: "number" }, nas_ct: { dataType: "number" }, security_ct: { dataType: "number" }, late_aircraft_ct: { dataType: "number" }, arr_cancelled: { dataType: "number" }, arr_diverted: { dataType: "number" } } } }); //init a table sheet var sheet = spread.addSheetTab(0, "TableSheet1", GC.Spread.Sheets.SheetType.tableSheet); sheet.setDefaultRowHeight(100, GC.Spread.Sheets.SheetArea.colHeader); sheet.options.allowAddNew = false; //hide new row //bind a view to the table sheet let _this = this; myTable.fetch().then(function() { var myView = myTable.addView("myView", [ { value: "year", caption: "Year", width: 80 }, { value: "month", caption: "Month", width: 100 }, { value: "carrier_name", caption: "Carrier name", width: 250 }, { value: "airport_name", caption: "Airport Name", width: "*" }, { value: "arr_flights", caption: "Number of flights which arrived at the airport", width: "*" }, { value: "arr_del15", caption: "Number of flights delayed (>= 15minutes late)", width: "*" }, { value: "carrier_ct", caption: "Number of flights delayed due to air carrier", width: "*" }, { value: "weather_ct", caption: "Number of flights delayed due to weather", width: "*" }, { value: "nas_ct", caption: "Number of flights delayed due to National Aviation System", width: "*" }, { value: "security_ct", caption: "Number of flights delayed due to security", width: "*" }, { value: "late_aircraft_ct", caption: "Number of flights delayed due to a previous flight using the same aircraft being late", width: "*" }, { value: "arr_cancelled", caption: "Number of cancelled flights", width: "*" }, { value: "arr_diverted", caption: "Number of diverted flights", width: "*" } ] ); spread.suspendPaint(); sheet.setDataView(myView); _this.groupCallback(); sheet.detailColumnsVisible(false); sheet.expandGroup("month", false); spread.resumePaint(); }); spread.resumePaint(); } groupCallback() { let sheet = this.spread.getActiveSheetTab(); sheet.groupBy([ { field: "carrier_name", caption: "Carrier Name" }, { field: "year", caption: "Year" }, { field: "month", caption: "Month", width:100, summaryFields: [ { caption: "Arrived", formula: "=SUM([arr_flights])", width: 90, style: { foreColor: "green", formatter: "#,##0"} }, { caption: "Delayed", formula: "=SUM([arr_del15])", width: 90, style: { foreColor: "orange", formatter: "#,##0"} }, { caption: "Cancelled", formula: "=SUM([arr_cancelled])", width: 100, style: { foreColor: "red", formatter: "#,##0"} }, { caption: "Diverted", formula: "=SUM([arr_diverted])", width: 90, style: { foreColor: "blue", formatter: "#,##0"} } ] } ]); } removeGroupCallback() { let sheet = this.spread.getActiveSheetTab(); sheet.removeGroupBy(); } detailColumnsVisibleCallback($event: any) { let sheet = this.spread.getActiveSheetTab(); sheet.detailColumnsVisible($event.currentTarget.checked); } groupOutlinePositionCallback($event: any) { let sheet = this.spread.getActiveSheetTab(); sheet.groupOutlinePosition(+$event.currentTarget.value); } expandGroupByCarrierNameCallback($event: any) { let sheet = this.spread.getActiveSheetTab(); sheet.expandGroup("carrier_name", $event.currentTarget.checked); } expandGroupByYearCallback($event: any) { let sheet = this.spread.getActiveSheetTab(); sheet.expandGroup("year", $event.currentTarget.checked); } expandGroupByMonthCallback($event: any) { let sheet = this.spread.getActiveSheetTab(); sheet.expandGroup("month", $event.currentTarget.checked); } } @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/airline_delay_causes.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-spread-sheets> <div id="optionContainer" class="optionContainer"> <div> <input type="button" value="Group" id="groupButton" (click)="groupCallback()" /> <input type="button" value="RemoveGroup" id="removeGroupButton" (click)="removeGroupCallback()" /> </div> <div> <label> <input type="checkbox" id="detailColumnsVisibleCheckbox" (change)="detailColumnsVisibleCallback($event)" />Detail Columns Visible </label> </div> <div> <label> Group Outline Position <select id="groupOutlinePositionSelect" (change)="groupOutlinePositionCallback($event)"> <option value="0">none</option> <option value="1" selected>groupCell</option> <option value="2">rowHeader</option> <option value="3">groupCellAll</option> </select> </label> </div> <div> <label> <input type="checkbox" checked class="expandGroupCheckbox" group-field="carrier_name" (change)="expandGroupByCarrierNameCallback($event)" />Expand/Collapse "Carrier Name" </label> </div> <div> <label> <input type="checkbox" checked class="expandGroupCheckbox" group-field="year" (change)="expandGroupByYearCallback($event)" />Expand/Collapse "Year" </label> </div> <div> <label> <input type="checkbox" class="expandGroupCheckbox" group-field="month" (change)="expandGroupByMonthCallback($event)" />Expand/Collapse "Month" </label> </div> </div> </div>
.sample-tutorial { position: relative; height: 100%; overflow: hidden; } body { position: absolute; top: 0; bottom: 0; left: 0; right: 0; } .optionContainer { float: right; width: 280px; } .optionContainer input { margin-right: 5px; } .optionContainer div { margin: 10px; } label { font-size: 13.3px; }
(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-tablesheet': 'npm:@mescius/spread-sheets-tablesheet/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);