超链接单元格

SpreadJS 提供超链接单元格类型,支持在单元格中显示可点击的超链接文本。您可以配置超链接跳转到指定网址,或通过回调函数执行自定义操作。超链接支持设置显示文本、提示信息、链接颜色、已访问颜色等属性,适用于需要快速导航或触发交互操作的场景。

概述 本 Demo 展示了如何创建超链接单元格类型,并配置其显示文本、链接颜色、提示信息等属性。Demo 中演示了两种超链接的使用方式:基础超链接(跳转到网站)和带回调函数的超链接(执行自定义命令),同时还提供了属性面板让用户动态修改超链接样式。 实现思路 创建第一个基础超链接单元格,设置跳转 URL 和显示文本 创建第二个带回调函数的超链接单元格,点击时修改工作表名称和标签颜色 注册自定义命令到命令管理器,供超链接回调执行 绑定选择改变事件,当用户选中超链接单元格时更新属性面板 提供属性修改功能,允许用户动态调整链接颜色、文本和提示信息 代码解析 创建基础超链接单元格 这段代码创建了一个基础超链接单元格。使用 new GC.Spread.Sheets.CellTypes.HyperLink() 创建超链接类型实例,text() 方法设置显示的文本内容,setCellType() 方法将单元格类型应用到指定单元格,value() 方法设置跳转的目标 URL。 创建带回调函数的超链接 这段代码展示了如何为超链接设置点击回调。onClickAction() 方法接收一个函数作为参数,当用户点击超链接时执行。activeOnClick(true) 确保点击时将单元格设置为活动单元格。回调函数通过命令管理器执行预注册的命令。 注册自定义命令 这段代码注册了一个名为 setSheetTabStyle 的自定义命令。execute 函数定义了命令的实际执行逻辑:修改工作表名称为 "Hyperlink",并设置标签颜色为红色。 动态修改超链接属性 通过这些方法可以动态修改超链接的外观和行为。linkColor() 设置未访问链接的颜色,visitedLinkColor() 设置已访问链接的颜色,linkToolTip() 设置鼠标悬停时的提示信息。 运行效果 点击 "SpreadJS Overview" 超链接,浏览器会在新标签页打开 SpreadJS 官方网站 点击 "set sheet tab style" 超链接,工作表名称变为 "Hyperlink",标签颜色变为红色 选中任一超链接单元格后,右侧面板会显示该超链接的当前属性值 在右侧面板中修改属性值并点击"更新"按钮,可以实时改变超链接的颜色、文本和提示信息 API 参考 HyperLink 单元格类型 创建超链接单元格类型实例。 主要方法 text(value) - 设置或获取超链接显示的文本 linkColor(color) - 设置或获取未访问链接的颜色,默认为 #0066cc visitedLinkColor(color) - 设置或获取已访问链接的颜色,默认为 #3399ff linkToolTip(tooltip) - 设置或获取鼠标悬停时的提示信息 onClickAction(callback) - 设置或获取点击超链接时的回调函数 activeOnClick(value) - 设置或获取点击时是否激活单元格,布尔值 应用单元格类型 row、col - 单元格位置 hyperlink - HyperLink 实例 sheetArea - 可选,指定工作表区域,默认为 viewport
var spreadNS = GC.Spread.Sheets; window.onload = function() { var spread = new GC.Spread.Sheets.Workbook(document.getElementById("ss")); initSpread(spread); }; function initSpread(spread) { var sheet = spread.getActiveSheet(); sheet.bind(spreadNS.Events.SelectionChanged, function() { propertyChange(sheet, false); }); sheet.suspendPaint(); sheet.setColumnWidth(2, 130); sheet.setColumnWidth(1, 120); sheet.setRowHeight(1, 50); //set a hyperlink CellType to a cell var h1 = new spreadNS.CellTypes.HyperLink(); h1.text("SpreadJS Overview"); sheet.setCellType(1, 2, h1, spreadNS.SheetArea.viewport); sheet.getCell(1, 2, spreadNS.SheetArea.viewport).value("https://www.grapecity.com.cn/developer/spreadjs").hAlign(spreadNS.HorizontalAlign.left); sheet.setValue(1, 1, "basic hyperlink:"); var h2 = new GC.Spread.Sheets.CellTypes.HyperLink(); //set callback to h2 var h = setCellTypeCallback(spread, sheet, h2); sheet.setCellType(3, 2, h); sheet.getCell(3, 1, GC.Spread.Sheets.SheetArea.viewport).value("hyperLink callback:").hAlign(GC.Spread.Sheets.HorizontalAlign.left); sheet.resumePaint(); spread.commandManager().register("setSheetTabStyle", { canUndo: true, execute: function(context, options, isUndo) { sheet.name("Hyperlink"); sheet.options.sheetTabColor = "red"; } }, null, false, false, false, false); _getElementById("changeProperty").addEventListener('click', function() { propertyChange(sheet, true); }); } function propertyChange(sheet, isSet) { var sels = sheet.getSelections(); if (sels && sels.length > 0) { var sel = getActualRange(sels[0], sheet.getRowCount(), sheet.getColumnCount()); var hyperLinkCellType = sheet.getCellType(sel.row, sel.col); if (!(hyperLinkCellType instanceof spreadNS.CellTypes.HyperLink)) { _getElementById("changeProperty").setAttribute("disabled", "disabled"); return; } if (!isSet) { _getElementById("changeProperty").removeAttribute("disabled"); _getElementById("txtHyperLinkCellLinkColor").value = hyperLinkCellType.linkColor(); _getElementById("txtHyperLinkCellVisitedLinkColor").value = hyperLinkCellType.visitedLinkColor(); _getElementById("txtHyperLinkCellText").value = hyperLinkCellType.text(); _getElementById("txtHyperLinkCellToolTip").value = hyperLinkCellType.linkToolTip(); } else { hyperLinkCellType.linkColor(_getElementById("txtHyperLinkCellLinkColor").value); hyperLinkCellType.visitedLinkColor(_getElementById("txtHyperLinkCellVisitedLinkColor").value); hyperLinkCellType.text(_getElementById("txtHyperLinkCellText").value); hyperLinkCellType.linkToolTip(_getElementById("txtHyperLinkCellToolTip").value); } } sheet.repaint(); } function getActualRange(range, maxRowCount, maxColCount) { var row = range.row < 0 ? 0 : range.row; var col = range.col < 0 ? 0 : range.col; var rowCount = range.rowCount < 0 ? maxRowCount : range.rowCount; var colCount = range.colCount < 0 ? maxColCount : range.colCount; return new spreadNS.Range(row, col, rowCount, colCount); } function setCellTypeCallback(spread, sheet, h) { h.text("set sheet tab style"); h.linkToolTip("set sheet tab style and sheet name"); h.activeOnClick(true); h.onClickAction(function() { spread.commandManager().execute({ cmd: "setSheetTabStyle" }); }); return h; } 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="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-row"> <label>链接颜色:</label> <input id="txtHyperLinkCellLinkColor" /> </div> <div class="option-row"> <label>已访问链接颜色:</label> <input id="txtHyperLinkCellVisitedLinkColor" /> </div> <div class="option-row"> <label>文本:</label> <input id="txtHyperLinkCellText" /> </div> <div class="option-row"> <label>链接工具提示:</label> <input id="txtHyperLinkCellToolTip" /> </div> <div class="option-row"> <input type="button" id="changeProperty" value="更新" /> </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-row { padding-bottom: 12px; } label { padding-bottom: 6px; display: block; } input, select { width: 100%; padding: 4px 8px; box-sizing: border-box; } input[type=checkbox] { width: auto; } input[type=checkbox]+label { display: inline-block; width: auto; } body { position: absolute; top: 0; bottom: 0; left: 0; right: 0; }