概述
本 Demo 展示了 AGGREGATE 函数在实际场景中的应用,演示如何通过设置不同的选项参数来忽略隐藏行或错误值,从而获得准确的聚合计算结果。Demo 中创建了一个包含销售数据的表格,部分数据被筛选隐藏,部分数据包含错误值,通过 AGGREGATE 函数展示了其在复杂场景下的灵活性。
实现思路
创建销售数据表,包含销售人员、出生日期、地区、销售金额、佣金百分比和佣金金额等信息
在数据中故意设置一个错误值(Erich 的销售金额为空字符串),用于演示错误值处理
添加行筛选器,筛选出地区列包含 "th" 字符的行,隐藏其他行
在表格上方创建两个演示区域,分别展示忽略隐藏行和忽略错误值的 AGGREGATE 函数用法
使用 SUM 函数(编号 9)计算佣金总和,使用 LARGE 函数(编号 14)获取最大佣金值
代码解析
设置销售数据和筛选器
这段代码创建了基础数据表并应用了筛选器。数据中 Erich 的销售金额为空字符串,会导致其佣金计算出现错误,用于演示 AGGREGATE 函数对错误值的处理能力。筛选器会隐藏地区不包含 "th" 的行(East 和 West),只显示 North 和 South 的数据。
使用 AGGREGATE 函数忽略隐藏行
这两行公式使用选项 5,表示忽略隐藏的行。第一个公式使用函数编号 9(SUM)计算佣金列的总和,第二个公式使用函数编号 14(LARGE)获取第 1 大的佣金值。由于地区筛选隐藏了部分行,这些公式只会计算可见行的数据。
使用 AGGREGATE 函数忽略错误值
这两行公式使用选项 6,表示忽略错误值。由于数据中 Erich 的销售金额为空字符串,会导致其佣金计算出现错误,但 AGGREGATE 函数能够自动忽略这个错误值并正确计算其他数据。
使用 FORMULATEXT 显示公式
使用 FORMULATEXT 函数在相邻单元格中显示 AGGREGATE 公式的文本内容,方便用户查看和理解使用的函数参数。
运行效果
表格显示了销售人员的完整数据,其中地区列经过筛选,只显示包含 "th" 字符的行(North 和 South)
表格上方的橙色边框区域显示提示信息
红色边框区域显示忽略隐藏行的计算结果:可以看到 SUM 和 LARGE 函数只计算可见行的数据
绿色边框区域显示忽略错误值的计算结果:即使数据中存在错误值,AGGREGATE 函数仍能返回正确结果
所有公式使用 FORMULATEXT 函数在相邻单元格中显示,方便用户查看
API 参考
AGGREGATE 函数语法
参数说明
function_num(必需):函数编号(1-19),指定要使用的聚合函数
1-13:包括 AVERAGE、COUNT、COUNTA、MAX、MIN、SUM、MEDIAN 等
14-19:包括 LARGE、SMALL、PERCENTILE.INC、QUARTILE.INC 等
options(必需):选项编号,指定要忽略的值
0 或省略:忽略嵌套的 SUBTOTAL 和 AGGREGATE 函数
1:忽略隐藏行、嵌套的 SUBTOTAL 和 AGGREGATE 函数
2:忽略错误值、嵌套的 SUBTOTAL 和 AGGREGATE 函数
3:忽略隐藏行、错误值、嵌套的 SUBTOTAL 和 AGGREGATE 函数
4:不忽略任何值
5:忽略隐藏行
6:忽略错误值
7:忽略隐藏行和错误值
ref1、ref2(必需):单元格区域引用(用于函数编号 1-13)
array(必需):数组或单元格区域引用(用于函数编号 14-19)
k(必需):指定函数的参数值(用于函数编号 14-19,如 LARGE 函数的第 k 大值)
注意事项
如果未提供必需参数,函数返回 #VALUE! 错误
不支持三维引用
"忽略隐藏"不支持隐藏列,仅支持通过筛选/隐藏/分组操作隐藏的行
如果数组包含计算,AGGREGATE 函数不会忽略隐藏行
window.onload = function () {
var spread = new GC.Spread.Sheets.Workbook(document.getElementById("ss"), { sheetCount: 1 });
initSpread(spread);
};
function initSpread(spread) {
var salesData = [
["销售人员", "出生日期", "地区", "销售金额", "佣金百分比", "佣金金额"],
["Joe", new Date("2000/01/23"), "North", 260, 0.1, 26],
["Robert", new Date("1988/08/21"), "South", 660, 0.15, 99],
["Michelle", new Date("1995/08/03"), "East", 940, 0.15, 141],
["Erich", new Date("1994/05/23"), "West", '', 0, 49.2],
["Dafna", new Date("1992/07/21"), "North", 800, 0.15, 120],
["Rob", new Date("1995/11/03"), "South", 900, 0.15, 135],
["Jonason", new Date("1987/02/11"), "West", 300, 0.17, 110],
["Enana", new Date("1997/04/01"), "West", 310, 0.16, 99.2],
["Robin", new Date("1991/12/28"), "East", 450, 0.18, 35],
["Dania", new Date("1997/02/15"), "North", 500, 0.10, 76]
];
var sheet = spread.getSheet(0);
sheet.suspendPaint();
sheet.setArray(8, 1, salesData);
sheet.setFormula(12, 6, "=E13*F13");
var filter = new GC.Spread.Sheets.Filter.HideRowFilter(new GC.Spread.Sheets.Range(9, 1, salesData.length - 1, salesData[0].length));
sheet.rowFilter(filter);
var condition = new GC.Spread.Sheets.ConditionalFormatting.Condition(GC.Spread.Sheets.ConditionalFormatting.ConditionType.textCondition, {
compareType: GC.Spread.Sheets.ConditionalFormatting.TextCompareType.contains,
expected: "th"
});
filter.addFilterItem(3, condition);
filter.filter(3);
sheet.setText(0, 2, "筛选数据并检查公式结果的变化。");
sheet.setArray(2, 2, [["忽略隐藏行", "佣金金额总和"], ["", "最大佣金金额"], ["", ""], ["忽略错误", "佣金金额总和"], ["", "最大佣金金额"]]);
sheet.setFormula(2, 4, "=AGGREGATE(9,5,G10:G19)");
sheet.setFormula(3, 4, "=AGGREGATE(14,5,G10:G19, 1)");
sheet.setFormula(5, 4, "=AGGREGATE(9,6,G10:G19)");
sheet.setFormula(6, 4, "=AGGREGATE(14,6,G10:G19, 1)");
sheet.setFormula(2, 5, "=FORMULATEXT(E3)");
sheet.setFormula(3, 5, "=FORMULATEXT(E4)");
sheet.setFormula(5, 5, "=FORMULATEXT(E6)");
sheet.setFormula(6, 5, "=FORMULATEXT(E7)");
sheet.getRange(9, 5, 10, 1).formatter(new GC.Spread.Formatter.GeneralFormatter("0.00%"));
sheet.getRange(8, 1, 1, 6).backColor('rgb(219,225,240)');
initStyle(sheet);
sheet.resumePaint();
}
function initStyle(sheet) {
sheet.defaults.colWidth = 100;
sheet.setColumnWidth(2, 140);
sheet.getRange(9, 2, 10, 1).formatter("mm-dd-yyyy");
sheet.setColumnWidth(3, 160);
sheet.setColumnWidth(5, 160);
sheet.setColumnWidth(6, 160);
sheet.addSpan(2, 2, 2, 1);
sheet.addSpan(5, 2, 2, 1);
var lineStyle = GC.Spread.Sheets.LineStyle.thin;
var sheetArea = GC.Spread.Sheets.SheetArea.viewport;
var lineBorder = new GC.Spread.Sheets.LineBorder('orange', lineStyle);
sheet.getRange(0, 2, 1, 3).setBorder(lineBorder, { outline: true }, sheetArea);
lineBorder = new GC.Spread.Sheets.LineBorder('red', lineStyle);
sheet.getRange(2, 2, 2, 5).setBorder(lineBorder, { outline: true }, sheetArea);
lineBorder = new GC.Spread.Sheets.LineBorder('green', lineStyle);
sheet.getRange(5, 2, 2, 5).setBorder(lineBorder, { outline: true }, sheetArea);
lineBorder = new GC.Spread.Sheets.LineBorder('blue', lineStyle);
sheet.getRange(8, 1, 11, 6).setBorder(lineBorder, { outline: true }, sheetArea);
}
<!doctype html>
<html style="height:100%;font-size:14px;">
<head>
<meta name="spreadjs culture" content="zh-cn" />
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link rel="stylesheet" type="text/css"
href="$DEMOROOT$/zh/purejs/node_modules/@grapecity-software/spread-sheets/styles/gc.spread.sheets.excel2013white.css">
<script src="$DEMOROOT$/zh/purejs/node_modules/@grapecity-software/spread-sheets/dist/gc.spread.sheets.all.min.js"
type="text/javascript"></script>
<script
src="$DEMOROOT$/zh/purejs/node_modules/@grapecity-software/spread-sheets-resources-zh/dist/gc.spread.sheets.resources.zh.min.js"
type="text/javascript"></script>
<script src="$DEMOROOT$/spread/source/js/license.js" type="text/javascript"></script>
<script src="app.js" type="text/javascript"></script>
<link rel="stylesheet" type="text/css" href="styles.css">
</head>
<body>
<div class="sample-tutorial">
<div id="ss" class="sample-spreadsheets"></div>
</div>
</body>
</html>
.sample-tutorial {
position: relative;
height: 100%;
overflow: hidden;
}
.sample-spreadsheets {
width: 100%;
height: 100%;
overflow: hidden;
float: left;
border: 1px solid gray;
}
body {
position: absolute;
top: 0;
bottom: 0;
left: 0;
right: 0;
}