数据透视表视图管理

数据透视表视图管理功能允许用户保存和切换多个透视表视图配置。通过视图管理器,可以在不同时间点快速访问已保存的透视表布局、字段设置和样式配置,实现同一数据源的多维度分析视图切换。

概述 本 Demo 展示了如何使用数据透视表视图管理器保存和切换多个视图配置。Demo 中预先保存了四个不同的视图:空透视表视图、季度报表、汽车数量详情和 John 的汽车报表,用户可以通过数据透视表面板快速切换这些视图。 实现思路 创建数据透视表,基于销售数据生成透视表 配置第一个视图并保存为 "Quarterly Report"(季度报表) 应用空视图后重新配置,保存为 "Car Quantity Details"(汽车数量详情) 再次应用空视图后配置第三个视图,保存为 "John Cars Report"(John 的汽车报表) 创建 PivotPanel 面板,用户可在面板中管理视图 最终应用 "Quarterly Report" 视图作为默认显示 代码解析 创建并保存第一个视图 这段代码创建了数据透视表,首先保存了一个空的基线视图,然后添加字段配置生成季度报表,最后使用 views.save() 方法保存当前视图配置。 应用空视图并创建新视图 这段代码演示了如何通过 views.apply() 方法应用已保存的空视图,清空当前透视表配置后重新布局,然后保存为新视图。每个视图可以有不同的主题、布局类型和字段配置。 创建视图管理面板 PivotPanel 构造函数接收三个参数:面板名称、关联的数据透视表和 DOM 容器元素。面板会自动显示视图列表,用户可以点击切换不同视图。 运行效果 页面左侧显示数据透视表,右侧显示透视表面板 面板底部有视图列表,显示已保存的四个视图名称 点击视图名称,然后在输入框中点击复选标记按钮,可应用该视图 切换视图时,透视表的布局、字段、主题和筛选条件会立即更新 不同视图展示了相同数据的不同分析角度:季度销售汇总、汽车数量统计、特定销售人员的数据等 API 参考 pivotTable.views 属性 数据透视表的视图管理器,提供视图的保存、应用和管理功能。 views.save(name) name:视图名称(字符串) 功能:将当前透视表配置保存为指定名称的视图 views.apply(name) name:视图名称(字符串) 功能:应用指定名称的视图配置到当前透视表 views.all() 返回:所有已保存视图的数组 功能:获取所有视图列表 views.get(name) name:视图名称 返回:指定视图的配置对象 功能:查询特定视图的配置 views.remove(name) name:视图名称 功能:删除指定视图 PivotPanel 构造函数 name:面板名称(字符串) pivotTable:关联的数据透视表对象 host:面板容器的 DOM 元素 功能:创建数据透视表面板,提供字段拖拽和视图管理的可视化界面
window.onload = function () { var spread = new GC.Spread.Sheets.Workbook(_getElementById('ss'), { sheetCount: 2 }); initSpread(spread); var pivotLayoutSheet = spread.getSheet(0); initPivotTable(pivotLayoutSheet); }; function initSpread(spread) { spread.suspendPaint(); var sheet = spread.getSheet(1); sheet.name("DataSource"); sheet.setRowCount(117); sheet.setColumnWidth(0, 120); sheet.getCell(-1, 0).formatter("YYYY-mm-DD"); sheet.getRange(-1,4,0,2).formatter("$ #,##0"); let table = sheet.tables.add('tableSales', 0, 0, 117, 6); for(let i=2;i<=117;i++) { sheet.setFormula(i-1,5,'=D'+i+'*E'+i) } table.style(GC.Spread.Sheets.Tables.TableThemes["none"]); sheet.setArray(0, 0, pivotSales); var sheet0 = spread.getSheet(0); sheet0.name("PivotLayout"); sheet0.setValue(0, 1, "在数据透视表面板视图列表中切换内置视图。"); spread.resumePaint(); } function initPivotTable(sheet) { var myPivotTable = sheet.pivotTables.add("myPivotTable", "tableSales", 2, 1, GC.Spread.Pivot.PivotTableLayoutType.outline, GC.Spread.Pivot.PivotTableThemes.light8); myPivotTable.suspendLayout(); var groupInfo = { originFieldName: "date", dateGroups: [{ by: GC.Pivot.DateGroupType.quarters }] }; myPivotTable.group(groupInfo); var emptyPT = "Empty Pivot Table"; myPivotTable.views.save(emptyPT); // Quarterly Report myPivotTable.options.showRowHeader = true; myPivotTable.options.showColumnHeader = true; myPivotTable.add("salesperson", "Salesperson", GC.Spread.Pivot.PivotTableFieldType.rowField); myPivotTable.add("季度 (date)", "Qt", GC.Spread.Pivot.PivotTableFieldType.columnField); myPivotTable.add("total", "Totals", GC.Spread.Pivot.PivotTableFieldType.valueField, GC.Pivot.SubtotalType.sum); let styleItem = { dataOnly: true, references: [{ fieldName: "季度 (date)", items: ["季度3", "季度4"] }] }; let style1 = new GC.Spread.Sheets.Style(); style1.formatter = '0%'; myPivotTable.setStyle(styleItem, style1); myPivotTable.views.save("Quarterly Report"); // Quantity Details myPivotTable.views.apply(emptyPT); myPivotTable.theme(GC.Spread.Pivot.PivotTableThemes.medium1); myPivotTable.options.insertBlankLineAfterEachItem = true; myPivotTable.options.mergeItem = true myPivotTable.layoutType(GC.Spread.Pivot.PivotTableLayoutType.tabular); myPivotTable.add("salesperson", "Salesperson", GC.Spread.Pivot.PivotTableFieldType.rowField); myPivotTable.add("季度 (date)", "Qt", GC.Spread.Pivot.PivotTableFieldType.columnField); myPivotTable.add("quantity", "Totals", GC.Spread.Pivot.PivotTableFieldType.valueField, GC.Pivot.SubtotalType.sum); let style2 = new GC.Spread.Sheets.Style(); style1.formatter = '#,##0'; myPivotTable.setStyle(styleItem, style2); myPivotTable.views.save("Car Quantity Details"); // John Cars Report myPivotTable.views.apply(emptyPT); myPivotTable.options.subtotalPosition = 0; myPivotTable.layoutType(GC.Spread.Pivot.PivotTableLayoutType.compact); myPivotTable.theme(GC.Spread.Pivot.PivotTableThemes.light14); myPivotTable.add("salesperson", "Salesperson", GC.Spread.Pivot.PivotTableFieldType.rowField); myPivotTable.add("car", "Cars", GC.Spread.Pivot.PivotTableFieldType.columnField); myPivotTable.add("季度 (date)", "Qt", GC.Spread.Pivot.PivotTableFieldType.rowField); myPivotTable.add("total", "Totals", GC.Spread.Pivot.PivotTableFieldType.valueField, GC.Pivot.SubtotalType.sum); var labelFilter = {textItem: {isAll: false, list: ["John"]}}; myPivotTable.labelFilter("Salesperson", labelFilter); let style3 = new GC.Spread.Sheets.Style(); style1.formatter = '$ #,##0'; myPivotTable.setStyle(styleItem, style3); myPivotTable.views.save("John Cars Report"); myPivotTable.views.apply("Quarterly Report"); new GC.Spread.Pivot.PivotPanel("myPivotPanel", myPivotTable, document.getElementById("panel")); myPivotTable.resumeLayout(); myPivotTable.autoFitColumn(); } 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-shapes/dist/gc.spread.sheets.shapes.min.js" type="text/javascript"></script> <script src="$DEMOROOT$/zh/purejs/node_modules/@grapecity-software/spread-sheets-pivot-addon/dist/gc.spread.pivot.pivottables.min.js" type="text/javascript"></script> <script src="$DEMOROOT$/spread/source/data/pivot-data.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 class="sample-panel"> <div id="panel"></div> </div> </div> </body> </html>
.sample-tutorial { position: relative; height: 100%; } .sample-spreadsheets { width: calc(100% - 300px); height: 100%; overflow: hidden; float: left; } body { position: absolute; top: 0; bottom: 0; left: 0; right: 0; overflow: hidden; } .sample-panel { float: right; width: 300px; padding: 12px; height: 100%; box-sizing: border-box; background: #fbfbfb; overflow: auto; } .gc-panel { padding: 10px; background-color: rgb(230, 230, 230); } #panel { position: absolute; right: 0; width: 300px; height: 100%; top: 0; } #app { height: 100%; }