Pivot Table Show Data As

You can show the PivotTable data using different types of calculation values with the showDataAs method. For example, instead of showing the actual currency value, you could display the data as a percentage of the parent or grand total. Select the different options below to see some of the available calculations.

Description
app.vue
index.html
Copy to CodeMine

SpreadJS PivotTables provide the ShowDataAs API to quickly present values in different ways.

There are 14 kinds of ShowDataAs options are available.

Show Data As name Enum Value Show Data As Info Required Properties
No Calculation normal showDataAs
% of Grand Total percentOfTotal showDataAs
% of Column Total percentOfRow showDataAs
% of Row Total percentOfCol showDataAs
% Of percent showDataAs, baseFieldName, baseFieldItemType, baseFieldItem?
% of Parent Row Total percentOfParentRow showDataAs
% of Parent Column Total percentOfParentCol showDataAs
% of Parent Total percentOfParent showDataAs, baseFieldName
Difference From difference showDataAs, baseFieldName, baseFieldItemType, baseFieldItem?
% Difference From percentDiff showDataAs, baseFieldName, baseFieldItemType, baseFieldItem?
Running Total in runTotal showDataAs, baseFieldName
% Running Total in percentOfRunningTotal showDataAs, baseFieldName
Rank Smallest to Largest rankAscending showDataAs, baseFieldName
Rank Largest to Smallest rankDescending showDataAs, baseFieldName
Index index showDataAs

Sample:

    pivotTable.showDataAs("Sum of amount", { showDataAs: GC.Pivot.PivotShowDataAs.difference, baseFieldName: "Years" });
