Golang Excelize 2.5.0 发布 - 电子表格(Excel)文档 API

Golang Excelize 2.5.0 发布 - 电子表格(Excel)文档 API Excelize 2.5.0 Released – Go language API for spreadsheet (Excel) document

Excelize 是一个用纯 Go 语言编写的库,提供了一系列函数,允许您读写 XLSX / XLSM / XLTM 文件。支持读写由 Microsoft Excel™ 2007 及更高版本生成的电子表格文档。通过高兼容性支持复杂组件,并提供了流式 API,用于从包含大量数据的工作表中生成或读取数据。

GitHub: github.com/xuri/excelize

我们很高兴地宣布 2.5.0 版本的发布。此版本包含了一些新的功能领域和大量的错误修复。

变更摘要可在发布说明中查看。完整的变更列表可在更新日志中找到。

发布说明

此版本中最值得注意的变更包括:

兼容性

  • 必须关闭电子表格和行的迭代器,用户应在使用行迭代器后关闭流,并在打开现有电子表格后关闭电子表格
  • ReadZipReader 更改为 File 的一个实现,根据给定选项提取电子表格,并支持在内存中提取或触及文件系统
  • 移除不必要的导出变量 XMLHeader,我们可以使用 encoding/xml 包的 xml.Header 来代替它
  • 移除未使用的导出错误变量 ErrToExcelTime

重要特性

  • 新 API:SetRowStyle 支持为行设置样式,相关议题 #990
  • 新 API:GetCellType 支持获取单元格的数据类型,相关议题 #417 和 #520
  • 新 API:SetAppPropsGetAppProps 支持设置和获取文档应用程序属性,相关议题 #1095
  • GetCellValueGetRowsGetColsRowsCols 支持指定读取单元格的原始值,相关议题 #621
  • 新增支持 95 个公式函数:ACCRINT, ACCRINTM, ADDRESS, AMORDEGRC, AMORLINC, AVEDEV, AVERAGEIF, CHIDIST, CONFIDENCE, CONFIDENCE.NORM, COUNTIF, COUNTIFS, COUPDAYBS, COUPDAYS, COUPDAYSNC, COUPNCD, COUPNUM, COUPPCD, DATEVALUE, DAY, DAYS, DELTA, DEVSQ, DISC, DURATION, ERF, ERF.PRECISE, ERFC, ERFC.PRECISE, GEOMEAN, GESTEP, IFNA, IFS, INDEX, INTRATE, ISFORMULA, ISLOGICAL, ISREF, ISOWEEKNUM, MATCH, MAXA, MAXIFS, MDURATION, MINIFS, MINUTE, MONTH, ODDFPRICE, PERCENTILE.EXC, PERCENTRANK.EXC, PERCENTRANK.INC, PERCENTRANK, PRICE, PRICEDISC, PRICEMAT, PV, QUARTILE.EXC, RANK, RANK.EQ, RATE, RECEIVED, RRI, SHEETS, SLN, STANDARDIZE, STDEV.P, STDEVP, SWITCH, SYD, TBILLEQ, TBILLPRICE, TBILLYIELD, TEXTJOIN, TIME, TRANSPOSE, TRIMMEAN, VALUE, VAR, VAR.S, VARA, VARPA, VDB, WEEKDAY, WEIBULL, WEIBULL.DIST, XIRR, XLOOKUP, XNPV, XOR, YEAR, YEARFRAC, YIELD, YIELDDISC, YIELDMAT, Z.TEST, ZTEST,相关议题 #1002
  • 公式计算引擎支持 IF 公式的嵌套计算,相关议题 #987
  • 公式计算引擎支持获取共享公式,相关议题 #844
  • 公式计算引擎支持文本比较,相关议题 #998
  • 支持在数据验证范围中指定公式,相关议题 #1012
  • 支持在打开文件选项中指定解压缩大小限制,避免 zip 炸弹漏洞攻击
  • SetCellFormula 现在支持设置共享公式
  • UpdateLinkedValue 将跳过宏工作表,相关议题 #1014
  • 修复了 AddPicture 在某些情况下创建重复图像的问题,该问题由内部关系 ID 计算不正确引起,相关议题 #1017
  • AddShape 支持设置添加形状的线条宽度,相关议题 #262
  • 新增选项 UnzipXMLSizeLimit,支持指定解压工作表及共享字符串表时的内存限制(以字节为单位)
  • 当创建新样式时如果给定的自定义数字格式无效,将返回错误,相关议题 #1028
  • 现在支持在流式写入器中设置行样式
  • 流式写入器将为时间类型的单元格创建时间数字格式,相关议题 #1107
  • 现在支持为数据透视表指定紧凑和轮廓布局,相关议题 #1029
  • 支持在流式读取器中获取当前行/列和总行/列,相关 PR #1054
  • 现在支持在设置单元格值时指定时区位置,相关议题 #1069
  • 导出 7 个错误,以便用户可以根据不同类型的错误采取不同的操作

