返回

从代码角度看 API的细节:《Go-Excelize》 API 源码阅读 (六) DeleteSheet(sheet string)

后端

在当今飞速发展的时代,办公软件领域也经历着巨大的变革,Go 语言凭借其简洁高效的语法和强大的并发处理能力,逐渐在办公软件开发领域崭露头角,而 Go-Excelize 库则是 Go 语言中一款优秀的电子表格操作库,它提供了丰富的 API 来操作电子表格文档,使用 Go-Excelize 可以轻松读取、写入和修改 Excel 文件。

在《Go-Excelize》 API 源码阅读系列文章的第六篇中,我们将重点探讨 DeleteSheet 函数的实现细节,该函数可以根据给定的工作表名称删除指定的工作表。

// DeleteSheet removes a worksheet by name.
// Sheet with that name will be deleted, its content will be lost. Be careful!
// All charts, images and other objects bound to the sheet will be lost.
func (f *File) DeleteSheet(sheet string) error {
	_, ok := f.workSheets[sheet]
	if !ok {
		return ErrSheetNotExist
	}
	var sheets []string
	for i, s := range f.SheetNames {
		if s != sheet {
			sheets = append(sheets, s)
		}
	}
	f.SheetNames = sheets
	for i := range f.SheetMaps {
		if f.SheetMaps[i].Name == sheet {
			f.SheetMaps = append(f.SheetMaps[:i], f.SheetMaps[i+1:]...)
			break
		}
	}
	delete(f.workSheets, sheet)
	if f.ActiveSheet == sheet {
		if len(f.SheetNames) > 0 {
			f.ActiveSheet = f.SheetNames[0]
		} else {
			f.ActiveSheet = ""
		}
	}
	return nil
}

1. 函数签名

func (f *File) DeleteSheet(sheet string) error
  • f*File 指针,代表 Excel 文件。
  • sheet :要删除的工作表名称(字符串)。
  • error :如果函数执行成功,则返回 nil;如果函数执行失败,则返回一个错误值。

2. 函数实现

  1. 首先,函数检查给定的工作表名称是否在 f.workSheets 中存在,如果不存在,则返回 ErrSheetNotExist 错误。
  2. 然后,函数创建一个新的字符串数组 sheets,将 f.SheetNames 中不等于 sheet 的工作表名称复制到 sheets 中。
  3. 接下来,函数更新 f.SheetNames,使其等于 sheets
  4. 然后,函数遍历 f.SheetMaps,找到与 sheet 匹配的工作表映射,并将其从 f.SheetMaps 中删除。
  5. 接下来,函数从 f.workSheets 中删除 sheet
  6. 最后,如果 f.ActiveSheet 等于 sheet,则函数将 f.ActiveSheet 更新为 f.SheetNames 中的第一个工作表名称,或者如果 f.SheetNames 为空,则将 f.ActiveSheet 更新为空字符串。

3. 函数用法

package main

import (
	"fmt"

	"github.com/360EntSecGroup-Skylar/excelize"
)

func main() {
	f, err := excelize.OpenFile("example.xlsx")
	if err != nil {
		fmt.Println(err)
		return
	}
	// Delete the worksheet "Sheet2" from the Excel file.
	if err := f.DeleteSheet("Sheet2"); err != nil {
		fmt.Println(err)
		return
	}
	// Save the updated Excel file.
	if err := f.Save(); err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println("Worksheet \"Sheet2\" deleted successfully.")
}

通过阅读 Go-Excelize 的源代码,我们可以更深入地理解库的实现细节,这有助于我们更好地使用该库来完成各种任务。