AGGREGATE 函数

AGGREGATE 函数支持对数据执行 19 种聚合计算(如求和、计数、最大值、最小值等),并可灵活选择忽略隐藏行或错误值。该函数特别适合在筛选数据或处理包含错误的数据集时使用,确保计算结果的准确性。

概述 本 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; }