PIVOTBY 函数

SpreadJS 支持 PIVOTBY 函数,它允许您使用单个公式执行数据聚合。

PIVOTBY 函数允许您通过公式创建数据摘要。它支持沿两个轴进行分组并聚合相关值。 参数 必需 描述 row_fields 是 包含用于分组行和生成行标题的值的列方向数组或范围。 col_fields 是 包含用于分组列和生成列标题的值的列方向数组或范围。 values 是 要聚合的数据的列方向数组或范围。 function 是 用于汇总分组数据的函数。 [field_headers] 否 指定 row_fields、col_fields 和 values 是否有标题以及结果中是否应返回字段标题的数字。 [row_total_depth] 否 确定行标题是否应包含总计。 [row_sort_order] 否 指示行应如何排序的数字。数字对应于 row_fields 中的列,然后是 values 中的列。如果数字为负,则行按降序/反向顺序排序。 [col_total_depth] 否 确定列标题是否应包含总计。 [col_sort_order] 否 指示列应如何排序的数字。数字对应于 col_fields 中的列,然后是 values 中的列。如果数字为负,则列按降序/反向顺序排序。 [filter_array] 否 指示是否应考虑相应数据行的布尔值列方向 1D 数组。 [relative_to] 否 控制哪些值提供给聚合函数的第二个参数。 注意: 仅当 allowDynamicArray 为 true 时,PIVOTBY 函数才有效。 数组或范围可能包含多列。如果是这样,输出将有多个聚合。 可以提供 lambda 函数向量。如果是这样,输出将有多个聚合。向量的方向将决定它们是按行还是按列排列。 当 field_headers 缺失时,它将根据 values 参数自动假定数据包含标题。如果第一个值是文本,第二个值是数字,则假定数据具有标题。如果有多个行或列分组级别,则显示字段标题。
<template> <div class="sample-tutorial"> <gc-spread-sheets class="sample-spreadsheets" @workbookInitialized="initSpread"> <gc-worksheet></gc-worksheet> </gc-spread-sheets> </div> </template> <script> import Vue from 'vue'; import '@grapecity-software/spread-sheets-vue' import GC from '@grapecity-software/spread-sheets'; import "@grapecity-software/spread-sheets-shapes"; import '@grapecity-software/spread-sheets-charts'; import '@grapecity-software/spread-sheets-resources-zh'; GC.Spread.Common.CultureManager.culture("zh-cn"); import './styles.css'; let App = Vue.extend({ name: "app", methods: { initSpread: function (spread) { let sheet = spread.getActiveSheet(); spread.options.allowDynamicArray = true; spread.suspendPaint(); spread.suspendCalcService(); sheet.setColumnCount(30); let data = [["Year","Category","Product","Status","Sales","Rating","Profit"],[2023,"Electronics","Smart TV","Active",15000,4.5,250],[2023,"Fashion","Designer Jeans","Discontinued",8000,4.7,150],[2024,"Food","Organic Granola","Active",5000,4.8,100],[2023,"Books","Bestseller Novel","Active",12000,4.6,180],[2024,"Electronics","Laptop","Active",20000,4.9,300],[2023,"Beauty","Skincare Set","Active",7000,4.4,120],[2023,"Home & Garden","Garden Tools","Active",6500,4.3,130],[2024,"Health","Fitness Tracker","Active",9500,4.6,190],[2023,"Toys","Action Figure","Active",4800,4.7,95],[2024,"Automotive","Car Accessories","Active",3200,4.5,65],[2023,"Sports","Basketball","Active",7600,4.8,150],[2024,"Office Supplies","Notebooks","Active",11000,4.4,220],[2023,"Pet Supplies","Dog Food","Active",5600,4.6,110],[2024,"Music","Headphones","Active",13000,4.9,260],[2023,"Outdoor","Camping Tent","Active",4400,4.5,88],[2024,"Jewelry","Silver Necklace","Active",2800,4.7,56],[2023,"Tools","Power Drill","Active",3900,4.4,78],[2024,"Baby","Stroller","Active",1700,4.6,34],[2023,"Kitchen","Blender","Active",2500,4.8,50],[2024,"Clothing","Casual Shirt","Active",6200,4.5,124],[2023,"Art","Oil Paintings","Active",1900,4.7,38],[2024,"Hobbies","Model Trains","Active",3100,4.4,62],[2023,"Tech Gadgets","Smart Watch","Active",7300,4.6,146],[2024,"Travel","Luggage","Active",4600,4.8,92],[2023,"Home Decor","Wall Clock","Active",2200,4.5,44],[2024,"Fitness","Yoga Mat","Active",5700,4.7,114],[2023,"Gardening","Plant Pots","Active",3400,4.4,68],[2024,"Audio","Speakers","Active",8900,4.6,178],[2023,"Lighting","LED Bulbs","Active",4300,4.8,86],[2024,"Gaming","Video Games","Active",16000,4.5,320],[2023,"Furniture","Sofa","Active",5500,4.7,110],[2024,"Health","Vitamins","Active",7100,4.4,142],[2023,"Office","Desk Chair","Active",6300,4.6,126],[2024,"Books","Educational Textbooks","Active",9200,4.8,184],[2023,"Tools","Screwdriver Set","Active",3700,4.5,74],[2024,"Home & Garden","Patio Furniture","Active",4900,4.7,98],[2023,"Automotive","Car Seat Covers","Active",2600,4.4,52],[2024,"Electronics","Smart Home System","Active",10500,4.6,210],[2023,"Health","Blood Pressure Monitor","Active",3800,4.8,76],[2024,"Beauty","Makeup Kit","Active",5900,4.5,118],[2023,"Music","Turntable","Active",2100,4.7,42],[2024,"Toys","Board Games","Active",3300,4.4,66],[2023,"Clothing","Winter Coat","Active",4700,4.6,94],[2024,"Food","Gourmet Chocolates","Active",7400,4.8,148],[2023,"Home Decor","Curtains","Active",2900,4.5,58],[2024,"Pet Supplies","Cat Litter","Active",6100,4.7,122],[2023,"Outdoor","Hiking Boots","Active",3500,4.4,70],[2024,"Kitchen","Slow Cooker","Active",8200,4.6,164],[2023,"Toys","Dolls","Active",4400,4.8,88],[2024,"Books","Poetry Collection","Active",5300,4.5,106],[2023,"Health","Massage Chair","Active",6600,4.7,132],[2024,"Home & Garden","Fire Pit","Active",7700,4.4,154],[2023,"Automotive","Car Wash Kit","Active",4000,4.6,80],[2024,"Office Supplies","Highlighters","Active",5200,4.8,104],[2023,"Tools","Hammer","Active",3200,4.5,64],[2024,"Beauty","Hair Dryer","Active",6800,4.7,136],[2023,"Kitchen","Coffee Maker","Active",4600,4.4,92],[2024,"Toys","Remote Control Cars","Active",7900,4.6,158],[2023,"Home Decor","Picture Frames","Active",3300,4.8,66],[2024,"Electronics","Router","Active",8500,4.5,170],[2023,"Clothing","Suit","Active",5700,4.7,114]]; sheet.setArray(0, 0, data); sheet.getRange(0, 0, 1, 7).backColor("Accent 7 80"); sheet.setText(0, 9, "The usage with non-adjacent columns and multiple aggregations"); sheet.setFormula(1, 9,"=FORMULATEXT(J3)"); sheet.setFormula(2, 9,"=PIVOTBY(A1:B62,D1:D62,CHOOSECOLS(E1:G62,1,3),HSTACK(PERCENTOF,MAX),3,2)"); let ranges = [new GC.Spread.Sheets.Range(2, 9, 49, 8)]; sheet.conditionalFormats.addFormulaRule('$J3="Year"', new GC.Spread.Sheets.Style('Accent 2 40'), ranges); sheet.conditionalFormats.addFormulaRule('$K3=""', new GC.Spread.Sheets.Style('Accent 2 60',null,null,null,"Bold"), ranges); sheet.getRange(2, 9, 49, 2).font("Bold"); sheet.getRange(2, 9, 49, 2).backColor("Accent 2 80"); spread.resumeCalcService(); spread.resumePaint(); }, } }); 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$/zh/vue/node_modules/@grapecity-software/spread-sheets/styles/gc.spread.sheets.excel2013white.css"> <!-- SystemJS --> <script src="$DEMOROOT$/zh/vue/node_modules/systemjs/dist/system.src.js"></script> <script src="systemjs.config.js"></script> <script> System.import('./src/app.vue'); System.import('$DEMOROOT$/zh/lib/vue/license.js'); </script> </head> <body> <div id="app"></div> </body> </html>
.sample-tutorial { position: relative; height: 100%; overflow: hidden; } .sample-spreadsheets { width: 100%; height: 100%; overflow: hidden; float: left; } body { position: absolute; top: 0; bottom: 0; left: 0; right: 0; }
(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/', 'cdn:': 'https://cdn.grapecity.com.cn/SpreadJS/package-contents/18.1.3/' }, // map tells the System loader where to look for things map: { '@grapecity-software/spread-sheets': 'cdn:spread-sheets/index.js', '@grapecity-software/spread-sheets-resources-zh': 'cdn:spread-sheets-resources-zh/index.js', '@grapecity-software/spread-sheets-vue': 'cdn:spread-sheets-vue/index.js', '@grapecity-software/spread-sheets-shapes': 'cdn:spread-sheets-shapes/index.js', '@grapecity-software/spread-sheets-charts': 'cdn:spread-sheets-charts/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);