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