Pivot Options

SpreadJS provides many different options to customize the appearance and functionality of the PivotTables per your application's needs. Edit the different options below then scroll down and press the Apply button to see the results.

Description
app.vue
index.html
Copy to CodeMine

You can configure the PivotTable with different parameters:

    let option = {
        allowMultipleFiltersPerField: true,
        insertBlankLineAfterEachItem: true,
        grandTotalPosition: GC.Spread.Pivot.GrandTotalPosition.row,
        subtotalsPosition: GC.Spread.Pivot.SubTotalsPosition.top,
        displayFieldsInPageFilterArea: GC.Spread.Pivot.DisplayFields.downThenOver,
        reportFilterFieldsPerColumn: 1,
        bandRows:true,
        bandColumns: true,
        showRowHeader: true,
        showColumnHeader: true,
        showDrill: true,
        showMissing: true,
        showToolTip: true,
        missingCaption: 'something',
        fillDownLabels: false,
        repeatAllItemLabels: false,
        rowLabelIndent: 4,
        mergeItem: false,
        showHeaders: true
    };
    let pivotTable = sheet.pivotTables.add("PivotTable", table.name(), 0, 0, GC.Spread.Pivot.PivotTableLayoutType.outline, GC.Spread.Pivot.PivotTableThemes.medium2, option);

These parameters that can be used for PivotTable are as follows:

  • allowMultipleFiltersPerField: whether multiple filters can be used in one field.
  • insertBlankLineAfterEachItem: whether a blank row should be inserted at end of each item.
  • grandTotalPosition: show the grandtotal in the row, column or both.
  • subtotalsPosition: show subtotal top, bottom, or not.
  • displayFieldsInPageFilterArea: display the page area fields first over then down or first down then over
  • reportFilterFieldsPerColumn: the number of report filter fields per column
  • bandRows: show banded rows or not
  • bandColumns: show banded columns or not
  • showRowHeader: show row header styles or not
  • showColumnHeader: show column header styles or not
  • showDrill: show expand/collapse button or not
  • showMissing: show missing caption or not
  • showToolTip: show tool tip or not
  • missingCaption: replace empty cell in content area to custom string or number
  • fillDownLabels: show repeat label items or not
  • repeatAllItemLabels: show repeat label items or not
  • rowLabelIndent: set the indent of each level of title in compact layout
  • mergeItem: merge and center cells with labels
  • showHeaders: show row and column headers or not