提高兼容性

  • 提高了对具有 r="0" 属性的行元素的兼容性
  • 保留 XML 控制字符
  • 提高了与 Apple Numbers 在样式设置方面的兼容性,相关议题 #1059
  • 支持在设置页眉页脚时使用多字节语言,相关议题 #1061
  • 设置单元格值时保留水平制表符,相关议题 #1108

错误修复

  • 修复数据验证删除失败的问题,解决议题 #979
  • 修复在某些情况下设置数据验证下拉列表失败的问题,解决议题 #986
  • 修复公式计算引擎 LOOKUP 未正确处理数组形式的问题,解决议题 #994
  • 修复公式计算引擎 LOOKUP 只能找到精确匹配的问题,解决议题 #997
  • 修复公式百分比计算不正确的问题,解决议题 #993
  • 修复在某些情况下因单元格读取不正确导致的 panic
  • 修复条件格式“最末 N 项”不工作的问题
  • 修复时间解析精度问题,解决议题 #1026 和 #1030
  • 修复内置科学计数法数字格式失败的问题,解决议题 #1027
  • 修复在某些情况下小浮点数解析错误的问题,解决议题 #1031
  • 修复在某些情况下工作表删除失败的问题
  • 修复内置时间数字格式解析错误,解决议题 #1060
  • 修复 NewStyle 在某些情况下返回的样式 ID 不正确的问题
  • 修复在某些极端情况下行/列插入/删除后合并单元格范围错误的问题

性能

  • 合并单元格耗时显著加快,时间成本降低超过 90%
  • 提高流式读取性能,当内部 XML 较大时将共享字符串表解压到系统临时文件,内存使用量减少约 60%,相关议题 #1096
  • 工作表列表读取速度加快
  • 合并列样式以减少电子表格文件大小,解决议题 #1057

其他

  • 已更新依赖模块
  • 已更新单元测试和 godoc
  • 包含多语言(阿拉伯语、德语、西班牙语、英语、法语、俄语、中文、日语和韩语)的文档网站已更新

更多关于Golang Excelize 2.5.0 发布 - 电子表格(Excel)文档 API的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于Golang Excelize 2.5.0 发布 - 电子表格(Excel)文档 API的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


Excelize 2.5.0 的发布带来了许多重要更新,特别是新增的API和对公式函数的支持,这大大增强了库的功能性。以下是一些关键特性的示例代码:

1. 使用 SetRowStyle 为整行设置样式

package main

import (
    "fmt"
    "github.com/xuri/excelize/v2"
)

func main() {
    f := excelize.NewFile()
    defer func() {
        if err := f.Close(); err != nil {
            fmt.Println(err)
        }
    }()
    // 创建样式
    style, err := f.NewStyle(&excelize.Style{
        Font: &excelize.Font{Color: "FF0000", Bold: true},
    })
    if err != nil {
        fmt.Println(err)
        return
    }
    // 为第2行设置样式
    if err := f.SetRowStyle("Sheet1", 2, 2, style); err != nil {
        fmt.Println(err)
        return
    }
    // 保存文件
    if err := f.SaveAs("Book1.xlsx"); err != nil {
        fmt.Println(err)
    }
}

