概述
本 Demo 展示了 FILTER 函数的基本用法,演示如何根据条件筛选销售数据。Demo 中展示了从销售记录中筛选出数量大于 5000 的记录,并自动计算筛选结果的数量。
实现思路
启用动态数组功能,设置 allowDynamicArray 为 true
创建销售数据表格,包含地区、销售代表、产品、数量四列
设置筛选条件(数量阈值 5000)
使用 FILTER 公式筛选符合条件的数据记录
使用 SUM 和 IF 组合公式计算符合条件的记录总数
应用表格样式美化数据显示
代码解析
启用动态数组
FILTER 函数属于动态数组函数,需要先启用动态数组功能才能正常使用。
设置筛选公式
FILTER 函数接收三个参数:
第一个参数 D4:E19 是要筛选的数据区域(产品列和数量列)
第二个参数 E4:E19>G4 是筛选条件,判断数量列是否大于阈值 G4 单元格的值
第三个参数是空字符串,表示当筛选结果为空时返回空值,避免 #CALC! 错误
计算筛选结果数量
使用 SUM 和 IF 组合公式计算符合条件的记录数。evaluateFormula 方法用于在计算服务挂起时获取公式计算结果,以便确定筛选结果需要占用的行数。
运行效果
表格左侧显示完整的销售数据(16条记录)
表格右侧自动显示筛选结果:数量大于 5000 的产品记录
筛选结果会根据数据自动调整大小,展示符合条件的所有记录
如果修改筛选条件值,筛选结果会自动更新
API 参考
FILTER 函数
array: 要进行筛选的数组或区域
include: 一个布尔数组,其高度或宽度与要筛选的数组相同
if_empty: 可选,如果筛选结果为空时的返回值
注意事项:
FILTER 函数仅在 allowDynamicArray 为 true 时有效
FILTER 函数返回一个数组,如果该数组是公式的最终结果,则会溢出到相邻单元格
如果数据集有可能返回空值,建议使用第三个参数避免 #CALC! 错误
如果 include 参数包含错误值或无法转换为布尔值,FILTER 函数将返回错误
window.onload = function () {
var spread = new GC.Spread.Sheets.Workbook(_getElementById("ss"));
initSpread(spread);
};
var demoData = [
["地区","销售代表","产品","数量"],
["东部","Tom","苹果",6380],
["西部","Fred","葡萄", 5619],
["北部","Amy","梨", 4565],
["南部","Sal","香蕉", 5323],
["东部","Fritz","苹果", 4394],
["西部","Sravan","葡萄", 7195],
["北部","Xi","梨", 5231],
["南部","Hector","香蕉", 2427],
["东部","Tom","香蕉", 4213],
["西部","Fred","梨", 3239],
["北部","Amy","葡萄", 6420],
["南部","Sal","苹果", 1310],
["东部","Fritz","香蕉", 6274],
["西部","Sravan","梨", 4894],
["北部","Xi","葡萄", 7580],
["南部","Hector","苹果", 9814]
];
function initSpread(spread) {
spread.options.allowDynamicArray = true;
var sheet = spread.getActiveSheet();
spread.suspendPaint();
spread.suspendCalcService();
sheet.name('FILTER');
sheet.defaults.colWidth = 80;
sheet.setColumnWidth(5, 20);
sheet.setColumnWidth(7, 20);
sheet.setText(0, 0, 'FILTER函数根据您指定的条件筛选区域或数组。语法:FILTER(array,include,[if_empty])');
var row = 2;
var col = 1;
var rowCount = 17;
applyTableStyleForRange(sheet, row, col, rowCount, 4);
applyTableStyleForRange(sheet, row, 6, 2, 1);
sheet.setArray(row, col, demoData);
sheet.setArray(row, 6, [["筛选条件", "", "产品", "数量", "", "总计:"], [5000]]);
var formatter = '#,##0';
sheet.getRange(row + 1, col + 3, rowCount - 1, 1).formatter(formatter);
sheet.getCell(row + 1, 6).formatter(formatter);
sheet.getRange(row + 1, 9, rowCount, 1).formatter(formatter);
var formula = 'SUM(IF(E4:E19>G4,1,0))';
sheet.setFormula(row + 1, 11, formula);
// can't get value when calc service is suspended, use evaluateFormula instead
// rowCount = sheet.getValue(row + 1, 11) + 1;
rowCount = GC.Spread.Sheets.CalcEngine.evaluateFormula(sheet, formula) + 1;
applyTableStyleForRange(sheet, row, 8, rowCount, 2);
sheet.setArray(row, 6, [["筛选条件", "", "产品", "数量", "", "总计:"], [5000]]);
sheet.setFormula(row + 1, 8, 'FILTER(D4:E19,E4:E19>G4,"")');
spread.resumeCalcService();
spread.resumePaint();
}
function applyTableStyleForRange(sheet, row, col, rowCount, colCount, options) {
var tableName = "tmpTable";
var TableThemes = GC.Spread.Sheets.Tables.TableThemes;
// use table to help set style then remove like convert table to range in Excel
sheet.tables.add(tableName, row, col, rowCount, colCount, TableThemes.medium7, options);
sheet.tables.remove(tableName, 2 /* keep style */);
}
function _getElementById(id) {
return document.getElementById(id);
}
<!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" style="width:100%; height: 100%"></div>
</div>
</body>
</html>
.sample {
position: relative;
height: 100%;
overflow: auto;
}
.sample::after {
display: block;
content: "";
clear: both;
}
.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;
}
.option-group {
margin-bottom: 6px;
}
label {
display: block;
margin-bottom: 6px;
}
input {
margin-bottom: 5px;
padding: 2px 4px;
width: 100%;
box-sizing: border-box;
}
input[type=button] {
margin-bottom: 6px;
}
hr {
border-color: #fff;
opacity: .2;
margin: 5px 0;
}
body {
position: absolute;
top: 0;
bottom: 0;
left: 0;
right: 0;
}