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

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:
SetAppProps和GetAppProps支持设置和获取文档应用程序属性,相关议题 #1095 GetCellValue、GetRows、GetCols、Rows和Cols支持指定读取单元格的原始值,相关议题 #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
更多关于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. 使用 SetAppProps 和 GetAppProps 管理文档属性
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的基本用法。需要注意的是,使用行迭代器后必须关闭流,打开现有电子表格后也需要关闭文件,这是该版本兼容性要求的重要变更。

