Go-Excelize API源码阅读(三十九)——SetCellHyperLink

news2024/9/29 19:20:32

Go-Excelize API源码阅读(三十九)——SetCellHyperLink

开源摘星计划(WeOpen Star) 是由腾源会 2022 年推出的全新项目,旨在为开源人提供成长激励,为开源项目提供成长支持,助力开发者更好地了解开源,更快地跨越鸿沟,参与到开源的具体贡献与实践中。

不管你是开源萌新,还是希望更深度参与开源贡献的老兵,跟随“开源摘星计划”开启你的开源之旅,从一篇学习笔记、到一段代码的提交,不断挖掘自己的潜能,最终成长为开源社区的“闪亮之星”。

我们将同你一起,探索更多的可能性!

项目地址: WeOpen-Star:https://github.com/weopenprojects/WeOpen-Star

一、Go-Excelize简介

Excelize 是 Go 语言编写的用于操作 Office Excel 文档基础库,基于 ECMA-376,ISO/IEC 29500 国际标准。可以使用它来读取、写入由 Microsoft Excel™ 2007 及以上版本创建的电子表格文档。支持 XLAM / XLSM / XLSX / XLTM / XLTX 等多种文档格式,高度兼容带有样式、图片(表)、透视表、切片器等复杂组件的文档,并提供流式读写 API,用于处理包含大规模数据的工作簿。可应用于各类报表平台、云计算、边缘计算等系统。使用本类库要求使用的 Go 语言为 1.15 或更高版本。

二、SetCellHyperLink

func (f *File) SetCellHyperLink(sheet, cell, link, linkType string, opts ...HyperlinkOpts) error

根据给定的工作表、单元格坐标、链接资源和资源类型设置单元格的超链接。资源类型分为外部链接地址 External 和工作簿内部位置链接 Location 两种。每个工作表中的包含最大超链接限制为 65530 个。该方法仅设置单元格的超链接而不影响单元格的值,若需设置单元格的值,请通过 SetCellStyle 或 SetSheetRow 等函数另行设置。

例1,为名为 Sheet1 的工作表 A3 单元格添加外部链接:

display, tooltip := "https://github.com/xuri/excelize", "Excelize on GitHub"
if err := f.SetCellHyperLink("Sheet1", "A3",
    "https://github.com/xuri/excelize", "External", excelize.HyperlinkOpts{
        Display: &display,
        Tooltip: &tooltip,
    }); err != nil {
    fmt.Println(err)
}
// 为单元格设置字体和下划线样式
style, err := f.NewStyle(&excelize.Style{
    Font: &excelize.Font{Color: "#1265BE", Underline: "single"},
})
if err != nil {
    fmt.Println(err)
}
err = f.SetCellStyle("Sheet1", "A3", "A3", style)

例2,为名为 Sheet1 的工作表 A3 单元格添加内部位置链接:

err := f.SetCellHyperLink("Sheet1", "A3", "Sheet1!A40", "Location")

废话少说,直接看代码:

func (f *File) SetCellHyperLink(sheet, cell, link, linkType string, opts ...HyperlinkOpts) error {
	// Check for correct cell name
	if _, _, err := SplitCellName(cell); err != nil {
		return err
	}

	ws, err := f.workSheetReader(sheet)
	if err != nil {
		return err
	}
	if cell, err = f.mergeCellsParser(ws, cell); err != nil {
		return err
	}

	var linkData xlsxHyperlink
	idx := -1
	if ws.Hyperlinks == nil {
		ws.Hyperlinks = new(xlsxHyperlinks)
	}
	for i, hyperlink := range ws.Hyperlinks.Hyperlink {
		if hyperlink.Ref == cell {
			idx = i
			linkData = hyperlink
			break
		}
	}

	if len(ws.Hyperlinks.Hyperlink) > TotalSheetHyperlinks {
		return ErrTotalSheetHyperlinks
	}

	switch linkType {
	case "External":
		sheetPath, _ := f.getSheetXMLPath(sheet)
		sheetRels := "xl/worksheets/_rels/" + strings.TrimPrefix(sheetPath, "xl/worksheets/") + ".rels"
		rID := f.setRels(linkData.RID, sheetRels, SourceRelationshipHyperLink, link, linkType)
		linkData = xlsxHyperlink{
			Ref: cell,
		}
		linkData.RID = "rId" + strconv.Itoa(rID)
		f.addSheetNameSpace(sheet, SourceRelationship)
	case "Location":
		linkData = xlsxHyperlink{
			Ref:      cell,
			Location: link,
		}
	default:
		return fmt.Errorf("invalid link type %q", linkType)
	}

	for _, o := range opts {
		if o.Display != nil {
			linkData.Display = *o.Display
		}
		if o.Tooltip != nil {
			linkData.Tooltip = *o.Tooltip
		}
	}
	if idx == -1 {
		ws.Hyperlinks.Hyperlink = append(ws.Hyperlinks.Hyperlink, linkData)
		return err
	}
	ws.Hyperlinks.Hyperlink[idx] = linkData
	return err
}

