Go-Excelize API 源码阅读(九)——SetSheetBackground(sheet, picture string)
一、Go-Excelize 简介
Excelize 是 Go 语言编写的用于操作 Office Excel 文档基础库,基于 ECMA-376,ISO/IEC 29500 国际标准。可以使用它来读取、写入由 Microsoft Excel™ 2007 及以上版本创建的电子表格文档。支持 XLAM / XLSM / XLSX / XLTM / XLTX 等多种文档格式,高度兼容带有样式、图片(表)、透视表、切片器等复杂组件的文档,并提供流式读写 API,用于处理包含大规模数据的工作簿。可应用于各类报表平台、云计算、边缘计算等系统。使用本类库要求使用的 Go 语言为 1.15 或更高版本。
二、SetSheetBackground(sheet, picture string)
func (f *File) SetSheetBackground(sheet, picture string) error
复制代码
根据给定的工作表名称和图片地址为指定的工作表设置平铺效果的背景图片。
看到这个 API 的功能,我还有点不敢相信,应该很少有人知道工作表能够设置背景图片的吧。
这效果是不是酷毙了~
废话少说,看看这个 API 是怎么实现的!
// SetSheetBackground provides a function to set background picture by given
// worksheet name and file path.
func (f *File) SetSheetBackground(sheet, picture string) error {
var err error
// Check picture exists first.
if _, err = os.Stat(picture); os.IsNotExist(err) {
return err
}
ext, ok := supportedImageTypes[path.Ext(picture)]
if !ok {
return ErrImgExt
}
file, _ := ioutil.ReadFile(filepath.Clean(picture))
name := f.addMedia(file, ext)
sheetRels := "xl/worksheets/_rels/" + strings.TrimPrefix(f.sheetMap[trimSheetName(sheet)], "xl/worksheets/") + ".rels"
rID := f.addRels(sheetRels, SourceRelationshipImage, strings.Replace(name, "xl", "..", 1), "")
f.addSheetPicture(sheet, rID)
f.addSheetNameSpace(sheet, SourceRelationship)
f.setContentTypePartImageExtensions()
return err
}
复制代码
下面这一步是检查文件路径的图片是否存在。
if _, err = os.Stat(picture); os.IsNotExist(err) {
return err
}
复制代码
这种方法可以说比较巧妙了,看能不能获取 picture 的文件信息,如果不能就会报错,然后看报错。这个 os.Stat()返回的 err 比较特别。
1、如果返回的错误为 nil,说明文件或文件夹不存在或者没有权限 2、如果返回的错误类型使用 os.IsNotExist()判断为 true,说明文件或文件夹存在 3、如果返回的错误为其它类型,则不确定是否在存在
os.IsNotExist(err)正好返回一个布尔值,判断是否已知错误来报告文件或目录不存在。
ext, ok := supportedImageTypes[path.Ext(picture)]
if !ok {
return ErrImgExt
}
复制代码
根据文件的扩展名判断文件是不是图片。
var supportedImageTypes = map[string]string{
".gif": ".gif", ".jpg": ".jpeg",
".jpeg": ".jpeg", ".png": ".png",
".tif": ".tiff", ".tiff": ".tiff",
".emf": ".emf", ".wmf": ".wmf"
}
复制代码
上面是设定的能够识别的图片扩展名。
file, _ := ioutil.ReadFile(filepath.Clean(picture))
name := f.addMedia(file, ext)
复制代码
将文件读取,ioutil.ReadFile 适用于文件比较小的读入。
当文件较小(KB 级别)时,ioutil > bufio > os。当文件大小比较常规(MB 级别)时,三者差别不大,但 bufio 比较好一点。当文件较大(GB 级别)时,bufio > os > ioutil。
sheetRels := "xl/worksheets/_rels/" + strings.TrimPrefix(f.sheetMap[trimSheetName(sheet)], "xl/worksheets/") + ".rels"
rID := f.addRels(sheetRels, SourceRelationshipImage, strings.Replace(name, "xl", "..", 1), "")
f.addSheetPicture(sheet, rID)
f.addSheetNameSpace(sheet, SourceRelationship)
f.setContentTypePartImageExtensions()
return err
复制代码
这些操作都应该是给 xml 文件做各种操作。
sheetRels := "xl/worksheets/_rels/" + strings.TrimPrefix(f.sheetMap[trimSheetName(sheet)], "xl/worksheets/") + ".rels"
rID := f.addRels(sheetRels, SourceRelationshipImage, strings.Replace(name, "xl", "..", 1), "")
复制代码
是根据上面的 rel 路径生成一个 rels 文件,然后返回它的 ID。
f.addSheetPicture(sheet, rID)
是将改 rels 文件放入工作表。addSheetNameSpace
为工作表添加 XML 属性。setContentTypePartImageExtensions
功能是设置关系部分和主文档部分的内容类型。
三、结语
这里是老岳,这是 Go 语言相关源码的解读第九篇,我会不断努力,给大家带来更多类似的文章,恳请大家不吝赐教。
评论