区域模板迷你图

区域模板迷你图(RANGEBLOCKSPARKLINE)允许在单元格中以迷你图形式渲染整个区域模板,并将模板与数据动态绑定。通过这种方式,可以将复杂的数据展示布局复用到多个单元格中,实现数据的可视化呈现。

概述 本 Demo 展示了如何使用 RANGEBLOCKSPARKLINE 函数创建区域模板迷你图。通过定义模板区域和使用 OBJECT 函数绑定数据,实现了产品信息的动态展示。Demo 中创建了 3 个工作表:RenderSheet(渲染表)用于显示迷你图,TemplateSheet(模板表)定义显示模板,DataSheet(数据表)存储产品数据。 实现思路 初始化三个工作表:RenderSheet、TemplateSheet、DataSheet 使用 fromJSON 加载预设的模板结构和产品数据 为模板中的图片单元格设置绑定路径 在渲染表中使用 RANGEBLOCKSPARKLINE 公式,结合 OBJECT 函数将数据动态绑定到模板上 代码解析 初始化模板表 这段代码加载模板结构,并为图片单元格设置格式和绑定路径。setBindingPath(2,1,"Image") 将第 2 行第 1 列的单元格与数据的 Image 属性绑定,模板会根据数据中的 Image 字段显示对应的图片。 创建渲染表中的迷你图 关键在于 RANGEBLOCKSPARKLINE 公式: TemplateSheet!A2:M11:指定模板区域 OBJECT(product_table[#Headers], INDEX(...)):创建数据对象 product_table[#Headers]:获取表格的列标题作为属性名 INDEX(product_table[#Data],ROW()-1,SEQUENCE(...)):获取当前行的所有数据作为属性值 ROW()-1:根据当前行号动态获取对应的产品数据 数据绑定机制 模板中的绑定路径(如 "Image")会与 OBJECT 函数创建的对象属性自动匹配。当迷你图渲染时,数据会填充到模板的对应位置,形成完整的产品卡片。 运行效果 RenderSheet 中显示标题 "Top 5 Products (by units sold)" 下方展示 5 个产品卡片,每个卡片包含产品图片、名称、销量等信息 每个产品卡片都使用相同的模板,但绑定不同的数据行 卡片高度为 250 像素,列宽为 1200 像素 API 参考 RANGEBLOCKSPARKLINE 函数 template_range:模板区域的引用,如 TemplateSheet!A2:M11 data_expr:单元格引用或 OBJECT 函数的结果,表示模板绑定的对象数据 OBJECT 函数 定义一个对象,参数必须是键值对顺序。支持三种模式: 一对一:OBJECT("name", "value") 多对多:OBJECT(A1:A3, B1:B3) 属性范围和值范围 一对多:OBJECT("name", array1, "age", array2) 一个属性对应数组 setBindingPath 方法 为单元格设置绑定路径,用于单元格级数据绑定。 row、col:单元格位置 path:绑定路径字符串,如 "Image"
var spreadNS = GC.Spread.Sheets; window.onload = function () { var spread = new GC.Spread.Sheets.Workbook(document.getElementById("ss"), { sheetCount: 3 }); spread.options.allowDynamicArray = true; initSpread(spread); }; function initSpread(spread) { var renderSheet = spread.getSheet(0); var templateSheet = spread.getSheet(1); var dataSheet = spread.getSheet(2); spread.options.scrollByPixel = true; spread.options.scrollPixel = 10; spread.suspendPaint(); initTemplateSheet(templateSheet); initDataSheet(dataSheet); initRenderSheet(renderSheet); spread.resumePaint(); } function initRenderSheet (renderSheet) { renderSheet.name("RenderSheet"); renderSheet.setColumnCount(50); renderSheet.setColumnWidth(0, 1200); renderSheet.getCell(0, 0).value("Top 5 Products (by units sold)") .font("20px Arial").vAlign(GC.Spread.Sheets.VerticalAlign.center) .foreColor("white").backColor("#82bc00"); renderSheet.setRowHeight(0, 35); for (var i = 1; i < 6; i++) { renderSheet.setRowHeight(i, 250); renderSheet.setFormula(i, 0, 'RANGEBLOCKSPARKLINE(TemplateSheet!A2:M11, OBJECT(product_table[#Headers], INDEX(product_table[#Data],ROW()-1,SEQUENCE(COUNTA(product_table[#Headers]),1))))'); } } function initTemplateSheet (templateSheet) { templateSheet.fromJSON(templateJson); templateSheet.name("TemplateSheet"); templateSheet.setFormatter(2,1,"=IMAGE(\"$DEMOROOT$/spread/source/images/products/\"&@)"); templateSheet.setBindingPath(2,1,"Image"); } function initDataSheet (dataSheet) { dataSheet.fromJSON(dataJson); }
<!doctype html> <html style="height:100%;font-size:14px;"> <head> <meta charset="utf-8" /> <meta name="spreadjs culture" content="zh-cn" /> <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$/spread/source/js/license.js" type="text/javascript"></script> <script src="$DEMOROOT$/spread/source/data/range-block-data.js" type="text/javascript"></script> <script src="$DEMOROOT$/spread/source/data/range-block-template.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="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-tutorial { position: relative; height: 100%; overflow: hidden; } body { position: absolute; top: 0; bottom: 0; left: 0; right: 0; }