Excel 兼容迷你图函数

SpreadJS 支持通过公式创建折线图、柱形图和盈亏图三种 Excel 兼容的迷你图。这些迷你图可直接嵌入单元格中,直观展示数据趋势、对比和正负差异,适合在报表和仪表盘中快速呈现关键指标的走势。

概述 本 Demo 展示了如何使用 SpreadJS 的 Excel 兼容迷你图函数在单元格中创建三种类型的迷你图:折线图、柱形图和盈亏图。Demo 包含三个工作表,分别演示了 LINESPARKLINE、COLUMNSPARKLINE 和 WINLOSSSPARKLINE 函数的使用方法,以及如何通过设置参数自定义迷你图显示效果。 实现思路 创建工作簿并设置 3 个工作表,分别用于展示三种迷你图类型 为每个工作表加载不同的数据源(销售数据、员工绩效数据) 使用 setFormula 方法为单元格设置迷你图公式 通过公式的 setting 参数配置迷你图的显示选项(如显示数据点标记、负值标记) 设置单元格格式、行高列宽,使迷你图显示效果更佳 代码解析 折线迷你图(Line Sparkline) 这段代码为第 3-12 行的数据创建折线迷你图。LINESPARKLINE 函数的第一个参数 C4:H4 指定数据范围,第二个参数 1 表示数据方向为水平(横向),最后的 "{showMarkers:true}" 设置显示数据点标记,让折线上的每个数据点都清晰可见。 柱形迷你图(Column Sparkline) 柱形迷你图的用法与折线图类似,只需将函数名改为 COLUMNSPARKLINE。这里使用了最简化的参数设置,只指定数据范围和方向,SpreadJS 会自动应用默认样式。 盈亏迷你图(Winloss Sparkline) 盈亏迷你图用于展示数据相对于基准值的正负情况。这里的数据范围使用表达式 C6:H6-$C$3,表示将每个数据点减去目标值($C$3 单元格中的值 5),结果为正值显示为向上柱体,负值显示为向下柱体。"{showNegative:true}" 设置让负值柱体使用不同颜色显示,便于快速识别未达标情况。 运行效果 Line Sparkline 工作表:展示各国销售数据趋势,每个国家的销售走势通过折线图直观呈现,数据点标记清晰可见 Column Sparkline 工作表:以柱形图方式展示销售数据对比,每个柱体代表一个时间段的销售额 Winloss Sparkline 工作表:展示员工每周任务完成情况的盈亏图,正值(高于目标)显示为蓝色向上柱体,负值(低于目标)显示为红色向下柱体,便于快速识别绩效表现 API 参考 迷你图函数格式 参数说明: data:迷你图的数据范围引用,如 "A1:C3" dataOrientation:数据方向,0 为垂直,1 为水平 dateAxisData:(可选)日期轴数据范围 dateAxisOrientation:(可选)日期轴方向,0 为垂直,1 为水平 setting:(可选)JSON 格式的字符串,用于配置迷你图显示选项 常用的 setting 选项: showMarkers:是否显示数据点标记(适用于折线图) showNegative:是否使用不同颜色显示负值(适用于盈亏图) showHigh、showLow:是否突出显示最高点和最低点 seriesColor:迷你图的主颜色 negativeColor:负值柱体的颜色 lineWeight:折线的粗细
window.onload = function () { var spread = new GC.Spread.Sheets.Workbook(document.getElementById("ss"), { sheetCount: 3 }); spread.options.allowDynamicArray = true; initSheet(spread.sheets[0]); initSheet1(spread.sheets[1]); initSheet2(spread.sheets[2]); }; function initSheet(sheet) { sheet.name("Line Sparkline"); sheet.suspendPaint(); sheet.setArray(2, 1, data[0]); for(var i=4;i<14;i++) { sheet.setFormula(i-1, 8, '=LINESPARKLINE(C'+i+':H'+i+',1,,,"{showMarkers:true}")'); sheet.setRowHeight(i-1,30); } //format sheet sheet.addSpan(0, 1, 1, 8); sheet.getCell(0, 1).value("Sales by Country").font("bold 15px Arial") .backColor("#DDDDDD"); sheet.setRowHeight(0,45); sheet.getRange(2, 1, 1, 8) .font("bold 13px Arial") .setBorder(new GC.Spread.Sheets.LineBorder("black", GC.Spread.Sheets.LineStyle.thin), { bottom: true }); sheet.getRange(3, 2, 10, 6) .formatter("$#,##0"); for(var j=2;j<8;j++) { sheet.setColumnWidth(j,80); } sheet.setColumnWidth(1,120); sheet.setColumnWidth(8,150); sheet.getRange(0, 0, 15, 9).vAlign(GC.Spread.Sheets.VerticalAlign.center); sheet.resumePaint(); }; function initSheet1(sheet) { sheet.name("Column Sparkline"); sheet.suspendPaint(); sheet.setArray(2, 1, data[1]); for(var i=4;i<14;i++) { sheet.setFormula(i-1, 8, '=COLUMNSPARKLINE(C'+i+':H'+i+',1)'); sheet.setRowHeight(i-1,30); } //format sheet sheet.addSpan(0, 1, 1, 8); sheet.getCell(0, 1).value("Sales Data").font("15px Arial") .backColor("#DDDDDD"); sheet.setRowHeight(0,45); sheet.getRange(2, 1, 1, 8) .font("bold 13px Arial") .setBorder(new GC.Spread.Sheets.LineBorder("black", GC.Spread.Sheets.LineStyle.thin), { bottom: true }); sheet.getRange(3, 2, 10, 6) .formatter("$#,##0"); for(var j=2;j<8;j++) { sheet.setColumnWidth(j,80); } sheet.setColumnWidth(1,120); sheet.setColumnWidth(8,150); sheet.getRange(0, 0, 15, 9).vAlign(GC.Spread.Sheets.VerticalAlign.center); sheet.resumePaint(); }; function initSheet2(sheet) { sheet.name("Winloss Sparkline"); sheet.suspendPaint(); sheet.getCell(2, 1).text("Target (tasks per week):").font("14px Arial"); sheet.getCell(2, 2).value(5).font("bold 14px Arial"); sheet.setArray(4, 1, data[2]); for(var i=6;i<16;i++) { sheet.setFormula(i-1, 8, '=WINLOSSSPARKLINE(C'+i+':H'+i+'-$C$3,1,,,"{showNegative:true}")'); sheet.setRowHeight(i-1,30); } //format sheet sheet.addSpan(0, 1, 1, 8); sheet.getCell(0, 1).value("Employee Performance").font("15px Arial") .backColor("#DDDDDD"); sheet.setRowHeight(0,45); sheet.getRange(4, 1, 1, 8) .font("bold 13px Arial") .setBorder(new GC.Spread.Sheets.LineBorder("black", GC.Spread.Sheets.LineStyle.thin), { bottom: true }); sheet.setColumnWidth(1,180); sheet.setColumnWidth(8,120); sheet.getRange(0, 0, 15, 9).vAlign(GC.Spread.Sheets.VerticalAlign.center); sheet.resumePaint(); };
<!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/standard-sparklines.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; }