ピボットテーブルは、さまざまな計算の種類を提供して、計算の値をすばやく表示します。
14種類の計算の種類を利用できます。
計算の種類
列挙型の値
必要なプロパティ
計算なし
normal
showDataAs
総計に対する比率
percentOfTotal
showDataAs
列集計に対する比率
percentOfRow
showDataAs
行集計に対する比率
percentOfCol
showDataAs
基準値に対する比率
percent
showDataAs, baseFieldName, baseFieldItemType, baseFieldItem?
親行集計に対する比率
percentOfParentRow
showDataAs
親列集計に対する比率
percentOfParentCol
showDataAs
親集計に対する比率
percentOfParent
showDataAs, baseFieldName
基準値との差分
difference
showDataAs, baseFieldName, baseFieldItemType, baseFieldItem?
基準値との差分の比率
percentDiff
showDataAs, baseFieldName, baseFieldItemType, baseFieldItem?
累計
runTotal
showDataAs, baseFieldName
比率の累計
percentOfRunningTotal
showDataAs, baseFieldName
昇順での順位
rankAscending
showDataAs, baseFieldName
降順での順位
rankDescending
showDataAs, baseFieldName
指数 (インデックス)
index
showDataAs
サンプル:
<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>計算の種類:</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>
<label id="showValueAsBaseFieldLabel">基準フィールド:</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">基準アイテム:</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="設定を適用する" 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";
import '@mescius/spread-sheets-resources-ja';
GC.Spread.Common.CultureManager.culture("ja-jp");
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("四半期 (date)", "四半期 (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 = "計算: ";
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 = ("計算: " + 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: "値",
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 lang="en" 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$/ja/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$/ja/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$/ja/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-ja': 'npm:@mescius/spread-sheets-resources-ja/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);