在这里插入图片描述
这段代码是用来检测单元格名称是否正确。

mergeCellsParser通过给定的单元格引用来解析工作表中的合并单元格。
在这里插入图片描述
建立一个xlsxHyperlink对象,将索引idx设置为-1,如果工作表对象ws的Hyperlinks超链接字段为nil,就new一个xlsxHyperlinks。
在这里插入图片描述

然后遍历ws.Hyperlinks.Hyperlink超链接对象,如果超链接的Ref字段为我们的参数cell,即放置超链接的单元格。
我们就将超链接在xlsxHyperlink切片内的超链接和索引都保存。

每个工作表中的包含最大超链接限制为 65530 个。如果超过了就返回ErrTotalSheetHyperlinks错误。
在这里插入图片描述在这里插入图片描述
如果linkType为"External",说明是外部链接,我们就将外部链接保存即可。

如果linkType为"Location",说明是内部链接,我们将cell和link保存至linkData即可。

在这里插入图片描述
遍历超链接属性opts,如果其Display属性和Tooltip属性不为nil,我们就将他们给linkData。
在这里插入图片描述
如果到此idx还为-1,说明下面这段代码没有达成:

	for i, hyperlink := range ws.Hyperlinks.Hyperlink {
		if hyperlink.Ref == cell {
			idx = i
			linkData = hyperlink
			break
		}
	}

最后将linkData放入ws.Hyperlinks.Hyperlink切片之中。

结语

这是Excelize API阅读的第三十九篇,鉴于本人技术水平有限,如有错误,烦请指出斧正!感谢!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/55350.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Mysql存储过程和游标的一点理解

最近学习数据库语言sql,学到了存储过程和游标这一块,上课一点没听,可以说是全程懵逼。不过好在有个课后的实验,然而cmd中的报错往往极其粗糙,只会告诉你什么附近有错(有时候还是错的)&#xff0…

大一新生HTML期末作业 个人旅游图片博客HTML5 用DIV+CSS技术设计的个人网站(web前端网页制作课作业)

🎉精彩专栏推荐👇🏻👇🏻👇🏻 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业…

Centos7安装部署openLDAP并springboot集成openLDAP

这里安装部署都是基于docker的,供参考 安装docker 1、yum list docker 2、yum install -y yum-utils device-mapper-persistent-data lvm2 3、yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 4、yum install do…

斐波那契数列的矩阵乘法方法

1、求斐波那契数列矩阵乘法的方法 1.1 斐波那契数列的线性求解&#xff08;O(n)O(n)O(n)&#xff09;的方法 //斐波那契数列&#xff1a;1 1 2 3 5 8 ... int fibonacci(int n) {if (n < 1) return 0;if (n 1 || n 2) return 1;int a 1, b 1, c 0;for (int i 3; i &…

K_A08_002 基于 STM32等单片机驱动MAX1508模块按键控制直流电机正反转加减速启停

目录 一、资源说明 二、基本参数 1、参数 2、引脚说明 3、驱动说明 MAX1508模块驱动时序 对应程序: PWM信号 四、部分代码说明 接线说明 1、STC89C52RCMAX1508模块 2、STM32F103C8T6MAX1508模块 五、基础知识学习与相关资料下载 六、视频效果展示与程序资料获取 七、项目…

[附源码]计算机毕业设计springboot校园生活服务平台

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

PowerBI工作区连接Log Aanlytics

其实在2021.6月的时候微软已经更新了该功能&#xff0c;通过PowerBI高级容量工作区连接Log Analytics工作区&#xff0c;从而分析历史活动数据。并且在应用市场创建了一个模板应用方便分析日志数据。使用该模板可以&#xff1a; • 观察历史使用趋势 • 按照范围、容量、数据集…

常用通讯电平转换电路整理

常用通讯电平转换电路整理5V转3.3V 当5V端信号为低电平时&#xff0c;R4不导通&#xff0c;Q5基极高电平&#xff0c;Q5导通&#xff0c;Q5的集电极被拉低&#xff0c;3.3V端被拉低。R6在Q5导通时起到限流作用。 优势&#xff1a; 便宜&#xff1a;三极管容易常见并且容易采购&…

LOLBins免杀技术研究及样本分析

一、前言 自病毒木马诞生起&#xff0c;杀毒软件与病毒木马的斗争一直都没有停止过。从特征码查杀&#xff0c;到现在的人工智能查杀&#xff0c;杀毒软件的查杀技术也是越来越复杂。但是病毒木马却仍然层出不&#xff0c;这是因为大部分病毒木马使用了免杀技术。 免杀技术全称…

