PivotTable Filter

SpreadJS PivotTables support Label Filters, and Value Filters. These functions can be used to filter data. Different filters can be set to obtain the required data.

You can set different filters to get the data that you need. The user can set a filter as follows: You can use the Label Filter as follows: You can use the Value Filter as follows: SpreadJS PivotTable supports five conditions: For date filter operator, we also support month to date and quarter to date. conType: Used to describe the type of condition operator: Used to describe the operate type of filter; setting up an operator corresponds to the type of conType SpreadJS PivotTables support two filters, and users can set filters using the following two data types, for example:
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 { FormsModule } from '@angular/forms'; 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 { autoGenerateColumns = false; autoMergeMode = GC.Spread.Sheets.AutoMerge.AutoMergeMode.restricted; autoMergeSelectionMode = GC.Spread.Sheets.AutoMerge.SelectionMode.merged; dataSource: any[]; spread: GC.Spread.Sheets.Workbook; hostStyle = { width: 'calc(100% - 280px)', height: '100%', overflow: 'hidden', float: 'left' }; pivotTable:any; labelFilter = 1; label1:string = ""; label2:string = ""; valueFilter = 1; value1: number; value2: number; constructor() { } initSpread($Event: any) { let spread = $Event.spread; this.spread = spread; spread.suspendPaint(); spread.setSheetCount(2); let sheet1 = spread.getSheet(0); let sheet2 = spread.getSheet(1); let tableName = this.getSource(sheet2, pivotSales); let pivotTable = this.addPivotTable(sheet1, tableName); this.pivotTable = pivotTable; spread.resumePaint(); } getSource(sheet: GC.Spread.Sheets.Workbook, tableSource: any) { 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('table', 0, 0, 117, 6); for(let i=2;i<=117;i++) { sheet.setFormula(i-1,5,'=D'+i+'*E'+i) } table.style(GC.Spread.Sheets.Tables.TableThemes["none"]); sheet.setArray(0, 0, tableSource); return table.name(); } clearLabelFilter () { let spread = this.spread; let pivotTable = this.pivotTable; spread.suspendPaint(); this.label1 = ""; this.label2 = ""; this.labelFilter = 1; pivotTable.labelFilter("Salesperson", null); spread.resumePaint(); } clearValueFilter () { let spread = this.spread; let pivotTable = this.pivotTable; spread.suspendPaint(); this.value1 = null; this.value2 = null; this.valueFilter = 1; pivotTable.valueFilter("Salesperson", null); spread.resumePaint(); } setLabelFilter () { let spread = this.spread; let pivotTable = this.pivotTable; spread.suspendPaint(); let labelType = +this.labelFilter, labelFilterValue1 = this.label1, labelFilterValue2 = this.label2; if (labelType) { if (labelType < 13) { labelFilterValue2 = null; } pivotTable.labelFilter("Salesperson", { condition: { conType: GC.Pivot.PivotConditionType.caption, val: [labelFilterValue1, labelFilterValue2], operator: labelType - 1 } }); } else { pivotTable.labelFilter("Salesperson", null); } spread.resumePaint(); } setValueFilter () { let spread = this.spread; let pivotTable = this.pivotTable; spread.suspendPaint(); let valueType= +this.valueFilter, valueFilterValue1 = +this.value1, valueFilterValue2 = +this.value2; if (valueType) { if (valueType < 7) { valueFilterValue2 = null; } pivotTable.valueFilter("Salesperson", { condition: { conType: GC.Pivot.PivotConditionType.value, val: [valueFilterValue1, valueFilterValue2], operator: valueType - 1 }, conditionByName: "Quantity" }); } else { pivotTable.valueFilter("Salesperson", null); } spread.resumePaint(); } addPivotTable(sheet: GC.Spread.Sheets.Workbook, source: any) { sheet.suspendPaint(); sheet.name("PivotTable"); sheet.setRowCount(10000); let pivotTable = sheet.pivotTables.add("PivotTable", source, 1, 1, GC.Spread.Pivot.PivotTableLayoutType.outline, GC.Spread.Pivot.PivotTableThemes.light8); pivotTable.suspendLayout(); pivotTable.add("salesperson", "Salesperson", GC.Spread.Pivot.PivotTableFieldType.rowField); pivotTable.add("car", "Cars", GC.Spread.Pivot.PivotTableFieldType.rowField); let groupInfo = { originFieldName: "date", dateGroups: [{ by: GC.Pivot.DateGroupType.quarters }] }; pivotTable.group(groupInfo); pivotTable.add("Quarters (date)", "Quarters (date)", GC.Spread.Pivot.PivotTableFieldType.columnField); pivotTable.add("quantity", "Quantity", GC.Spread.Pivot.PivotTableFieldType.valueField, GC.Pivot.SubtotalType.sum); pivotTable.resumeLayout(); sheet.resumePaint(); pivotTable.autoFitColumn(); return pivotTable; } } @NgModule({ imports: [BrowserModule, SpreadSheetsModule, FormsModule], 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-spread-sheets> <div class="options-container"> <div class="whole-field">The following operations all work on <b>Salesperson</b> Field:</div> <hr /> <div>Label Filter:</div> <div class="pivottable-filter label-filter"> <select name="labelFilter" id="labelFilter" class="pivot-filter" [(ngModel)]="labelFilter"> <option value="1">equalsTo</option> <option value="2">notEqualsTo</option> <option value="3">beginsWith</option> <option value="4">doesNotBeginWith</option> <option value="5">endsWith</option> <option value="6">doesNotEndWith</option> <option value="7">contains</option> <option value="8">doesNotContain</option> <option value="9">greaterThan</option> <option value="10">greaterThanOrEqualsTo</option> <option value="11">lessThan</option> <option value="12">lessThanOrEqualsTo</option> <option value="13">between</option> <option value="14">notBetween</option> </select> <input type="text" class="label-filter-input filter-input" id="label-val1" placeholder = "value1" [(ngModel)]="label1"> <input type="text" class="label-filter-input filter-input" id="label-val2" placeholder = "value2" [(ngModel)]="label2"> </div> <input type="button" class="set-label-filter set-filter" id="set-label-filter" value="Set Label Filter" (click)="setLabelFilter()"> <br /> <input type="button" class="set-label-filter set-filter" id="clear-label-filter" value="Clear Label Filter" (click)="clearLabelFilter()"> <br /> <hr /> <div class="value-filter-label">Value Filter (Salesperson Grand Total):</div> <div class="pivottable-filter value-filter"> <select name="valueFilter" id="valueFilter" class="pivot-filter" [(ngModel)]="valueFilter"> <option value="0">clearFilter</option> <option value="1">equalsTo</option> <option value="2">notEqualsTo</option> <option value="3">greaterThan</option> <option value="4">greaterThanOrEqualsTo</option> <option value="5">lessThan</option> <option value="6">lessThanOrEqualsTo</option> <option value="7">between</option> <option value="8">notBetween</option> </select> <input type="text" class="value-filter-input filter-input" id="value-val1" placeholder = "value1" [(ngModel)]="value1"> <input type="text" class="value-filter-input filter-input" id="value-val2" placeholder = "value2" [(ngModel)]="value2"> </div> <input type="button" class="set-value-filter set-filter" id="set-value-filter" value="Set Value Filter" (click)="setValueFilter()"> <br /> <input type="button" class="set-value-filter set-filter" id="clear-value-filter" value="Clear Value Filter" (click)="clearValueFilter()"> <br /> </div> </div>
.sample-tutorial { position: relative; height: 100%; overflow: hidden; } .sample-spreadsheets { width: calc(100% - 280px); height: 100%; overflow: hidden; float: left; } .options-container { float: right; width: 280px; padding: 12px; height: 100%; box-sizing: border-box; background: #fbfbfb; overflow: auto; } .pivottable-filter{ height: 100px; } .pivot-filter{ width: 200px; height: 25px; display: block; margin-bottom: 10px; float: left; } .filter-input{ width: 200px; height: 20px; display: block; /* margin-left: 15px; */ margin-top: 10px; } .set-filter{ width: 200px; margin-top: 20px; /* float: right; */ } .value-filter-label{ margin-top: 25px; } .sort-type{ width: 200px; margin-top: 25px; display: block; } .sort{ width: 200px; margin-top: 10px; display: block; } body { position: absolute; top: 0; bottom: 0; left: 0; right: 0; } .whole-field{ margin-bottom: 10px; }
(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);