• Go-Excelize API源码阅读(八)——GroupSheets(sheets []string)、UngroupSheets()


    Go-Excelize API源码阅读(八)——UngroupSheets()

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

    二、GroupSheets(sheets []string)

    func (f *File) GroupSheets(sheets []string) error
    
    • 1

    该API的功能是根据给定的工作表名称对工作表进行分组,给定的工作表中需包含默认工作表。

    func (f *File) GroupSheets(sheets []string) error {
    	// check an active worksheet in group worksheets
    	var inActiveSheet bool
    	activeSheet := f.GetActiveSheetIndex()
    	sheetMap := f.GetSheetList()
    	for idx, sheetName := range sheetMap {
    		for _, s := range sheets {
    			if s == sheetName && idx == activeSheet {
    				inActiveSheet = true
    			}
    		}
    	}
    	if !inActiveSheet {
    		return ErrGroupSheets
    	}
    	// check worksheet exists
    	var wss []*xlsxWorksheet
    	for _, sheet := range sheets {
    		worksheet, err := f.workSheetReader(sheet)
    		if err != nil {
    			return err
    		}
    		wss = append(wss, worksheet)
    	}
    	for _, ws := range wss {
    		sheetViews := ws.SheetViews.SheetView
    		if len(sheetViews) > 0 {
    			for idx := range sheetViews {
    				ws.SheetViews.SheetView[idx].TabSelected = true
    			}
    			continue
    		}
    	}
    	return nil
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35

    整个API实现分为两大步骤:

    1.在组工作表中找到一个活跃的工作表

    activeSheet是活跃的工作表索引。
    sheetMap := f.GetSheetList()
    GetSheetList 提供了一个函数,用于获取工作簿的工作表、图表工作表和对话框工作表名称列表。

    func (f *File) GetSheetList() (list []string) {
    	wb := f.workbookReader()
    	if wb != nil {
    		for _, sheet := range wb.Sheets.Sheet {
    			list = append(list, sheet.Name)
    		}
    	}
    	return
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    	for idx, sheetName := range sheetMap {
    		for _, s := range sheets {
    			if s == sheetName && idx == activeSheet {
    				inActiveSheet = true
    			}
    		}
    	}
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    这段代码是寻找sheets里面是不是有s与idx等于activeSheet的sheetName相等。

    2.检查工作表是否存在
    	var wss []*xlsxWorksheet
    	for _, sheet := range sheets {
    		worksheet, err := f.workSheetReader(sheet)
    		if err != nil {
    			return err
    		}
    		wss = append(wss, worksheet)
    	}
    	for _, ws := range wss {
    		sheetViews := ws.SheetViews.SheetView
    		if len(sheetViews) > 0 {
    			for idx := range sheetViews {
    				ws.SheetViews.SheetView[idx].TabSelected = true
    			}
    			continue
    		}
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    xlsxWorksheet 直接映射命名空间中的工作表元素 http://schemas.openxmlformats.org/spreadsheetml/2006/main。

    新建这样一个结构体,然后遍历sheets,读取每一个sheet,加入wss。

    然后遍历这些wss,获取wss中每一个sheet的视图。

    遍历视图,将每一个视图的TabSelected置为true。

    三、UngroupSheets()

    该API的功能是取消工作表分组。

    func (f *File) UngroupSheets() error
    
    • 1
    func (f *File) UngroupSheets() error {
    	activeSheet := f.GetActiveSheetIndex()
    	for index, sheet := range f.GetSheetList() {
    		if activeSheet == index {
    			continue
    		}
    		ws, _ := f.workSheetReader(sheet)
    		sheetViews := ws.SheetViews.SheetView
    		if len(sheetViews) > 0 {
    			for idx := range sheetViews {
    				ws.SheetViews.SheetView[idx].TabSelected = false
    			}
    		}
    	}
    	return nil
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    获取活跃工作表的索引activeSheet。

    然后遍历文件的工作表,只处理活跃工作表。

    遍历到活跃工作表的索引时,读取该工作表,将其的每一个视图的TabSelected置为false.

    三、结语

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

  • 相关阅读:
    Linux的历史
    Python如何获取动态加载的数据呢 ?
    【算法训练-回溯算法 零】回溯算法解题框架
    nc反弹以及中 &>、0>&1是什么意思
    css自学框架之选项卡
    MySQL中的分库分表框架-ShardingSphere
    DMNet复现(二)之模型篇:Density map guided object detection in aerial image
    华为智能高校出口安全解决方案(2)
    【两篇就够】异步相关(二)
    【Linux学习】基础开发工具
  • 原文地址:https://blog.csdn.net/qq_36045898/article/details/126084348