年份迷你图

年份迷你图以日历热力图的形式展示一整年的数据趋势,通过颜色深浅直观呈现数据分布。支持两种颜色设置方式:使用渐变色方案自动映射数据值,或从单元格范围读取自定义颜色。

概述 本 Demo 展示了如何使用 YearSparkline 函数创建年份迷你图,以日历热力图的形式可视化全年数据。Demo 包含两个工作表:第一个工作表使用渐变色方案(根据数据值自动映射颜色),第二个工作表从单元格范围读取自定义颜色。 实现思路 创建两个工作表,分别演示两种颜色设置方式 为每个工作表生成一年的日期数据(366 天)和随机数值 第一个工作表使用 4 个颜色参数,根据数据值自动渐变着色 第二个工作表添加第三列颜色数据,使用 colorRange 参数从单元格读取颜色 使用 setFormula 方法在指定单元格中插入 YearSparkline 公式 代码解析 使用渐变色方案创建年份迷你图 这段代码使用 YearSparkline 公式的第一种格式,传入年份、数据范围和 4 个颜色参数。其中: emptyColor ("#6d6d6d") 用于填充没有数据或值为 0 的日期 startColor ("#c4c4c4") 用于填充值最小的日期 middleColor ("#979797") 用于填充值为平均值(最大值+最小值)/2 的日期 endColor ("#f3f3f3") 用于填充值最大的日期 使用颜色范围创建年份迷你图 这段代码先为每个日期设置对应的颜色值到第三列,然后使用 YearSparkline 公式的第二种格式,通过 colorRange 参数(C2:C366)引用颜色单元格范围,实现自定义颜色控制。 运行效果 第一个工作表(No ColorRange):显示全年数据热力图,颜色从深灰到浅灰渐变,数据值越大颜色越浅 第二个工作表(ColorRange):显示全年数据热力图,每个日期使用不同的颜色,呈现彩色效果 年份迷你图以 54 周 × 7 天的日历格式展示,横向为周(1-54),纵向为星期(周日-周六) 可以直观看出数据的分布规律和趋势 API 参考 YearSparkline 公式格式 参数说明: year:数字类型,表示年份,例如 2024 dataRange:单元格引用,第一列为日期,第二列为数值,例如 "A2:B367" emptyColor:颜色字符串,填充无数据或值为 0 的日期 startColor:颜色字符串,填充值最小的日期 middleColor:颜色字符串,填充平均值的日期 endColor:颜色字符串,填充值最大的日期 colorRange:单元格引用,引用的单元格包含颜色字符串
window.onload = function () { var spread = new GC.Spread.Sheets.Workbook(document.getElementById("ss"), { sheetCount: 2 }); initNormalSheet(spread); initColorRangeSheet(spread); }; function initNormalSheet(spread) { var sheet = spread.sheets[0]; sheet.name("No ColorRange"); sheet.suspendPaint(); sheet.setFormatter(-1, 0, "yyyy-MM-dd"); sheet.setColumnWidth(0, 80); sheet.setColumnWidth(1, 60); sheet.setColumnWidth(3, 600); sheet.addSpan(2, 3, 4, 1); sheet.setRowCount(366); var rowCount = sheet.getRowCount(); sheet.setText(0,0,"Date"); sheet.setText(0,1,"Value"); sheet.setText(0,3,"Diagram"); var currentYear = new Date().getFullYear(); for (var row = 1; row < rowCount; row++) { sheet.setValue(row, 0, new Date(currentYear, 0, row + 1)); sheet.setValue(row, 1, Math.round(Math.random() * 100)); } sheet.getRange(0,0,366,4).hAlign(GC.Spread.Sheets.HorizontalAlign.center); sheet.getRange(0,0,1,4).backColor("#999999").foreColor("#FFFFFF"); //year sparkline sheet.setFormula(2, 3, '=YearSparkline('+currentYear+', A2:B' + rowCount + ', "#6d6d6d", "#c4c4c4", "#979797", "#f3f3f3")'); sheet.resumePaint(); } function initColorRangeSheet(spread) { var sheet = spread.sheets[1]; sheet.name("ColorRange"); sheet.suspendPaint(); sheet.setFormatter(-1, 0, "yyyy-MM-dd"); sheet.setColumnWidth(0, 80); sheet.setColumnWidth(1, 60); sheet.setColumnWidth(3, 600); sheet.setRowCount(366); var rowCount = sheet.getRowCount(); sheet.setText(0,0,"Date"); sheet.setText(0,1,"Value"); sheet.setText(0,2,"Color"); sheet.setText(0,3,"Diagram"); sheet.addSpan(2, 3, 4, 1); var rowCount = sheet.getRowCount(); var currentYear = new Date().getFullYear(); var colorList = ["#82bc00", "#9fc94c", "#00C2D6", "#d2e4a7", "#e9f2d2", "#ffedd3", "#ffdba8", "#ffc97d", "#feb850", "#f7a711","#00c2d6"]; for (var row = 1; row < rowCount; row++) { sheet.setValue(row, 0, new Date(currentYear, 0, row + 1)); sheet.setValue(row, 1, Math.round(Math.random() * 100)); sheet.setValue(row, 2, colorList[Math.round(Math.random() * 10)]) } sheet.getRange(0,0,366,4).hAlign(GC.Spread.Sheets.HorizontalAlign.center); sheet.getRange(0,0,1,4).backColor("#999999").foreColor("#FFFFFF"); //year sparkline sheet.setFormula(2, 3, '=YearSparkline('+currentYear+', A2:B' + rowCount + ', C2:C366)'); 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="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; }