PivotTable Format Labels

SpreadJS PivotTables support custom formats in pivot field labels.

Description
app.vue
index.html
styles.css
Copy to CodeMine

You can format fields using the Pivot Table Number Format Dialog, which can help you set pivot table styles without API.

For example, in PivotTable.setStyle(), you should first construct the PivotArea of the Field you want to set:

// example for label fields
var area1 = {
    labelOnly: true,
    fieldName: "Cars"
};
// example for value fields
var area2 = {
    dataOnly: true
    references: [
        {
            fieldName: "Values",
            items: ["Totals"]
        }
    ]
};
var style1 = new GC.Spread.Sheets.Style();
style1.formatter = "[red]@";
var style2 = new GC.Spread.Sheets.Style();
style2.formatter = "0.00";
var sheet = GC.Spread.Sheets.findControl('ss').getActiveSheet()
var pivotTable = sheet.pivotTables.all()[0];
pivotTable.setStyle(area1, style1);
pivotTable.setStyle(area2, style2);

You can then use the format dialog in the field setting dialog. You only need to set a format string like "0.00".

You can format fields using the Pivot Table Number Format Dialog, which can help you set pivot table styles without API. For example, in PivotTable.setStyle(), you should first construct the PivotArea of the Field you want to set: You can then use the format dialog in the field setting dialog. You only need to set a format string like "0.00".
<template> <div class="sample-tutorial"> <gc-spread-sheets class="sample-spreadsheets" @workbookInitialized="initSpread" > </gc-spread-sheets> <div class="options-container"> <div>Field Name:</div> <select name="fieldName" id="fieldName" class="field-name" v-model="fieldName" @change="changeFormatter" > <option value="Salesperson" selected>Salesperson</option> <option value="Cars">Cars</option> <option value="Quarters (date)">Date</option> <option value="Quantity">Quantity</option> </select> <div>Formatter:</div> <input type="text" class="label-filter-input filter-input" id="formatter" v-model="formatter" /> <input type="button" class="format-button" value="Set" id="set" @click="setFormatter" /> <input type="button" class="format-button" value="Reset" id="reset" @click="resetFormatter" /> </div> </div> </template> <script> import Vue from "vue"; import "@mescius/spread-sheets-vue"; import GC from "@mescius/spread-sheets"; import "@mescius/spread-sheets-shapes"; import "@mescius/spread-sheets-pivot-addon"; import "./styles.css"; let App = Vue.extend({ name: "app", data: function () { return { spread: null, pivotTable: null, fieldName: "Salesperson", formatter: "", }; }, methods: { initSpread: function (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: function (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(); }, addPivotTable: function (sheet, source) { 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 ); let carsStyle = new GC.Spread.Sheets.Style(); carsStyle.formatter = "[red]@"; let valueStyle = new GC.Spread.Sheets.Style(); valueStyle.formatter = "#0.00"; pivotTable.setStyle(this.initArea("Cars", pivotTable), carsStyle); pivotTable.setStyle(this.initArea("Quantity", pivotTable), valueStyle); pivotTable.resumeLayout(); sheet.resumePaint(); pivotTable.autoFitColumn(); return pivotTable; }, initArea: function (fieldName, pt) { let fieldArea = pt.getField(fieldName).pivotArea; if (fieldArea === 1 || fieldArea === 2) { return { labelOnly: true, references: [ { fieldName, }, ], }; } else if (fieldArea === 3) { return { dataOnly: true, references: [ { fieldName: "Values", items: [fieldName], }, ], }; } }, setFormatter() { let area = this.initArea(this.fieldName, this.pivotTable); let style = this.pivotTable.getStyle(area) || new GC.Spread.Sheets.Style(); style.formatter = this.formatter; this.pivotTable.setStyle(area, style); }, resetFormatter() { let area = this.initArea(this.fieldName, this.pivotTable); let style = this.pivotTable.getStyle(area); let formatter = (style && style.formatter) || ""; this.formatter = formatter; }, changeFormatter (e) { let area = this.initArea(e.target.value, this.pivotTable); let style = this.pivotTable.getStyle(area); this.formatter = style && style.formatter ? style.formatter : ""; }, bindEvent: function (pivotTable, spread) { document .getElementById("set-label-filter") .addEventListener("click", function (e) { spread.suspendPaint(); let labelType, labelFilterValue1, labelFilterValue2; let labelNode = document.getElementById("labelFilter"); labelType = labelNode.selectedIndex; if (labelType) { labelFilterValue1 = document.getElementById("label-val1").value; labelFilterValue2 = document.getElementById("label-val2").value; 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(); }); document .getElementById("set-value-filter") .addEventListener("click", function (e) { spread.suspendPaint(); let valueType, valueFilterValue1, valueFilterValue2; let valueNode = document.getElementById("valueFilter"); valueType = valueNode.selectedIndex; if (valueType) { valueFilterValue1 = document.getElementById("value-val1").value; valueFilterValue2 = document.getElementById("value-val2").value; 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(); }); document .getElementById("sort-type") .addEventListener("click", function (e) { spread.suspendPaint(); if (e.target.classList.contains("sort-asc")) { pivotTable.sort("Salesperson", { sortType: GC.Pivot.SortType.asc }); } else { pivotTable.sort("Salesperson", { sortType: GC.Pivot.SortType.desc, }); } spread.resumePaint(); }); }, }, computed: { dataSource() { return getData(); }, }, }); new Vue({ render: (h) => h(App) }).$mount("#app"); </script>
<!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/vue/node_modules/@mescius/spread-sheets/styles/gc.spread.sheets.excel2013white.css"> <script src="$DEMOROOT$/spread/source/data/pivot-data.js" type="text/javascript"></script> <!-- SystemJS --> <script src="$DEMOROOT$/en/vue/node_modules/systemjs/dist/system.src.js"></script> <script src="systemjs.config.js"></script> <script> System.import('./src/app.vue'); System.import('$DEMOROOT$/en/lib/vue/license.js'); </script> </head> <body> <div id="app"></div> </body> </html>
.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; } .filter-input { width: 200px; height: 20px; display: block; /* margin-left: 15px; */ margin-top: 10px; } .format-button { width: 45%; margin-top: 20px; /* float: right; */ display: inline-block; } .field-name { width: 200px; height: 25px; display: block; margin-bottom: 10px; float: left; } body { position: absolute; top: 0; bottom: 0; left: 0; right: 0; } .whole-field { margin-bottom: 10px; }
(function (global) { System.config({ transpiler: 'plugin-babel', babelOptions: { es2015: true }, meta: { '*.css': { loader: 'css' }, '*.vue': { loader: 'vue-loader' } }, paths: { // paths serve as alias 'npm:': 'node_modules/' }, // map tells the System loader where to look for things map: { '@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-vue': 'npm:@mescius/spread-sheets-vue/index.js', '@grapecity/jsob-test-dependency-package/react-components': 'npm:@grapecity/jsob-test-dependency-package/react-components/index.js', 'jszip': 'npm:jszip/dist/jszip.js', 'css': 'npm:systemjs-plugin-css/css.js', 'vue': 'npm:vue/dist/vue.min.js', 'vue-loader': 'npm:systemjs-vue-browser/index.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' }, // packages tells the System loader how to load when no filename and/or no extension packages: { src: { defaultExtension: 'js' }, rxjs: { defaultExtension: 'js' }, "node_modules": { defaultExtension: 'js' } } }); })(this);