前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Go-Excelize API源码阅读(十)—— SetActiveSheet(index int)

Go-Excelize API源码阅读(十)—— SetActiveSheet(index int)

作者头像
Regan Yue
发布2022-09-20 14:59:25
3240
发布2022-09-20 14:59:25
举报
文章被收录于专栏:ReganYue's Blog

Go-Excelize API源码阅读(十)—— SetActiveSheet(index int)

开源摘星计划(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 或更高版本。

二、SetActiveSheet(index int)
代码语言:javascript
复制
func (f *File) SetActiveSheet(index int)

该API的作用是根据给定的索引值设置默认工作表,索引的值应该大于等于 0 且小于工作簿所包含的累积工作表总数。

废话不多说,上源码。

代码语言:javascript
复制
func (f *File) SetActiveSheet(index int) {
	if index < 0 {
		index = 0
	}
	wb := f.workbookReader()
	for activeTab := range wb.Sheets.Sheet {
		if activeTab == index {
			if wb.BookViews == nil {
				wb.BookViews = &xlsxBookViews{}
			}
			if len(wb.BookViews.WorkBookView) > 0 {
				wb.BookViews.WorkBookView[0].ActiveTab = activeTab
			} else {
				wb.BookViews.WorkBookView = append(wb.BookViews.WorkBookView, xlsxWorkBookView{
					ActiveTab: activeTab,
				})
			}
		}
	}
	for idx, name := range f.GetSheetList() {
		ws, err := f.workSheetReader(name)
		if err != nil {
			// Chartsheet, macrosheet or dialogsheet
			return
		}
		if ws.SheetViews == nil {
			ws.SheetViews = &xlsxSheetViews{
				SheetView: []xlsxSheetView{{WorkbookViewID: 0}},
			}
		}
		if len(ws.SheetViews.SheetView) > 0 {
			ws.SheetViews.SheetView[0].TabSelected = false
		}
		if index == idx {
			if len(ws.SheetViews.SheetView) > 0 {
				ws.SheetViews.SheetView[0].TabSelected = true
			} else {
				ws.SheetViews.SheetView = append(ws.SheetViews.SheetView, xlsxSheetView{
					TabSelected: true,
				})
			}
		}
	}
}
代码语言:javascript
复制
	if index < 0 {
		index = 0
	}

这段代码不必多讲,如果传来的参数值是小于0的话,就将下标为0的工作表设置为默认工作表。 下面进入第一个for循环。

代码语言:javascript
复制
	wb := f.workbookReader()
	for activeTab := range wb.Sheets.Sheet {
		if activeTab == index {
			if wb.BookViews == nil {
				wb.BookViews = &xlsxBookViews{}
			}
			if len(wb.BookViews.WorkBookView) > 0 {
				wb.BookViews.WorkBookView[0].ActiveTab = activeTab
			} else {
				wb.BookViews.WorkBookView = append(wb.BookViews.WorkBookView, xlsxWorkBookView{
					ActiveTab: activeTab,
				})
			}
		}
	}

这段代码的作用是遍历工作簿的所有工作表,将需要设置为默认工作表的那张工作表获取,然后进行视图方面的操作。

代码语言:javascript
复制
			if wb.BookViews == nil {
				wb.BookViews = &xlsxBookViews{}
			}

这段代码是当工作簿的工作表视图的集合不存在时,建立工作表视图。

SheetViews 对象 (Excel) | Microsoft Docs https://docs.microsoft.com/zh-cn/office/vba/api/excel.sheetviews

看下面这段代码:

代码语言:javascript
复制
if len(wb.BookViews.WorkBookView) > 0 {
	wb.BookViews.WorkBookView[0].ActiveTab = activeTab
} else {
	wb.BookViews.WorkBookView = append(wb.BookViews.WorkBookView, xlsxWorkBookView{
		ActiveTab: activeTab,
	})
}

如果工作簿的工作表视图的集合存在且不为空,那么将需要设置为默认工作表的那张工作表放在工作表视图队列的首位。

如果为空,就直接附加到工作表视图队列即可,毕竟本来队伍是空的,你不插队,直接排队也是第一位。

再来看看第二个for循环:

代码语言:javascript
复制
for idx, name := range f.GetSheetList() {
	ws, err := f.workSheetReader(name)
	if err != nil {
		// Chartsheet, macrosheet or dialogsheet
		return
	}
	if ws.SheetViews == nil {
		ws.SheetViews = &xlsxSheetViews{
			SheetView: []xlsxSheetView{{WorkbookViewID: 0}},
		}
	}
	if len(ws.SheetViews.SheetView) > 0 {
		ws.SheetViews.SheetView[0].TabSelected = false
	}
	if index == idx {
		if len(ws.SheetViews.SheetView) > 0 {
			ws.SheetViews.SheetView[0].TabSelected = true
		} else {
			ws.SheetViews.SheetView = append(ws.SheetViews.SheetView, xlsxSheetView{
				TabSelected: true,
			})
		}
	}
}

这段代码的主要功能是遍历Excel图表、Excel对话框工作表、宏表、普通的工作表。然后对这些工作表的视图进行操作。

代码语言:javascript
复制
	ws, err := f.workSheetReader(name)
	if err != nil {
		// Chartsheet, macrosheet or dialogsheet
		return
	}
	if ws.SheetViews == nil {
		ws.SheetViews = &xlsxSheetViews{
			SheetView: []xlsxSheetView{{WorkbookViewID: 0}},
		}
	}

这段就是如果工作表的视图不存在,就创建一个ID为0的工作表视图。

代码语言:javascript
复制
if len(ws.SheetViews.SheetView) > 0 {
	ws.SheetViews.SheetView[0].TabSelected = false
}

这段代码的功能是当工作表的视图大于0的时候,将第一个视图的TabSelected 属性置为false。应该是不选定该视图。

SheetView.TabSelected 属性 (DocumentFormat.OpenXml.Spreadsheet) | Microsoft Docs https://docs.microsoft.com/zh-cn/dotnet/api/documentformat.openxml.spreadsheet.sheetview.tabselected?view=openxml-2.8.1

代码语言:javascript
复制
if index == idx {
	if len(ws.SheetViews.SheetView) > 0 {
		ws.SheetViews.SheetView[0].TabSelected = true
	} else {
		ws.SheetViews.SheetView = append(ws.SheetViews.SheetView, xlsxSheetView{
			TabSelected: true,
		})
	}
}

如果要设置为默认工作表的工作表下标与遍历到的工作表下标一致,如果视图存在,则选定默认工作表的视图TabSelected 属性为True,应该是能够首先看到该视图。如果视图不存在,就创建一个视图,然后让该视图的TabSelected为True。

三、结语 这里是老岳,这是Go语言相关源码的解读第十篇,我会不断努力,给大家带来更多类似的文章,恳请大家不吝赐教。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-08-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Go-Excelize API源码阅读(十)—— SetActiveSheet(index int)
    • 一、Go-Excelize简介
      • 二、SetActiveSheet(index int)
      相关产品与服务
      边缘可用区
      腾讯云边缘可用区(TencentCloud Edge Zone,TEZ)是腾讯云的本地扩展,适用于解决计算、存储和服务可用性问题。腾讯云边缘可用区可为您带来云的诸多优势,例如弹性、可扩展性和安全性。借助腾讯云边缘可用区,您可以在靠近最终用户的地理位置运行对延迟敏感的应用程序,基本消除延迟问题。腾讯云边缘可用区提供与中心节点一致的体验,助力业务下沉,具备更低延时、更广覆盖、更少成本等特点。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档