写点什么

Go-Excelize API 源码阅读(五)—— Close()

作者:Regan Yue
  • 2022 年 8 月 09 日
    湖南
  • 本文字数:1781 字

    阅读完需:约 6 分钟

Go-Excelize API源码阅读(五)—— Close()

Go-Excelize API 源码阅读(五)—— Close()

一、Go-Excelize 简介

Excelize 是 Go 语言编写的用于操作 Office Excel 文档基础库,基于 ECMA-376,ISO/IEC 29500 国际标准。可以使用它来读取、写入由 Microsoft Excel™ 2007 及以上版本创建的电子表格文档。支持 XLAM / XLSM / XLSX / XLTM / XLTX 等多种文档格式,高度兼容带有样式、图片(表)、透视表、切片器等复杂组件的文档,并提供流式读写 API,用于处理包含大规模数据的工作簿。可应用于各类报表平台、云计算、边缘计算等系统。使用本类库要求使用的 Go 语言为 1.15 或更高版本。

二、Close()

func (f *File) Close() error
复制代码


此 API 的作用是关闭工作簿并清理打开文档时可能产生的系统磁盘缓存。


下面来看看具体代码:


func (f *File) Close() error {  var err error  if f.sharedStringTemp != nil {    if err := f.sharedStringTemp.Close(); err != nil {      return err    }  }  f.tempFiles.Range(func(k, v interface{}) bool {    if err = os.Remove(v.(string)); err != nil {      return false    }    return true  })  return err}
复制代码


先判断 sharedStringTemp 是不是为空,这是一个*os.File 类型的变量。应该是关闭某个重要的缓存文件。


接下来就是遍历临时文件,os.Remove(v.(string))会删除这些临时文件和文件夹。以上步骤清理了打开文档时可能产生的系统磁盘缓存。

三、NewSheet()

func (f *File) NewSheet(sheet string) int
复制代码


该 API 的作用是根据给定的工作表名称来创建新工作表,并返回工作表在工作簿中的索引。请注意,在创建新的工作簿时,将包含名为 Sheet1 的默认工作表。


func (f *File) NewSheet(name string) int {  // Check if the worksheet already exists  index := f.GetSheetIndex(name)  if index != -1 {    return index  }  f.DeleteSheet(name)  f.SheetCount++  wb := f.workbookReader()  sheetID := 0  for _, v := range wb.Sheets.Sheet {    if v.SheetID > sheetID {      sheetID = v.SheetID    }  }  sheetID++  // Update docProps/app.xml  f.setAppXML()  // Update [Content_Types].xml  f.setContentTypes("/xl/worksheets/sheet"+strconv.Itoa(sheetID)+".xml", ContentTypeSpreadSheetMLWorksheet)  // Create new sheet /xl/worksheets/sheet%d.xml  f.setSheet(sheetID, name)  // Update workbook.xml.rels  rID := f.addRels(f.getWorkbookRelsPath(), SourceRelationshipWorkSheet, fmt.Sprintf("/xl/worksheets/sheet%d.xml", sheetID), "")  // Update workbook.xml  f.setWorkbook(name, sheetID, rID)  return f.GetSheetIndex(name)}
复制代码


请注意,工作表名称是不区分大小写的。


先检查给定名字的工资表是否存在,如果不存在 GetSheetIndex 就会返回-1,否则返回工作表索引。


func (f *File) GetSheetIndex(name string) int {  for index, sheet := range f.GetSheetList() {    if strings.EqualFold(sheet, trimSheetName(name)) {      return index    }  }  return -1}
复制代码


如果 GetSheetIndex 就会返回-1,也就是工作表存在,就调用 DeleteSheet 把该工作表删除。然后建立一个wb := f.workbookReader()工作簿读取器。


for _, v := range wb.Sheets.Sheet {    if v.SheetID > sheetID {      sheetID = v.SheetID    }  }
复制代码


这段代码的意思应该是求工作表的最大 SheetID ,赋值给 sheetID。然后再创建或更新 docProps/app.xml、[Content_Types].xml、/xl/worksheets/sheet%d.xml、 workbook.xml.rels、workbook.xml 这些文件。


  // Update docProps/app.xml  f.setAppXML()  // Update [Content_Types].xml  f.setContentTypes("/xl/worksheets/sheet"+strconv.Itoa(sheetID)+".xml", ContentTypeSpreadSheetMLWorksheet)  // Create new sheet /xl/worksheets/sheet%d.xml  f.setSheet(sheetID, name)  // Update workbook.xml.rels  rID := f.addRels(f.getWorkbookRelsPath(), SourceRelationshipWorkSheet, fmt.Sprintf("/xl/worksheets/sheet%d.xml", sheetID), "")  // Update workbook.xml  f.setWorkbook(name, sheetID, rID)
复制代码


最后返回这个 Sheet。


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

发布于: 刚刚阅读数: 3
用户头像

Regan Yue

关注

还未添加个人签名 2020.08.12 加入

对Go、Python、网络安全、区块链感兴趣. · 华为云云享专家 · 掘金资讯创作者

评论

发布
暂无评论
Go-Excelize API源码阅读(五)—— Close()_Go_Regan Yue_InfoQ写作社区