当前位置:网站首页>Go-Excelize API源码阅读(十)—— SetActiveSheet(index int)
Go-Excelize API源码阅读(十)—— SetActiveSheet(index int)
2022-08-08 04:43:00 【ReganYue】
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)
func (f *File) SetActiveSheet(index int)
该API的作用是根据给定的索引值设置默认工作表,索引的值应该大于等于 0 且小于工作簿所包含的累积工作表总数。
废话不多说,上源码。
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,
})
}
}
}
}
if index < 0 {
index = 0
}
这段代码不必多讲,如果传来的参数值是小于0的话,就将下标为0的工作表设置为默认工作表。
下面进入第一个for循环。
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,
})
}
}
}
这段代码的作用是遍历工作簿的所有工作表,将需要设置为默认工作表的那张工作表获取,然后进行视图方面的操作。
if wb.BookViews == nil {
wb.BookViews = &xlsxBookViews{
}
}
这段代码是当工作簿的工作表视图的集合不存在时,建立工作表视图。
SheetViews 对象 (Excel) | Microsoft Docs
https://docs.microsoft.com/zh-cn/office/vba/api/excel.sheetviews
看下面这段代码:
if len(wb.BookViews.WorkBookView) > 0 {
wb.BookViews.WorkBookView[0].ActiveTab = activeTab
} else {
wb.BookViews.WorkBookView = append(wb.BookViews.WorkBookView, xlsxWorkBookView{
ActiveTab: activeTab,
})
}
如果工作簿的工作表视图的集合存在且不为空,那么将需要设置为默认工作表的那张工作表放在工作表视图队列的首位。
如果为空,就直接附加到工作表视图队列即可,毕竟本来队伍是空的,你不插队,直接排队也是第一位。
再来看看第二个for循环:
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对话框工作表、宏表、普通的工作表。然后对这些工作表的视图进行操作。
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的工作表视图。
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
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语言相关源码的解读第十篇,我会不断努力,给大家带来更多类似的文章,恳请大家不吝赐教。
边栏推荐
- awk语法-03-awk表达式(if语句、while循环、for循环)、awk中执行shell命令
- [Graph Basics] How to Define Few-Shot Learning on Heterogeneous Graphs: Heterogeneous Graph Few-Shot Learning
- fail-fast 和 fail-safe 快速学习
- 【论文分享】异质图上的小样本学习:HG-Meta: Graph Meta-learning over Heterogeneous Graphs
- How to avoid bugs as much as possible
- MYSQL导出数据字典
- 高薪程序员&面试题精讲系列134之微服务网关有哪些限流算法?如何实现限流?
- Flatten multidimensional array to one dimension
- 分类、目标检测、语义分割、实例分割的区别
- Servlet---ServletConfig类使用介绍
猜你喜欢

拒绝“内卷”跃迁软件测试最大门槛,我是如何从月薪8K到15K的?

XDR技术

MySQL从入门到入土【20W字收藏篇】
bpftrace:简便输出调试信息

L3-006 Slash in the wind

Entering the world of audio and video - RGB and YUV formats

一文带你彻底了解synchronized 和 Lock

Young freshmen who yearn for open source | The guide to avoiding pits from open source to employment is here!

Research on Blind Recognition of Digital Modulated Signal Based on MindSpore Framework

MySQL4(多表查询)
随机推荐
Amazon Cloud Technology Build On Learning Experience
中间件的一些坑记录
MySQL4(多表查询)
关于如何做选择
NorFlash的存储原理
MindFusion.WPF Pack 2022.R1
《动机与人格》笔记(二)——认识和理解的欲望
分类、目标检测、语义分割、实例分割的区别
tracepoint: 定义函数及调用示例
Flatten multidimensional array to one dimension
Usage of topk()/eq( ) / gt( ) / lt( ) / t( )
BMS 产品功能和详细设计规格
Qt 日志模块的个性化使用
L3-005 Litter box distribution
2022-08-07 mysql/stonedb slow SQL-subquery-semi-join
KDD‘22推荐系统论文梳理(24篇研究&36篇应用论文)
L3-006 迎风一刀斩
【js基础】闭包的几种情况(代码)
Implementing Express middleware principles
Personalized use of Qt log module