2023最新SSM计算机毕业设计选题大全(附源码+LW)之java高校教师工作量的核算的设计与实现g6ipj

大学计算机专业毕业的&#xff0c;实际上到了毕业的时候&#xff0c;基本属于会与不会之间。说会&#xff0c;是因为学了整套的理论和方法&#xff0c;就是所谓的科班出身。说不会&#xff0c;是因为实践能力极差。 不会的问题&#xff0c;集中体现在毕设的时候&#xff0c;系…

2023年天津天狮学院专升本市场营销专业《市场营销学》考试大纲

2023年天津天狮学院高职升本市场营销专业入学考试《市场营销学》考试大纲一、考试性质 《市场营销学》专业课程考试是天津天狮学院市场营销专业高职升本入学考试的必考科目之一&#xff0c;其性质是考核学生是否达到了升入本科继续学习的要求而进行的选拔性考试。《市场营销学》…

【图像分割】DeepLabV3+

文章目录0. 介绍1. DeepLabV32. 结论3. 参考0. 介绍 DeepLabV3文章&#xff1a;https://arxiv.org/pdf/1802.02611.pdf DeepLabV3代码&#xff1a;https://github.com/VainF/DeepLabV3Plus-Pytorch 语义分割的两个主要问题&#xff1a; 物体的多尺度问题。多次下采样会造成特…

ABAP 计算时间差

源码 FUNCTION zfm_date_difference. *“---------------------------------------------------------------------- "“本地接口&#xff1a; *” IMPORTING *” VALUE(IV_DATE_BEG) TYPE SY-DATUM *" VALUE(IV_TIME_BEG) TYPE SY-UZEIT *" VALUE(IV_DATE_END)…

【赛后总结】第十三届服务外包创新创业大赛总结——A14

目录前言组队&#xff06;选题分工&项目推进提交材料&项目答辩区域赛初赛区域赛决赛全国总决赛写在最后前言 先摆两个参赛视频 初赛视频 决赛视频 比赛已经过去几个月了&#xff0c;也算是想起来这个比赛可以写一个总结了。在历时8个月左右的时间之后&#xff0c;我们…

香菇多糖-四甲基罗丹明 Lentinan-TRITC 四甲基罗丹明-PEG-香菇多糖

香菇多糖-四甲基罗丹明 Lentinan-TRITC 四甲基罗丹明-PEG-香菇多糖 中文名称&#xff1a;香菇多糖-四甲基罗丹明 英文名称&#xff1a;Lentinan-TRITC 别称&#xff1a;生物素修饰香菇多糖&#xff0c;生物素-香菇多糖 香菇多糖-聚乙二醇-四甲基罗丹明 TRITC-PEG-Lent…

[附源码]计算机毕业设计JAVA校园新闻管理系统

[附源码]计算机毕业设计JAVA校园新闻管理系统 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybati…

带你走进脚本世界,ijkplayer之【init-ios.sh】脚本分析

前言 集成ijkplayer&#xff0c;需要执行脚本init-ios.sh&#xff0c;那么init-ios.sh脚本干嘛用的了,花了半天时间&#xff0c;学习了下shell脚本&#xff0c;感觉脚本语言学起来还是比较容易上手的&#xff0c;现在仅仅能看懂了&#xff0c;但是要自己写&#xff0c;还需要花…

2023最新SSM计算机毕业设计选题大全(附源码+LW)之java高校学生社团管理系统n4pcu

要开始我们毕业设计的第一步的关键就是选好我们的课题&#xff0c;有的同学开始选题的时候想着按照传统的课题延续下去&#xff0c;在设计题目时&#xff0c;不要过于笼统广泛&#xff0c;选择题目其实并不难&#xff0c;要多从自身的角度出发&#xff0c;要结合你们当前所处的…

VTK网格细分-vtkAdaptiveSubdivisionFilter

欢迎大家加入社区&#xff0c;雪易VTK社区-CSDN社区云 前言&#xff1a;此博文主要分享VTK中关于细分网格的相关Filter&#xff0c;同时希望能给其他小伙伴一些帮助。 小结&#xff1a;VTK中关于网格细分的Filter包括vtkSubdivisionFilter和vtkAdaptiveSubdivisionFilter。其…

【服务器数据恢复】EMC Unity存储误操作删除数据卷的数据恢复案例

服务器数据恢复环境&#xff1a; EMC Unity某型号存储&#xff1b; 存储设备连接的2台硬盘柜上共创建2组独立的POOL&#xff1b; 2组POOL共包含21块520字节的硬盘。 服务器故障&检测&#xff1a; 误操作删除了2组POOL上的部分数据卷&#xff0c;和用户沟通后得知有5个数据…