• Go-Excelize API源码阅读(十一)—— GetActiveSheetIndex()


    Go-Excelize API源码阅读(十一)—— GetActiveSheetIndex()

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

    二、GetActiveSheetIndex()

    func (f *File) GetActiveSheetIndex() int
    
    • 1

    该API的作用是获取默认工作表的索引,如果没有找到默认工作表将返回 0

    废话少说,直接上源码

    // GetActiveSheetIndex provides a function to get active sheet index of the
    // spreadsheet. If not found the active sheet will be return integer 0.
    func (f *File) GetActiveSheetIndex() (index int) {
    	sheetID := f.getActiveSheetID()
    	wb := f.workbookReader()
    	if wb != nil {
    		for idx, sheet := range wb.Sheets.Sheet {
    			if sheet.SheetID == sheetID {
    				index = idx
    				return
    			}
    		}
    	}
    	return
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    看到这个sheetID := f.getActiveSheetID()

    getActiveSheetID 提供了一个函数来获取电子表格的活动工作表 ID。
    如果未找到活动工作表,将返回整数 0。

    func (f *File) getActiveSheetID() int {
    	wb := f.workbookReader()
    	if wb != nil {
    		if wb.BookViews != nil && len(wb.BookViews.WorkBookView) > 0 {
    			activeTab := wb.BookViews.WorkBookView[0].ActiveTab
    			if len(wb.Sheets.Sheet) > activeTab && wb.Sheets.Sheet[activeTab].SheetID != 0 {
    				return wb.Sheets.Sheet[activeTab].SheetID
    			}
    		}
    		if len(wb.Sheets.Sheet) >= 1 {
    			return wb.Sheets.Sheet[0].SheetID
    		}
    	}
    	return 0
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    其实就是读取表格文件,然后获取工作簿视图队列第一个ActiveTab。
    ActiveTab我在微软文档没有找到,我猜测是活动视图队列的工作表序号。

    type xlsxWorkBookView struct {
    	Visibility             string `xml:"visibility,attr,omitempty"`
    	Minimized              bool   `xml:"minimized,attr,omitempty"`
    	ShowHorizontalScroll   *bool  `xml:"showHorizontalScroll,attr"`
    	ShowVerticalScroll     *bool  `xml:"showVerticalScroll,attr"`
    	ShowSheetTabs          *bool  `xml:"showSheetTabs,attr"`
    	XWindow                string `xml:"xWindow,attr,omitempty"`
    	YWindow                string `xml:"yWindow,attr,omitempty"`
    	WindowWidth            int    `xml:"windowWidth,attr,omitempty"`
    	WindowHeight           int    `xml:"windowHeight,attr,omitempty"`
    	TabRatio               int    `xml:"tabRatio,attr,omitempty"`
    	FirstSheet             int    `xml:"firstSheet,attr,omitempty"`
    	ActiveTab              int    `xml:"activeTab,attr,omitempty"`
    	AutoFilterDateGrouping *bool  `xml:"autoFilterDateGrouping,attr"`
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    if len(wb.Sheets.Sheet) > activeTab && wb.Sheets.Sheet[activeTab].SheetID != 0 {
    				return wb.Sheets.Sheet[activeTab].SheetID
    			}
    
    • 1
    • 2
    • 3

    活动视图队列第一个工作表序号不能大于工作表的数量,并且其工作表ID不等于0。
    如此,便可以返回活动视图队列第一个工作表的工作表ID。

    		if len(wb.Sheets.Sheet) >= 1 {
    			return wb.Sheets.Sheet[0].SheetID
    		}
    
    • 1
    • 2
    • 3

    如果工作簿视图不存在,或者工作簿视图数量等于0,并且工作表的数量大于等于1,那么就返回索引为0的工作表的ID。

    	wb := f.workbookReader()
    	if wb != nil {
    		for idx, sheet := range wb.Sheets.Sheet {
    			if sheet.SheetID == sheetID {
    				index = idx
    				return
    			}
    		}
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    读取工作簿,然后如果工作簿为空,就会导致sheetID := f.getActiveSheetID()获取的工作表ID为0,所以会返回0。

    如果不为空,就遍历工作表,当工作表ID为getActiveSheetID()获取到的活跃工作表ID时,取其工作表索引,返回。

    三、结语

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

  • 相关阅读:
    深度学习卫星遥感图像检测与识别 -opencv python 目标检测 计算机竞赛
    Vue+element开发Simple Admin后端管理系统页面
    京东资深架构师推荐学习6本实战文档:Redis+Nginx+MySQL+JVM....
    前端应用聚合整改
    OpenStack常用命令
    Linux C 多线程
    [E::hts_idx_push] Unsorted positions on sequence tbx_index_build failed:
    普冉PY32系列(七) SOP8,SOP10,SOP16封装的PY32F002A/PY32F003管脚复用
    JQuery系列之样式操作
    彻底弄懂Java中的MultipartFile接口和File类
  • 原文地址:https://blog.csdn.net/qq_36045898/article/details/126254045