携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第8天, 点击查看活动详情

# Go-Excelize API源码阅读(四)——Save()、SaveAs(name string)

一、Go-Excelize简介

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

二、Save()

func (f *File) Save() error 使用 Save 保存对 Excel 文档的编辑。

func (f *File) Save() error {
	if f.Path == "" {
		return ErrSave
	if f.options != nil {
		return f.SaveAs(f.Path, *f.options)
	return f.SaveAs(f.Path)

Save 可以用于在源路径覆盖电子表格。 第一个if判断,是判断要保存的路径是否为空,如果为空就返回ErrSave。

	// ErrSave defined the error message for saving file.
	ErrSave = errors.New("no path defined for file, consider File.WriteTo or File.Write")

该项目将错误放置在errors.go中。ErrSave是保存文件时发生错误的错误消息。

接下来的if判断:

	if f.options != nil {
		return f.SaveAs(f.Path, *f.options)

当文件结构体的options 成员不为空时,保存文件需要考虑options的信息。 如果为空就不需要考虑。

三、SaveAs(name string)

至于SaveAs(name string),我们来看看: 使用 SaveAs 保存 Excel 文档为指定文件。

func (f *File) SaveAs(name string, opt ...Options) error {
	if len(name) > MaxFilePathLength {
		return ErrMaxFilePathLength
	f.Path = name
	contentType, ok := map[string]string{
		".xlam": ContentTypeAddinMacro,
		".xlsm": ContentTypeMacro,
		".xlsx": ContentTypeSheetML,
		".xltm": ContentTypeTemplateMacro,
		".xltx": ContentTypeTemplate,
	}[filepath.Ext(f.Path)]
	if !ok {
		return ErrWorkbookFileFormat
	f.setContentTypePartProjectExtensions(contentType)
	file, err := os.OpenFile(filepath.Clean(name), os.O_WRONLY|os.O_TRUNC|os.O_CREATE, os.ModePerm)
	if err != nil {
		return err
	defer file.Close()
	f.options = nil
	for i := range opt {
		f.options = &opt[i]
	return f.Write(file)

第一个if:

	if len(name) > MaxFilePathLength {
		return ErrMaxFilePathLength

用来判断文件名长度是不是合法。 文件错误信息如下: 接下来是根据文件的扩展名确定内容类型:

	contentType, ok := map[string]string{
		".xlam": ContentTypeAddinMacro,
		".xlsm": ContentTypeMacro,
		".xlsx": ContentTypeSheetML,
		".xltm": ContentTypeTemplateMacro,
		".xltx": ContentTypeTemplate,
	}[filepath.Ext(f.Path)]

这段的写法可以学习。。。至于其内容下图可见。。。 setContentTypePartProjectExtensions()将获取到的contentType赋给文档关系部分和主文档部分。 然后打开文件写入f文件流。

os.O_WRONLY|os.O_TRUNC|os.O_CREATE, os.ModePerm 这个要介绍一下:

os.O_APPEND:当向文件中写入内容时,把新内容追加到现有内容的后边。 os.O_CREATE:当给定路径上的文件不存在时,创建一个新文件。 os.O_EXCL:需要与os.O_CREATE一同使用,表示在给定的路径上不能有已存在的文件。 os.O_SYNC:在打开的文件之上实施同步 I/O。它会保证读写的内容总会与硬盘上的数据保持同步。 os.O_TRUNC:如果文件已存在,并且是常规的文件,那么就先清空其中已经存在的任何内容。

os.O_WRONLY | os.O_CREATE | O_EXCL 【如果已经存在,则失败】 os.O_WRONLY | os.O_CREATE 【如果已经存在,会覆盖写,不会清空原来的文件,而是从头直接覆盖写】 os.O_WRONLY | os.O_CREATE | os.O_APPEND 【如果已经存在,则在尾部添加写】

  • 为什么很多公司都开始使用Go语言了?
  • 放弃 console.log 吧!用 Debugger 你能读懂各种源码
  •