You can configure the PivotTable with different parameters: These parameters that can be used for PivotTable are as follows: allowMultipleFiltersPerField: whether multiple filters can be used in one field. insertBlankLineAfterEachItem: whether a blank row should be inserted at end of each item. grandTotalPosition: show the grandtotal in the row, column or both. subtotalsPosition: show subtotal top, bottom, or not. displayFieldsInPageFilterArea: display the page area fields first over then down or first down then over reportFilterFieldsPerColumn: the number of report filter fields per column bandRows: show banded rows or not bandColumns: show banded columns or not showRowHeader: show row header styles or not showColumnHeader: show column header styles or not showDrill: show expand/collapse button or not showMissing: show missing caption or not showToolTip: show tool tip or not missingCaption: replace empty cell in content area to custom string or number fillDownLabels: show repeat label items or not repeatAllItemLabels: show repeat label items or not rowLabelIndent: set the indent of each level of title in compact layout mergeItem: merge and center cells with labels showHeaders: show row and column headers or not
<template> <div class="sample-tutorial"> <gc-spread-sheets class="sample-spreadsheets" @workbookInitialized="initSpread"> </gc-spread-sheets> <div id="container" class="options-container"> <div class="option-item"> <label><b>Pivot Options</b></label> </div> <hr> <div class='option-item' v-for="item in items" :key="item.id"> <input type="checkbox" :name='item.name' class="select-option" v-model.lazy='item.checked'/> <label :for='item.id'>{{item.text}}</label> </div> <hr> <div> <div class="select-option-class">Grand Total Position:</div> <select name="" id="grandTotalPosition" class="grandTotalPosition select-option-select" v-model.number="grandTotalPosition"> <option value = 3>both</option> <option value = 0>none</option> <option value = 1>row</option> <option value = 2>col</option> </select> </div> <div> <div class="select-option-class">Subtotals Position:</div> <select id="subtotalsPosition" class="subtotalsPosition select-option-select" v-model.number="subtotalsPosition"> <option value = 2>bottom</option> <option value = 0>none</option> <option value = 1>top</option> </select> </div> <div> <div class="select-option-class">Display Fields In Page Filter Area:</div> <select id="displayFieldsInPageFilterArea" class="displayFieldsInPageFilterArea select-option-select" v-model.number="displayFieldsInPageFilterArea"> <option value = 1>overThenDown</option> <option value = 0>downThenOver</option> </select> </div> <div> <div class="select-option-class">PivotTable Layout:</div> <select id="pivotTableLayout" class="pivotTableLayout select-option-select" v-model.number="pivotTableLayout"> <option value = 0>Compact</option> <option value = 1>Outline</option> <option value = 2>Tabular</option> </select> </div> <div> <div class="select-option-class">Show Empty Value In Content Area As:</div> <input type="text" id="missingCaption" class="missingCaption select-option-select" v-model="missingCaption"/> </div> <div> <div class="select-option-class">Set Row Label Indent In Compact Layout:</div> <input type="number" id="rowLabelIndent" class="rowLabelIndent select-option-select" v-model.number="rowLabelIndent"/> </div> <div> <label for="reportFilterFieldsPerColumn">Report Filter Fields Per Column:</label> <input type="number" value="1" id="reportFilterFieldsPerColumn" min="1" v-model="reportFilterFieldsPerColumn"/> </div> <input type="button" value="Apply" class="set-option" id="set-option" @click="updatePivotOption"/> </div> </div> </template> <script> import GC from "@mescius/spread-sheets"; import "@mescius/spread-sheets-shapes"; import "@mescius/spread-sheets-vue"; import { shallowRef } from "vue"; import "@mescius/spread-sheets-pivot-addon"; export default { name: 'App', setup() { const spreadRef = shallowRef(null); const items = shallowRef([{ id:"allowMultipleFiltersPerField", name:"allowMultipleFiltersPerField", text:"Allow Multiple Filters Per Field", checked:false },{ id:"insertBlankLineAfterEachItem", name:"insertBlankLineAfterEachItem", text:"Insert Blank Line After Each Item", checked:false },{ id:"fillDownLabels", name:"fillDownLabels", text:"Fill Down Labels", checked:false },{ id:"bandRows", name:"bandRows", text:"Band Rows", checked:true },{ id:"bandColumns", name:"bandColumns", text:"Band Columns", checked:true },{ id:"showRowHeader", name:"showRowHeader", text:"Show Row Header", checked:true },{ id:"showColumnHeader", name:"showColumnHeader", text:"Show Column Header", checked:true },{ id:"showDrill", name:"showDrill", text:"Show Drill", checked:true },{ id:"showFilter", name:"showFilter", text:"show Filter", checked:true },{ id:"showMissing", name:"showMissing", text:"Show Missing", checked:true },{ id:"showToolTip", name:"showToolTip", text:"show ToolTip", checked:true },{ id:"mergeItem", name:"mergeItem", text:"Merge Item", checked:false },{ id:"showHeaders", name:"showHeaders", text:"showHeaders", checked:true }]); const grandTotalPosition = shallowRef(3); const subtotalsPosition = shallowRef(2); const displayFieldsInPageFilterArea = shallowRef(1); const missingCaption = shallowRef(""); const rowLabelIndent = shallowRef(0); const pivotTableLayout = shallowRef(1); const reportFilterFieldsPerColumn = shallowRef(1); function initSpread(spread) { spreadRef.value = spread; spread.suspendPaint(); spread.setSheetCount(2); let sheet1 = spread.getSheet(0); let sheet2 = spread.getSheet(1); let tableName = getDataSource(sheet2, pivotSales); initPivotTable(sheet1, tableName); spread.resumePaint(); } function getDataSource(sheet, tableSource) { 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(); } function initPivotTable(sheet, tableName) { sheet.name("PivotTable"); sheet.setRowCount(1000); let option = { bandRows:true, bandColumns:true }; let pivotTable = sheet.pivotTables.add("pivotTable", tableName, 1, 1, GC.Spread.Pivot.PivotTableLayoutType.outline, GC.Spread.Pivot.PivotTableThemes.medium8,option); pivotTable.suspendLayout(); pivotTable.add("quantity", "Quantity", GC.Spread.Pivot.PivotTableFieldType.filterField); pivotTable.add("price", "Price", GC.Spread.Pivot.PivotTableFieldType.filterField); 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("total", "Totals", GC.Spread.Pivot.PivotTableFieldType.valueField, GC.Pivot.SubtotalType.sum); let style = new GC.Spread.Sheets.Style(); style.formatter = "$ #,##0"; pivotTable.setStyle({dataOnly: true}, style); pivotTable.resumeLayout(); pivotTable.autoFitColumn(); } function updatePivotOption () { let spread = spreadRef.value; spread.suspendPaint(); let pivotTable = spread.getActiveSheet().pivotTables.get("pivotTable"); pivotTable.suspendLayout(); let option = pivotTable.options; let optionValue = items.value; for (let i = 0; i < optionValue.length; i++) { option[optionValue[i].name] = optionValue[i].checked; } option["grandTotalPosition"] = grandTotalPosition.value; option["subtotalsPosition"] = subtotalsPosition.value; option["displayFieldsInPageFilterArea"] = displayFieldsInPageFilterArea.value; option["reportFilterFieldsPerColumn"] = reportFilterFieldsPerColumn.value; if (!isNaN(parseFloat(missingCaption.value))) { option["missingCaption"] = parseFloat(missingCaption.value); } else { option["missingCaption"] = missingCaption.value; } if (!isNaN(parseFloat(rowLabelIndent.value))) { option["rowLabelIndent"] = parseFloat(rowLabelIndent.value); } pivotTable.layoutType(+pivotTableLayout.value); pivotTable.resumeLayout(); spread.resumePaint(); } return { initSpread, items, grandTotalPosition, subtotalsPosition, displayFieldsInPageFilterArea, missingCaption, rowLabelIndent, pivotTableLayout, reportFilterFieldsPerColumn, updatePivotOption } } } </script> <style scoped> #app { height: 100%; } .sample-tutorial { position: relative; height: 100%; overflow: hidden; } .sample-spreadsheets { width: calc(100% - 300px); height: 100%; overflow: hidden; float: left; } .options-container { float: right; width: 300px; padding: 12px; height: 100%; box-sizing: border-box; background: #fbfbfb; overflow: auto; font-size: 14px; } body { position: absolute; top: 0; bottom: 0; left: 0; right: 0; } .set-option { display: block; margin-top: 20px; width: 250px; } #reportFilterFieldsPerColumn { width: 28px; } .select-option-class{ display: block; margin-top: 20px; margin-bottom: 10px } .select-option-select{ width: 250px; display: block; margin-bottom: 20px; } .option-item{ height: 20px; margin-bottom: 10px; } </style>
<!DOCTYPE html> <html style="height:100%;font-size:14px;"> <head> <meta charset="utf-8" /> <meta http-equiv="X-UA-Compatible" content="IE=edge" /> <title>SpreadJS VUE</title> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <link rel="stylesheet" type="text/css" href="$DEMOROOT$/en/vue3/node_modules/@mescius/spread-sheets/styles/gc.spread.sheets.excel2013white.css"> <script src="$DEMOROOT$/spread/source/data/pivot-data.js" type="text/javascript"></script> <script src="$DEMOROOT$/en/vue3/node_modules/systemjs/dist/system.src.js"></script> <script src="./systemjs.config.js"></script> <script src="./compiler.js" type="module"></script> <script> var System = SystemJS; System.import("./src/app.js"); System.import('$DEMOROOT$/en/lib/vue3/license.js'); </script> </head> <body> <div id="app"></div> </body> </html>
(function (global) { SystemJS.config({ transpiler: 'plugin-babel', babelOptions: { es2015: true }, paths: { // paths serve as alias 'npm:': 'node_modules/' }, packageConfigPaths: [ '../node_modules/*/package.json', "../node_modules/@mescius/*/package.json", "../node_modules/@babel/*/package.json", "../node_modules/@vue/*/package.json" ], map: { 'vue': "npm:vue/dist/vue.esm-browser.js", 'tiny-emitter': 'npm:tiny-emitter/index.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-resources-en': 'npm:@mescius/spread-sheets-resources-en/index.js', '@mescius/spread-sheets-vue': 'npm:@mescius/spread-sheets-vue/index.js', '@mescius/spread-sheets-pivot-addon': 'npm:@mescius/spread-sheets-pivot-addon/index.js', '@mescius/spread-sheets-shapes': 'npm:@mescius/spread-sheets-shapes/index.js' }, meta: { '*.css': { loader: 'systemjs-plugin-css' }, '*.vue': { loader: "../plugin-vue/index.js" } } }); })(this);