2. 使用 GetCellType 获取单元格数据类型

package main

import (
    "fmt"
    "github.com/xuri/excelize/v2"
)

func main() {
    f, err := excelize.OpenFile("Book1.xlsx")
    if err != nil {
        fmt.Println(err)
        return
    }
    defer func() {
        if err := f.Close(); err != nil {
            fmt.Println(err)
        }
    }()
    // 获取A1单元格的数据类型
    cellType, err := f.GetCellType("Sheet1", "A1")
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Println(cellType) // 输出: string, number, bool, date, formula, error 等
}

3. 使用 SetAppPropsGetAppProps 管理文档属性

package main

import (
    "fmt"
    "github.com/xuri/excelize/v2"
)

func main() {
    f := excelize.NewFile()
    defer func() {
        if err := f.Close(); err != nil {
            fmt.Println(err)
        }
    }()
    // 设置应用程序属性
    if err := f.SetAppProps(&excelize.AppProperties{
        Application:       "My Go Application",
        ScaleCrop:         true,
        DocSecurity:       3,
        Company:           "Go Tech",
        LinksUpToDate:     false,
        HyperlinksChanged: false,
        AppVersion:        "1.0.0",
    }); err != nil {
        fmt.Println(err)
        return
    }
    // 获取应用程序属性
    props, err := f.GetAppProps()
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Printf("Application: %s\n", props.Application)
    fmt.Printf("Company: %s\n", props.Company)
}

4. 使用新增的公式函数(例如 XLOOKUP

package main

import (
    "fmt"
    "github.com/xuri/excelize/v2"
)

func main() {
    f := excelize.NewFile()
    defer func() {
        if err := f.Close(); err != nil {
            fmt.Println(err)
        }
    }()
    // 在A1:A3写入查找值
    f.SetCellValue("Sheet1", "A1", "Apple")
    f.SetCellValue("Sheet1", "A2", "Banana")
    f.SetCellValue("Sheet1", "A3", "Cherry")
    // 在B1:B3写入对应的结果
    f.SetCellValue("Sheet1", "B1", 10)
    f.SetCellValue("Sheet1", "B2", 20)
    f.SetCellValue("Sheet1", "B3", 30)
    // 在C1设置XLOOKUP公式查找"Banana"
    f.SetCellFormula("Sheet1", "C1", "=XLOOKUP(\"Banana\",A1:A3,B1:B3)")
    // 计算公式结果
    result, err := f.CalcCellValue("Sheet1", "C1")
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Println(result) // 输出: 20
}

5. 流式写入器设置行样式

package main

import (
    "fmt"
    "github.com/xuri/excelize/v2"
)

func main() {
    f := excelize.NewFile()
    defer func() {
        if err := f.Close(); err != nil {
            fmt.Println(err)
        }
    }()
    // 创建样式
    style, err := f.NewStyle(&excelize.Style{Fill: excelize.Fill{Type: "pattern", Color: []string{"E0EBF5"}, Pattern: 1}})
    if err != nil {
        fmt.Println(err)
        return
    }
    streamWriter, err := f.NewStreamWriter("Sheet1")
    if err != nil {
        fmt.Println(err)
        return
    }
    // 设置第5行的样式
    if err := streamWriter.SetRow("A5", []interface{}{excelize.Cell{Value: "Streaming row with style"}}, excelize.RowOpts{StyleID: style}); err != nil {
        fmt.Println(err)
        return
    }
    if err := streamWriter.Flush(); err != nil {
        fmt.Println(err)
        return
    }
    if err := f.SaveAs("Book1.xlsx"); err != nil {
        fmt.Println(err)
    }
}

这些示例展示了Excelize 2.5.0中新增API的基本用法。需要注意的是,使用行迭代器后必须关闭流,打开现有电子表格后也需要关闭文件,这是该版本兼容性要求的重要变更。

回到顶部