筛选按钮与筛选对话框

SpreadJS 支持灵活控制筛选按钮的显示与隐藏,以及自定义筛选对话框的结构。开发者可以通过 API 精细控制每一列的筛选按钮可见性,并定制筛选对话框中各个功能区域的显示,从而实现权限管控或定制化的数据筛选交互。

概述 本 Demo 展示了如何使用 SpreadJS 的筛选 API 控制筛选按钮的显示状态和自定义筛选对话框的结构。Demo 中创建了一个包含销售数据的工作表,设置了行筛选器,并通过条件格式为数据添加颜色样式,从而支持按颜色筛选功能。用户可以通过界面控件动态控制各列筛选按钮的显示,以及筛选对话框中各个功能区域的可见性。 实现思路 创建销售数据表格并设置基础样式 创建行筛选器(HideRowFilter)并设置筛选范围 添加条件格式,为不同区域和出生日期设置不同的颜色,用于按颜色筛选 为筛选按钮控制按钮绑定事件,实现显示/隐藏全部筛选按钮 为每列生成复选框控件,实现单独控制各列筛选按钮的显示 为筛选对话框结构控制项绑定事件,动态调整对话框显示的功能区域 代码解析 创建行筛选器 这段代码创建了一个 HideRowFilter 行筛选器,并设置筛选范围从第 2 行第 1 列开始,覆盖所有数据行和列。然后将筛选器应用到工作表。 控制全部筛选按钮的显示 filterButtonVisible(true) 显示所有列的筛选按钮,filterButtonVisible(false) 隐藏所有列的筛选按钮。这适用于权限控制场景,例如只允许特定用户使用筛选功能。 控制单列筛选按钮的显示 filterButtonVisible(index, visible) 方法接受两个参数:index 为列索引,visible 为布尔值表示是否显示。这允许精细控制每一列的筛选按钮。 自定义筛选对话框结构 filterDialogVisibleInfo 方法接受一个配置对象,可以控制筛选对话框的 5 个功能区域: sortByValue:按值排序区域 sortByColor:按颜色排序区域 filterByColor:按颜色筛选区域 filterByValue:按值筛选区域 listFilterArea:列表筛选区域 添加条件格式以支持按颜色筛选 这段代码为 Region 列添加条件格式,当值为 "West" 时设置前景色。Demo 中为四个区域(West、East、North、South)分别设置了不同颜色,这样用户就可以在筛选对话框中按颜色进行筛选。 运行效果 点击"显示全部"按钮,所有列的筛选按钮都会显示出来 点击"隐藏全部"按钮,所有列的筛选按钮都会隐藏 勾选或取消勾选各列的复选框,可以单独控制该列筛选按钮的显示 点击筛选按钮打开筛选对话框,可以看到按值排序、按颜色排序、按颜色筛选、按值筛选和列表筛选区域 通过界面下方的复选框控制筛选对话框中各个功能区域的显示 由于添加了条件格式,Region 列和 Birth 列支持按颜色筛选功能
var spreadNS = GC.Spread.Sheets; var salesData = [ ["SalesPers", "Birth", "Region", "SaleAmt", "ComPct", "ComAmt"], ["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", 410, 0.12, 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], ["Dania", new Date("1997/02/15"), "North", 500, 0.10, 76], ["Robin", new Date("1991/12/28"), "East", 450, 0.18, 35]]; var tableColumnsContainer; var checkBoxes; window.onload = function () { tableColumnsContainer = _getElementById("tableColumnsContainer"); var spread = new GC.Spread.Sheets.Workbook(document.getElementById("ss"), {sheetCount: 2}); initSpread(spread); }; function initSpread(spread) { var sheet = spread.getSheet(0); sheet.suspendPaint(); sheet.options.allowCellOverflow = true; sheet.name("FilterDialog"); sheet.setArray(1, 1, salesData); var filter = new spreadNS.Filter.HideRowFilter(new spreadNS.Range(2, 1, salesData.length - 1, salesData[0].length)); sheet.rowFilter(filter); prepareFilterItems(sheet, salesData[0]); sheet.defaults.rowHeight = 28; sheet.setColumnWidth(1, 110); sheet.setColumnWidth(2, 80); sheet.setColumnWidth(3, 100); sheet.setColumnWidth(4, 80); sheet.setColumnWidth(5, 80); sheet.setColumnWidth(6, 80); sheet.getRange(2, 2, 10, 1).formatter("yyyy/mm/dd"); var ComparisonOperators = spreadNS.ConditionalFormatting.ComparisonOperators; var equalsTo = ComparisonOperators.equalsTo; var range = sheet.getRange(1, 1, 11, 6); range.setBorder(new spreadNS.LineBorder("gray", spreadNS.LineStyle.thin), {all: true}); var ranges = [new spreadNS.Range(2, 3, 10, 1)]; var style1 = new spreadNS.Style(); style1.foreColor = "Accent 2"; var rule1 = new spreadNS.ConditionalFormatting.NormalConditionRule(1, ranges, style1, equalsTo, "West", ""); sheet.conditionalFormats.addRule(rule1); var style2 = new spreadNS.Style(); style2.foreColor = "Accent 3"; var rule2 = new spreadNS.ConditionalFormatting.NormalConditionRule(1, ranges, style2, equalsTo, "East", ""); sheet.conditionalFormats.addRule(rule2); var style3 = new spreadNS.Style(); style3.foreColor = "Accent 6"; var rule3 = new spreadNS.ConditionalFormatting.NormalConditionRule(1, ranges, style3, equalsTo, "North", ""); sheet.conditionalFormats.addRule(rule3); var style4 = new spreadNS.Style(); style4.foreColor = "Accent 1"; var rule4 = new spreadNS.ConditionalFormatting.NormalConditionRule(1, ranges, style4, equalsTo, "South", ""); sheet.conditionalFormats.addRule(rule4); ranges = [new spreadNS.Range(2, 2, 10, 1)]; style1 = new spreadNS.Style(); style1.backColor = "rgb(241, 135, 102)"; rule1 = new spreadNS.ConditionalFormatting.NormalConditionRule(1, ranges, style1, ComparisonOperators.lessThan, "1990/01/01", ""); sheet.conditionalFormats.addRule(rule1); style2 = new spreadNS.Style(); style2.backColor = "lightGreen"; rule2 = new spreadNS.ConditionalFormatting.NormalConditionRule(1, ranges, style2, ComparisonOperators.between, "1990/01/01", "2000/01/01"); sheet.conditionalFormats.addRule(rule2); style3 = new spreadNS.Style(); style3.backColor = "deepSkyBlue"; rule3 = new spreadNS.ConditionalFormatting.NormalConditionRule(1, ranges, style3, ComparisonOperators.greaterThan, "2000/01/01", ""); sheet.conditionalFormats.addRule(rule3); sheet.resumePaint(); var sheet2 = spread.sheets[1]; initOutlineColumnFilter(sheet2); sheet2.name("OutlineColumnFilter"); _getElementById("showAll").addEventListener('click',function () { if (filter) { filter.filterButtonVisible(true); checkBoxes.forEach(function(item) { item.checked = true; }); } }); _getElementById("hideAll").addEventListener('click',function () { if (filter) { filter.filterButtonVisible(false); checkBoxes.forEach(function(item) { item.checked = false; }); } }); _getElementById("sortByValue").addEventListener('change',function () { var val = this.checked; filter.filterDialogVisibleInfo({ sortByValue: val }); }); _getElementById("sortByColor").addEventListener('change',function () { var val = this.checked; filter.filterDialogVisibleInfo({sortByColor:val}); }); _getElementById("filterByColor").addEventListener('change',function () { var val = this.checked; filter.filterDialogVisibleInfo({filterByColor:val}); }); _getElementById("filterByValue").addEventListener('change',function () { var val = this.checked; filter.filterDialogVisibleInfo({filterByValue:val}); }); _getElementById("listFilterArea").addEventListener('change',function () { var val = this.checked; filter.filterDialogVisibleInfo({listFilterArea:val}); }); } function prepareFilterItems(sheet, headers) { var items = []; var filter = sheet.rowFilter(), range = filter.range, startColumn = range.col; for (var c = 0, length = headers.length; c < length; c++) { var name = headers[c]; items.push('<div><label><input type="checkbox" checked data-index="' + (startColumn + c) + '">'+ name + '</label></div>'); } tableColumnsContainer.innerHTML = items.join(""); var nodeList = tableColumnsContainer.querySelectorAll("input[type='checkbox']"); checkBoxes = []; for (var i = 0, count = nodeList.length; i < count; i++) { var element = nodeList[i]; checkBoxes.push(element); element.addEventListener('change', function () { var index = +this.dataset.index; // +this.getAttribute("data-index"); if (filter) { filter.filterButtonVisible(index, this.checked); } }); } } function initOutlineColumnFilter(sheet) { sheet.setColumnWidth(2, 120); sheet.rowFilter(new GC.Spread.Sheets.Filter.HideRowFilter(new GC.Spread.Sheets.Range(-1, 0, -1, 1))); sheet.suspendPaint(); sheet.setColumnWidth(0, 200); sheet.setRowCount(12); sheet.outlineColumn.options({ columnIndex: 0, showIndicator: true, }); var sd = data; sheet.setDataSource(sd); sheet.bindColumn(0, "name"); sheet.setColumnCount(3); sheet.setColumnWidth(0, 300); for (var r = 0; r < sd.length; r++) { var level = sd[r].level; sheet.getCell(r, 0).textIndent(level); } sheet.showRowOutline(false); sheet.outlineColumn.refresh(); sheet.resumePaint(); } 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="$DEMOROOT$/spread/source/data/outlineColumn.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 class="options-container"> <div class="option-group"> <input id="showAll" type="button" value="显示全部" title="显示表格的所有筛选按钮" /> <input id="hideAll" type="button" value="隐藏全部" title="隐藏表格的所有筛选按钮" /> </div> <div class="option-group"> <h4>显示筛选按钮:</h4> <div id="tableColumnsContainer"></div> <h4>筛选对话框可见信息:</h4> <div> <div><label><input type="checkbox" checked id="sortByValue">显示按值排序</label></div> <div><label><input type="checkbox" checked id="sortByColor">显示按颜色排序</label></div> <div><label><input type="checkbox" checked id="filterByColor">显示按颜色筛选</label></div> <div><label><input type="checkbox" checked id="filterByValue">显示按值筛选</label></div> <div><label><input type="checkbox" checked id="listFilterArea">显示列表筛选区域</label></div> </div> </div> </div> </div> </body> </html>
.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-group { margin-bottom: 6px; } .option-group input[type="checkbox"] { margin-right: 6px; } body { position: absolute; top: 0; bottom: 0; left: 0; right: 0; }