SpreadJS PivotTables provide the ShowDataAs API to quickly present values in different ways. There are 14 kinds of ShowDataAs options are available. Show Data As name Enum Value Show Data As Info Required Properties No Calculation normal showDataAs % of Grand Total percentOfTotal showDataAs % of Column Total percentOfRow showDataAs % of Row Total percentOfCol showDataAs % Of percent showDataAs, baseFieldName, baseFieldItemType, baseFieldItem? % of Parent Row Total percentOfParentRow showDataAs % of Parent Column Total percentOfParentCol showDataAs % of Parent Total percentOfParent showDataAs, baseFieldName Difference From difference showDataAs, baseFieldName, baseFieldItemType, baseFieldItem? % Difference From percentDiff showDataAs, baseFieldName, baseFieldItemType, baseFieldItem? Running Total in runTotal showDataAs, baseFieldName % Running Total in percentOfRunningTotal showDataAs, baseFieldName Rank Smallest to Largest rankAscending showDataAs, baseFieldName Rank Largest to Smallest rankDescending showDataAs, baseFieldName Index index showDataAs Sample:
<template> <div class='sample-tutorial'> <gc-spread-sheets class="sample-spreadsheets" @workbookInitialized="initSpread"> <gc-worksheet> </gc-worksheet> <gc-worksheet> </gc-worksheet> </gc-spread-sheets> <div class="options-container"> <div class="option-row"> <label>ShowValueAs:</label> <select id="showValueAs" v-model="showValueAsValueRef" @change="showValueAsHandle"> <option value='0'>No Calculation</option> <option value='1'>% of Grand Total</option> <option value='2'>% of Column Total</option> <option value='3'>% of Row Total</option> <option value='4'>% Of ...</option> <option value='5'>% of Parent Row Total</option> <option value='6'>% of Parent Column Total</option> <option value='7'>% of Parent Total ...</option> <option value='8'>Difference From ...</option> <option value='9'>% Of Difference From ...</option> <option value='10'>Running Total In ...</option> <option value='11'>% Running Total In ...</option> <option value='12'>Rank Smallest to Largest ...</option> <option value='13'>Rank Largest to Smallest ...</option> <option value='14'>Index</option> </select> </div> <div class="option-row" v-if="showBaseFieldRef"> <label style="padding: 5px, marginTop: 10px" id="showValueAsDialogLabel" v-bind:value="baseFieldLabel">{{baseFieldLabel}}</label> <select v-model="showValueAsBaseFieldValueRef" @change="baseFieldListHandle"> <option v-for="(item, index) in baseFieldListRef" v-bind:key="item.fieldName" v-bind:value="index">{{item.fieldName}}</option> </select> </div> <div class="option-row" v-if="showBaseItemRef"> <label id="showValueAsBaseItemLabel">Base Item:</label> <select v-model="showValueAsBaseItemValueRef"> <option v-for="(item, index) in baseItemListRef" v-bind:key="item" v-bind:value="index">{{item}}</option> </select> </div> <div class="option-row"> <input type="button" value="Apply Setting" id="applySetting" @click="applySettingHandle" /> </div> </div> </div> </template> <script setup> 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"; let spreadRef = shallowRef(null); let ptRef = shallowRef(null); let showValueAsBaseFieldValueRef = shallowRef("0"); let baseFieldListRef = shallowRef([]); let showBaseFieldRef = shallowRef(false); let showBaseItemRef = shallowRef(false); let baseItemListRef = shallowRef([]); let baseFieldLabelRef = shallowRef("Calculation: "); let showValueAsValueRef = shallowRef("0"); let showValueAsBaseItemValueRef = shallowRef("0"); function initSpread (spread) { spread.suspendPaint(); spreadRef.value = spread; let sheet1 = spread.getSheet(0); let sheet2 = spread.getSheet(1); let tableName = getDataSource(sheet2, pivotSales); let pivotTable = initPivotTable(sheet1, tableName); ptRef.value = pivotTable; spread.resumePaint(); return pivotTable; } 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, source) { sheet.name("ShowDataAs"); sheet.setRowCount(1000); let option = { showRowHeader:true, showColumnHeader:true, bandRows:true, bandColumns:true }; let pivotTable = sheet.pivotTables.add("pivotTable", source, 1, 1, GC.Spread.Pivot.PivotTableLayoutType.outline, GC.Spread.Pivot.PivotTableThemes.medium8,option); 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("total", "Totals", GC.Spread.Pivot.PivotTableFieldType.valueField, GC.Pivot.SubtotalType.sum); pivotTable.resumeLayout(); pivotTable.autoFitColumn(); return pivotTable; } function showValueAsHandle (e) { showBaseFieldRef.value = false; showBaseItemRef.value = false; baseFieldLabelRef.value = "Calculation: "; let selectIndex = e.target.value; showValueAsValueRef.value = selectIndex; if (["4", "7", "8", "9", "10", "11", "12", "13"].indexOf(selectIndex) > -1) { showBaseFieldRef.value = true; let baseField = [...ptRef.value.getFieldsByArea(1), ...ptRef.value.getFieldsByArea(2)]; baseFieldLabelRef.value = ("Calculation: " + e.target.selectedOptions[0].text); baseFieldListRef.value = baseField; if (["4", "8", "9"].indexOf(selectIndex) > -1) { showBaseItemRef.value = true; let text = baseField[parseInt(showValueAsBaseFieldValueRef.value)].fieldName; let baseItems = [...ptRef.value.getItemsByField(text)]; baseItems.unshift("next"); baseItems.unshift("previous"); baseItemListRef.value = baseItems; } } } function applyShowDataAsStyle(pivotTable, fieldName, showValueAsType) { let style, valueFieldArea = { dataOnly: true, references: [{ fieldName: "Values", items: [fieldName] }] }; style = pivotTable.getStyle(valueFieldArea); if (!style) { style = new GC.Spread.Sheets.Style(); } let needApplyStyle = [GC.Pivot.PivotShowDataAs.percentOfTotal, GC.Pivot.PivotShowDataAs.percentOfRow, GC.Pivot.PivotShowDataAs.percentOfCol, GC.Pivot.PivotShowDataAs.percent, GC.Pivot.PivotShowDataAs.percentOfParentRow, GC.Pivot.PivotShowDataAs.percentOfParentCol, GC.Pivot.PivotShowDataAs.percentOfParent, GC.Pivot.PivotShowDataAs.percentDiff, GC.Pivot.PivotShowDataAs.percentOfRunningTotal ].indexOf(showValueAsType) > -1; if (needApplyStyle) { style.formatter = "0.00%"; } else { style = null; } pivotTable.setStyle(valueFieldArea, style); } function applySettingHandle () { let showValueAsValue = parseInt(showValueAsValueRef.value, 10); let valueFieldName = ptRef.value.getFieldsByArea(3)[0].fieldName; if (showBaseFieldRef.value && showBaseItemRef.value) { let fileName = baseFieldListRef.value[parseInt(showValueAsBaseFieldValueRef.value)].fieldName; let baseFieldItem = baseItemListRef.value[parseInt(showValueAsBaseItemValueRef.value)]; if (showValueAsBaseItemValueRef.value === "0") { ptRef.value.showDataAs(valueFieldName, { showDataAs: showValueAsValue, baseFieldName: fileName, baseFieldItemType: 2 }); } else if (showValueAsBaseItemValueRef.value === "1") { ptRef.value.showDataAs(valueFieldName, { showDataAs: showValueAsValue, baseFieldName: fileName, baseFieldItemType: 1 }); } else { ptRef.value.showDataAs(valueFieldName, { showDataAs: showValueAsValue, baseFieldName: fileName, baseFieldItemType: 0, baseFieldItem: baseFieldItem }); } } else if (showBaseFieldRef.value) { let fileName = baseFieldListRef.value[parseInt(showValueAsBaseFieldValueRef.value)].fieldName; ptRef.value.showDataAs(valueFieldName, { showDataAs: showValueAsValue, baseFieldName: fileName }); } else { ptRef.value.showDataAs(valueFieldName, { showDataAs: showValueAsValue }); } applyShowDataAsStyle(ptRef.value, valueFieldName, showValueAsValue); } function baseFieldListHandle (e) { let text = baseFieldListRef.value[parseInt(showValueAsBaseFieldValueRef.value)].fieldName; let baseItems = [...ptRef.value.getItemsByField(text)]; baseItems.unshift("next"); baseItems.unshift("previous"); baseItemListRef.value = baseItems; } </script> <style scoped> .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; } .option-row { font-size: 14px; padding: 5px; margin-top: 10px; } p{ padding:2px 10px; background-color:#F4F8EB; } input, select { width: 100%; padding: 4px 6px; box-sizing: border-box; } label { display:block; margin-bottom: 6px; } input[type="checkbox"], input[type="radio"] { display: inline-block; width: auto; } input[type="checkbox"]+label, input[type="radio"]+label { display: inline-block; } input[type="button"] { display: block; margin: 0 0 6px; } body { position: absolute; top: 0; bottom: 0; left: 0; right: 0; } #app { height: 100%; } </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);