Views rely on the serialize() and deserialize() API to save and restore.
Serialize & Deserialize
Serialize current supports the following data:
Fields
Options
Filter
Sort
Layout
PivotTable Position
Theme
Interface
API
Sample Code
PivotTableViewManager
The PivotTableViewManager is used to add, delete, modify, and check Pivot Table Views.
The PivotTableViewManager and PivotTable have a one-to-one relationship, and it is initialized in the PivotTable constructor.
Interface
API
If you set "viewList" to visible in the pivot panel, you can use it to control the views of a PivotTable. You can add, remove, and apply the views with the view list section at the bottom of the panel.
You can follow these steps:
Click the "▼" button, which will show the views list dialog.
Click the "x" button on the right of each item in the views list dialog, which will remove the view.
Enter the View Name in the input dialog, and then click the "+" button to add the View.
If there is no value in the input dialog, the default name will be used instead.
Click one item in the views list dialog, and the view name will show in the input dialog.
Click the "√" button, which will apply the view with this name (with the Deserialize() API of PivotTable).
import * as React from 'react';
import * as ReactDOM from 'react-dom';
import './styles.css';
import { AppFunc } from './app-func';
import { App } from './app-class';
// 1. Functional Component sample
ReactDOM.render(<AppFunc />, document.getElementById('app'));
// 2. Class Component sample
// ReactDOM.render(<App />, document.getElementById('app'));
import * as React from 'react';
import GC from '@mescius/spread-sheets';
import "@mescius/spread-sheets-shapes";
import "@mescius/spread-sheets-pivot-addon";
import { SpreadSheets, Worksheet } from '@mescius/spread-sheets-react';
import './styles.css';
export function AppFunc() {
const initSpread = (spread) => {
initSheets(spread);
let pivotLayoutSheet = spread.getSheet(0);
initPivotTable(pivotLayoutSheet);
}
const initSheets = (spread) => {
spread.suspendPaint();
var sheet = spread.getSheet(1);
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('tableSales', 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, pivotSales);
var sheet0 = spread.getSheet(0);
sheet0.name("PivotLayout");
sheet0.setValue(0, 1, "Switch the build-in views in the pivot panel view list.");
spread.resumePaint();
}
const initPivotTable = (sheet) => {
var myPivotTable = sheet.pivotTables.add("myPivotTable", "tableSales", 2, 1, GC.Spread.Pivot.PivotTableLayoutType.outline, GC.Spread.Pivot.PivotTableThemes.light8);
myPivotTable.suspendLayout();
var groupInfo = { originFieldName: "date", dateGroups: [{ by: GC.Pivot.DateGroupType.quarters }] };
myPivotTable.group(groupInfo);
var emptyPT = "Empty Pivot Table";
myPivotTable.views.save(emptyPT);
// Quarterly Report
myPivotTable.options.showRowHeader = true;
myPivotTable.options.showColumnHeader = true;
myPivotTable.add("salesperson", "Salesperson", GC.Spread.Pivot.PivotTableFieldType.rowField);
myPivotTable.add("date", "Qt", GC.Spread.Pivot.PivotTableFieldType.columnField);
myPivotTable.add("total", "Totals", GC.Spread.Pivot.PivotTableFieldType.valueField, GC.Pivot.SubtotalType.sum);
let styleItem = {
dataOnly: true,
references: [{
fieldName: "Qt",
items: ["Qtr3", "Qtr4"]
}]
};
let style1 = new GC.Spread.Sheets.Style();
style1.formatter = '0%';
myPivotTable.setStyle(styleItem, style1);
myPivotTable.views.save("Quarterly Report");
// Quantity Details
myPivotTable.views.apply(emptyPT);
myPivotTable.theme(GC.Spread.Pivot.PivotTableThemes.medium1);
myPivotTable.options.insertBlankLineAfterEachItem = true;
myPivotTable.options.mergeItem = true
myPivotTable.layoutType(GC.Spread.Pivot.PivotTableLayoutType.tabular);
myPivotTable.add("salesperson", "Salesperson", GC.Spread.Pivot.PivotTableFieldType.rowField);
myPivotTable.add("date", "Qt", GC.Spread.Pivot.PivotTableFieldType.columnField);
myPivotTable.add("quantity", "Totals", GC.Spread.Pivot.PivotTableFieldType.valueField, GC.Pivot.SubtotalType.sum);
let style2 = new GC.Spread.Sheets.Style();
style1.formatter = '#,##0';
myPivotTable.setStyle(styleItem, style2);
myPivotTable.views.save("Car Quantity Details");
// John Cars Report
myPivotTable.views.apply(emptyPT);
myPivotTable.options.subtotalPosition = 0;
myPivotTable.layoutType(GC.Spread.Pivot.PivotTableLayoutType.compact);
myPivotTable.theme(GC.Spread.Pivot.PivotTableThemes.light14);
let style3 = new GC.Spread.Sheets.Style();
style1.formatter = '$ #,##0';
myPivotTable.setStyle(styleItem, style3);
myPivotTable.add("salesperson", "Salesperson", GC.Spread.Pivot.PivotTableFieldType.rowField);
myPivotTable.add("car", "Cars", GC.Spread.Pivot.PivotTableFieldType.columnField);
myPivotTable.add("date", "Qt", GC.Spread.Pivot.PivotTableFieldType.rowField);
myPivotTable.add("total", "Totals", GC.Spread.Pivot.PivotTableFieldType.valueField, GC.Pivot.SubtotalType.sum);
var labelFilter = { textItem: { isAll: false, list: ["John"] } };
myPivotTable.labelFilter("Salesperson", labelFilter);
myPivotTable.views.save("John Cars Report");
myPivotTable.views.apply("Quarterly Report");
new GC.Spread.Pivot.PivotPanel("myPivotPanel", myPivotTable, document.getElementById("panel"));
myPivotTable.resumeLayout();
myPivotTable.autoFitColumn();
}
return (
<div class="sample-tutorial">
<div class="sample-spreadsheets">
<SpreadSheets workbookInitialized={spread => initSpread(spread)}>
<Worksheet>
</Worksheet>
<Worksheet>
</Worksheet>
</SpreadSheets>
</div>
<div class="sample-panel">
<div id="panel"></div>
</div>
</div>
);
}
import * as React from 'react';
import GC from '@mescius/spread-sheets';
import "@mescius/spread-sheets-shapes";
import "@mescius/spread-sheets-pivot-addon";
import { SpreadSheets, Worksheet } from '@mescius/spread-sheets-react';
import './styles.css';
const Component = React.Component;
export class App extends Component {
render() {
return (
<div class="sample-tutorial">
<div class="sample-spreadsheets">
<SpreadSheets workbookInitialized={spread=>this.initSpread(spread)}>
<Worksheet>
</Worksheet>
<Worksheet>
</Worksheet>
</SpreadSheets>
</div>
<div class="sample-panel">
<div id="panel"></div>
</div>
</div>
);
}
initSpread(spread) {
this.initSheets(spread);
let pivotLayoutSheet = spread.getSheet(0);
this.initPivotTable(pivotLayoutSheet);
}
initSheets (spread) {
spread.suspendPaint();
var sheet = spread.getSheet(1);
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('tableSales', 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, pivotSales);
var sheet0 = spread.getSheet(0);
sheet0.name("PivotLayout");
sheet0.setValue(0, 1, "Switch the build-in views in the pivot panel view list.");
spread.resumePaint();
}
initPivotTable(sheet) {
var myPivotTable = sheet.pivotTables.add("myPivotTable", "tableSales", 2, 1, GC.Spread.Pivot.PivotTableLayoutType.outline, GC.Spread.Pivot.PivotTableThemes.light8);
myPivotTable.suspendLayout();
var groupInfo = { originFieldName: "date", dateGroups: [{ by: GC.Pivot.DateGroupType.quarters }] };
myPivotTable.group(groupInfo);
var emptyPT = "Empty Pivot Table";
myPivotTable.views.save(emptyPT);
// Quarterly Report
myPivotTable.options.showRowHeader = true;
myPivotTable.options.showColumnHeader = true;
myPivotTable.add("salesperson", "Salesperson", GC.Spread.Pivot.PivotTableFieldType.rowField);
myPivotTable.add("date", "Qt", GC.Spread.Pivot.PivotTableFieldType.columnField);
myPivotTable.add("total", "Totals", GC.Spread.Pivot.PivotTableFieldType.valueField, GC.Pivot.SubtotalType.sum);
let styleItem = {
dataOnly: true,
references: [{
fieldName: "Qt",
items: ["Qtr3", "Qtr4"]
}]
};
let style1 = new GC.Spread.Sheets.Style();
style1.formatter = '0%';
myPivotTable.setStyle(styleItem, style1);
myPivotTable.views.save("Quarterly Report");
// Quantity Details
myPivotTable.views.apply(emptyPT);
myPivotTable.theme(GC.Spread.Pivot.PivotTableThemes.medium1);
myPivotTable.options.insertBlankLineAfterEachItem = true;
myPivotTable.options.mergeItem = true
myPivotTable.layoutType(GC.Spread.Pivot.PivotTableLayoutType.tabular);
myPivotTable.add("salesperson", "Salesperson", GC.Spread.Pivot.PivotTableFieldType.rowField);
myPivotTable.add("date", "Qt", GC.Spread.Pivot.PivotTableFieldType.columnField);
myPivotTable.add("quantity", "Totals", GC.Spread.Pivot.PivotTableFieldType.valueField, GC.Pivot.SubtotalType.sum);
let style2 = new GC.Spread.Sheets.Style();
style1.formatter = '#,##0';
myPivotTable.setStyle(styleItem, style2);
myPivotTable.views.save("Car Quantity Details");
// John Cars Report
myPivotTable.views.apply(emptyPT);
myPivotTable.options.subtotalPosition = 0;
myPivotTable.layoutType(GC.Spread.Pivot.PivotTableLayoutType.compact);
myPivotTable.theme(GC.Spread.Pivot.PivotTableThemes.light14);
let style3 = new GC.Spread.Sheets.Style();
style1.formatter = '$ #,##0';
myPivotTable.setStyle(styleItem, style3);
myPivotTable.add("salesperson", "Salesperson", GC.Spread.Pivot.PivotTableFieldType.rowField);
myPivotTable.add("car", "Cars", GC.Spread.Pivot.PivotTableFieldType.columnField);
myPivotTable.add("date", "Qt", GC.Spread.Pivot.PivotTableFieldType.rowField);
myPivotTable.add("total", "Totals", GC.Spread.Pivot.PivotTableFieldType.valueField, GC.Pivot.SubtotalType.sum);
var labelFilter = {textItem: {isAll: false, list: ["John"]}};
myPivotTable.labelFilter("Salesperson", labelFilter);
myPivotTable.views.save("John Cars Report");
myPivotTable.views.apply("Quarterly Report");
new GC.Spread.Pivot.PivotPanel("myPivotPanel", myPivotTable, document.getElementById("panel"));
myPivotTable.resumeLayout();
myPivotTable.autoFitColumn();
}
}
<!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/react/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/react/node_modules/systemjs/dist/system.src.js"></script>
<script src="systemjs.config.js"></script>
<script>
System.import('$DEMOROOT$/en/lib/react/license.js').then(function () {
System.import('./src/app');
});
</script>
</head>
<body>
<div id="app"></div>
</body>
</html>
.sample-tutorial {
position: relative;
height: 100%;
}
.sample-spreadsheets {
width: calc(100% - 300px);
height: 100%;
overflow: hidden;
float: left;
}
body {
position: absolute;
top: 0;
bottom: 0;
left: 0;
right: 0;
overflow: hidden;
}
.sample-panel {
float: right;
width: 300px;
padding: 12px;
height: 100%;
box-sizing: border-box;
background: #fbfbfb;
overflow: auto;
}
.gc-panel {
padding: 10px;
background-color: rgb(230, 230, 230);
}
#panel {
position: absolute;
right: 0;
width: 300px;
height: 100%;
top: 0;
}
#app {
height: 100%;
}
(function (global) {
System.config({
transpiler: 'plugin-babel',
babelOptions: {
es2015: true,
react: true
},
meta: {
'*.css': { loader: 'css' }
},
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-react': 'npm:@mescius/spread-sheets-react/index.js',
'@grapecity/jsob-test-dependency-package/react-components': 'npm:@grapecity/jsob-test-dependency-package/react-components/index.js',
'react': 'npm:react/umd/react.production.min.js',
'react-dom': 'npm:react-dom/umd/react-dom.production.min.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'
},
// packages tells the System loader how to load when no filename and/or no extension
packages: {
src: {
defaultExtension: 'jsx'
},
"node_modules": {
defaultExtension: 'js'
},
}
});
})(this);