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

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第16天,点击查看活动详情

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

一、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 docs.microsoft.com/zh-cn/offic…

看下面这段代码:

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 docs.microsoft.com/zh-cn/dotne…

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语言相关源码的解读第十篇,我会不断努力,给大家带来更多类似的文章,恳请大家不吝赐教。