Golang Excelize 2.8.1发布 - 强大的开源电子表格(Excel)文档处理库
Golang Excelize 2.8.1发布 - 强大的开源电子表格(Excel)文档处理库

Excelize 是一个用纯 Go 语言编写的库,提供了一系列函数,允许您读写 XLAM / XLSM / XLSX / XLTM / XLTX 文件。支持读写由 Microsoft Excel™ 2007 及更高版本生成的电子表格文档。通过高兼容性支持复杂组件,并提供了流式 API,用于从包含大量数据的工作表中生成或读取数据。
GitHub: github.com/xuri/excelize
我们很高兴地宣布版本 2.8.1 的发布。本次发布包含了一些新的功能领域和大量的错误修复。
变更摘要可在发布说明中找到。完整的变更列表可在更新日志中查看。
发布说明
此版本中最值得注意的变更有:
重大变更
- 升级要求 Go 语言版本为 1.18 或更高,以升级依赖包
golang.org/x/net - 将
HeaderFooterOptions结构体字段AlignWithMargins和ScaleWithDoc的数据类型更改为指针,解决 issue #1645 - 移除未导出的数据结构
ShapeColor
重要特性
- 新增导出函数
SetCellUint,相关 issue #1681 - 新增导出函数
GetPictureCells用于获取所有图片单元格,相关 issue #1218 - 新增导出函数
GetConditionalStyle用于获取条件格式样式定义,相关 issue #1690 - 新增导出函数
GetHeaderFooter用于获取工作表页眉和页脚 - 新增导出函数
AddSlicer用于添加表格和数据透视表切片器 - 新增导出函数
GetPivotTables用于获取数据透视表 - 新增导出函数
DeletePivotTable用于删除数据透视表 - 在
PivotTableOptions中新增Name字段,以支持指定数据透视表名称 - 新增支持 7 个公式函数:DBCS, SEARCH, SEARCHB, TEXT, TEXTAFTER, TEXTBEFORE 和 xlfn.ANCHORARRAY
- 新增导出
ChartLineType枚举以指定图表线型,相关 issue #1706 - 在
Chart数据类型中新增Border字段以设置图表区域边框 - 在
ChartLine类型中新增Type字段以设置线型 - 新增导出的源关系和命名空间
NameSpaceSpreadSheetXR10、ContentTypeSlicer、ContentTypeSlicerCache和SourceRelationshipSlicer - 新增导出的扩展 URI
ExtURIPivotCacheDefinition - 允许在定义的名称、表名或数据透视表名中使用点字符
- 删除表格时保留表格范围内的所有单元格值
- 支持使用分数数字格式代码格式化单元格值
- 支持在删除图片时从工作簿内部删除图像文件,以减少生成的工作簿大小并解决潜在的安全问题
- 支持设置注释框的高度和宽度,相关 issue #1688
- 支持在插入/删除列/行时更新条件格式、数据验证、定义的名称、绘图对象、公式引用和易失性依赖项,相关 issues #1306 和 #1615
- 支持 6 种新的条件格式类型:文本、空值、非空值、错误、非错误和时间段
- 支持计算包含多个短横线算术符号的公式
- 支持在复制行时复制条件格式和数据验证,相关 issue #1729
- 当使用
SetRowHeight函数且高度值为 -1 时,支持取消设置自定义行高 - 如果给定的行高值无效,
SetRowHeight函数将返回错误 AddChart函数支持设置图表的数据标签位置,相关 issue #1704AddChart函数支持为图表区域、绘图区域和标记设置纯色或透明填充,在Chart、ChartPlotArea和ChartMarker数据类型中新增Fill字段,相关 issue #1786AddChart函数支持设置图表轴字体族、大小和删除线样式,相关 issue #1809- 在
ChartSeries数据类型中新增字段DataLabelPosition,支持设置图表系列数据标签的位置 - 在
Chart数据类型中新增字段BubbleSize,支持为气泡图或 3D 气泡图设置所有数据系列的气泡大小 - 新增导出的
ChartDataLabelPositionType数据类型 GetPictureCells和GetPictures函数支持获取由金山 WPS™ Office 创建的嵌入式单元格图片,相关 issue #664SetConditionalFormat函数支持设置包含多个单元格范围的条件格式,相关 issue #1783- 支持在重命名工作表时更新定义的名称引用,相关 issue #1792
- 新增
GetBaseColor函数支持获取首选十六进制颜色代码,相关 issue #1794 - 计算引擎支持日期和公式类型的单元格,相关 issue #1807
- 单元格值读取函数继承
OpenReader的Options设置,相关 issue #1815
提高兼容性
- 提高了绝对路径绘图部件的兼容性
- 提高了工作簿内部选项卡比例属性值的兼容性
- 提高了与空自定义数字格式代码的兼容性
- 提高了与不支持默认主题部件命名空间的查看器的兼容性,相关 issue #1694
- 提高了删除单元格注释形状与金山 WPS™ Office 的兼容性,相关 issue #1789
- 保存工作簿时对内部部件路径进行排序,使相同方式创建的工作簿哈希校验和相同,相关 issue #1732
错误修复
- 为 MID 和 MIDB 公式函数的 num_chars 参数添加检查,防止在指定负数时发生 panic,解决 issue #1647
- 修复了 LEN、LOWER、PROPER、REPT、UPPER 和 IF 公式函数中数字参数导致计算结果为空的问题
- 修复了在某些情况下计算 CHITEST 和 MMULT 公式函数时发生 panic 的问题
- 修复了 v2.8.0 的一个回归错误:使用内置特殊定义的名称设置打印区域和打印标题时出错
- 修复了 v2.8.0 的一个回归错误:由于改进了与内部索引颜色和 MRU 颜色样式部件的兼容性,导致生成的工作簿损坏
- 修复了 v2.8.0 的一个回归错误:数字格式代码应用结果为空,解决 issue #1658
- 修复了 v2.7.1 的一个回归错误:气泡图或 3D 气泡图中的气泡被隐藏
- 通过为本地工作表 ID 添加空指针保护,修复了
AutoFilter可能发生的 panic,解决 issue #1655 - 修复了在某些情况下添加表格时生成的工作簿损坏的问题
- 修复了时间数字格式结果不正确的问题,解决 issue #1661
- 支持获取公式字符串单元格值,解决 issue #1665
- 修复了包含单个表格单元格的工作簿中生成的表格 ID 不正确的问题
- 修复了在某些情况下内容类型中缺少关系部件的问题
- 升级数字格式解析器以修复在某些情况下缺少字面量标记的问题
- 更新内置的 zh-cn 和 zh-tw 语言数字格式
- 修复了分配的自定义数字格式 ID 不正确的问题,解决 issue #1677
- 修复了通过删除并重新创建表格来更新表格范围无效的问题,解决 issue #1682
- 修复了流式读取器临时文件可能无法清除的潜在问题,解决 issue #1680
- 修复了在某些情况下公式计算结果不正确的问题,解决 issue #1681
- 修复了获取单元格值时可能出现的并发竞争条件,解决 issue #1687
- 修复了获取样式定义时某些格式缺失的问题,解决 issue #1708
- 修复了数字格式科学计数法零填充问题,解决 issue #1710
- 修复了读取内部行元素没有
r属性的工作簿时可能发生的 panic,解决 issue #1723 - 修复了
GetCellRichText在获取内联富文本单元格时返回错误的问题 - 修复了在某些情况下设置单元格值时共享字符串表索引无效的问题
- 修复了
GetConditionalFormats在获取没有高于平均值规则的条件格式时发生 panic 的问题,解决 issue #1745 - 修复了删除行时合并单元格调整不正确的问题,解决 issue #1749
- 修复了
SetConditionalFormat函数创建多个条件格式规则优先级不正确的问题,解决 issue #1770 - 修复了
GetConditionalFormats函数不返回渐变数据条规则的问题,解决 issue #1769 - 修复了
GetStyle或GetConditionalStyle函数返回的DecimalPlaces字段值不正确的问题,解决 issue #1777 - 修复了
CalcCellValue函数在启用RawCellValue时不返回原始值的问题,解决 issue #1803
性能
- 提高了添加和删除数据透视表及图片的性能
- 通过修剪行和单元格减少内存消耗,解决 issue #1712
其他
- 依赖模块已更新
- 单元测试和 godoc 已更新
- 多语言文档网站(阿拉伯语、德语、西班牙语、英语、法语、俄语、中文、日语和韩语)已更新
致谢
感谢所有为 Excelize 做出贡献的人。以下是此版本中有代码贡献的贡献者列表:
- fnickels (Francis Nickels III)
- m12r (Matthias Endler)
- Abdelaziz-Ouhammou
- Juneezee (Eng Zer Jun)
- yicixin (壹次心)
- TeeRenJing (rjtee)
- phperic (magicrabbit)
- kjushka (Anton Petrov)
- krstak (Marko Krstic)
- lpxxn (Nick)
- ByteFlyCoding
- yangliyl (Yang Li)
- 15535382838
- TajangSec (Tajang)
- lujin1 (lujin)
- parkoo (Tian)
- ZhangXiao1024 (ZX)
- zcgly
- bramvbilsen (Bram Vanbilsen)
- user65536
- tianaiyouqing (天爱有情)
- cuishuang (cui fliter)
- CooolNv (Xuesong)
- yuegu520
- oneweek20169902 (li)
- 3zmx
- 327674413
- melf-xyzh (MELF晓宇)
- L4nn15ter
- rememberher (Jerry)
- oooooobh (cherry)
- xxxwang1983
- funa12
- coolbit
- taitaking (zhukewen)
- kewenof
- ivekkairi (Vivek Kairi)
- edwardfward (Ed)
更多关于Golang Excelize 2.8.1发布 - 强大的开源电子表格(Excel)文档处理库的实战教程也可以访问 https://www.itying.com/category-94-b0.html
干得漂亮,优秀的库!
更多关于Golang Excelize 2.8.1发布 - 强大的开源电子表格(Excel)文档处理库的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
感谢你们的辛勤工作。我在生产环境中使用Excelize,它非常出色。
非常棒的库。我已经在生产环境中使用过,它的速度也非常快。
请分享更多示例代码。这对开发者会有很大帮助。
在补丁修订版本升级中引入破坏性变更的理由是什么?根据语义化版本规范(SemVer),像这样的破坏性变更至少应该触发次版本号的增加,不是吗?例如,应该是 2.9.0 而不是 2.8.1?
我喜欢 excelize - 它是一个很棒的库。
很好!
我刚刚在一个公益项目中使用了Excelize,它运行得非常棒 (除了一个小问题,我根据自己的需求修复了它,并提交了一个草案PR,希望能帮助到遇到相同问题的其他人。)
感谢您提供了如此出色的软件!
Excelize 2.8.1的发布确实带来了许多重要的更新和功能增强,对于处理Excel文档的Go开发者来说是一个值得关注的版本。以下是一些关键特性的代码示例,帮助大家快速上手新功能:
1. 新增 SetCellUint 函数
现在可以直接设置无符号整数到单元格,避免了类型转换的麻烦。
f := excelize.NewFile()
defer func() {
if err := f.Close(); err != nil {
fmt.Println(err)
}
}()
if err := f.SetCellUint("Sheet1", "A1", 18446744073709551615); err != nil {
fmt.Println(err)
}
2. 获取所有包含图片的单元格
GetPictureCells 函数可以方便地获取工作表中所有包含图片的单元格位置。
f, err := excelize.OpenFile("workbook.xlsx")
if err != nil {
fmt.Println(err)
return
}
defer f.Close()
cells, err := f.GetPictureCells("Sheet1")
if err != nil {
fmt.Println(err)
return
}
fmt.Println(cells) // 输出: ["A1", "C5", "D10"]
3. 添加切片器到表格
新增的 AddSlicer 函数允许为表格或数据透视表添加切片器,增强数据筛选功能。
f := excelize.NewFile()
defer func() {
if err := f.Close(); err != nil {
fmt.Println(err)
}
}()
// 先创建表格
if err := f.AddTable("Sheet1", &excelize.Table{
Range: "A1:D5",
Name: "Table1",
}); err != nil {
fmt.Println(err)
return
}
// 为表格添加切片器
if err := f.AddSlicer("Sheet1", &excelize.SlicerOptions{
TableName: "Table1",
Name: "Slicer1",
Cell: "F1",
Column: 1, // 基于表格的第一列创建切片器
}); err != nil {
fmt.Println(err)
}
4. 获取和删除数据透视表
新增的 GetPivotTables 和 DeletePivotTable 函数提供了对数据透视表更细粒度的控制。
f, err := excelize.OpenFile("pivot.xlsx")
if err != nil {
fmt.Println(err)
return
}
defer f.Close()
// 获取所有数据透视表
pivotTables, err := f.GetPivotTables("Sheet1")
if err != nil {
fmt.Println(err)
return
}
for _, pt := range pivotTables {
fmt.Printf("名称: %s, 范围: %s\n", pt.Name, pt.Range)
// 删除指定的数据透视表
if err := f.DeletePivotTable("Sheet1", pt.Name); err != nil {
fmt.Println(err)
}
}
5. 设置图表数据标签位置
现在可以通过 DataLabelPosition 字段精确控制图表数据标签的显示位置。
f := excelize.NewFile()
defer func() {
if err := f.Close(); err != nil {
fmt.Println(err)
}
}()
// 准备图表数据
for idx, row := range [][]interface{}{
{"产品", "销售额"},
{"苹果", 50},
{"香蕉", 40},
{"橙子", 30},
} {
cell, _ := excelize.CoordinatesToCellName(1, idx+1)
f.SetSheetRow("Sheet1", cell, &row)
}
// 创建带数据标签的柱状图
if err := f.AddChart("Sheet1", "E1", &excelize.Chart{
Type: excelize.Col3DClustered,
Series: []excelize.ChartSeries{
{
Name: "Sheet1!$A$1",
Categories: "Sheet1!$A$2:$A$4",
Values: "Sheet1!$B$2:$B$4",
DataLabelPosition: excelize.ChartDataLabelPositionAbove,
},
},
}); err != nil {
fmt.Println(err)
}
6. 设置条件格式支持多范围
SetConditionalFormat 现在支持对多个单元格范围应用相同的条件格式规则。
f := excelize.NewFile()
defer func() {
if err := f.Close(); err != nil {
fmt.Println(err)
}
}()
// 对A1:B2和C3:D4两个区域应用数据条条件格式
format, _ := f.NewConditionalStyle(&excelize.Style{
Fill: excelize.Fill{Type: "gradient", Color: []string{"#63BE7B", "#FCFC00"}},
})
if err := f.SetConditionalFormat("Sheet1", []string{"A1:B2", "C3:D4"},
[]excelize.ConditionalFormatOptions{
{
Type: "dataBar",
Criteria: "=",
Format: format,
},
}); err != nil {
fmt.Println(err)
}
7. 获取首选十六进制颜色代码
GetBaseColor 函数可以帮助获取主题颜色对应的十六进制值。
f := excelize.NewFile()
defer func() {
if err := f.Close(); err != nil {
fmt.Println(err)
}
}()
// 获取主题中第一个强调色的十六进制代码
hexColor, err := f.GetBaseColor(1) // 索引从1开始
if err != nil {
fmt.Println(err)
return
}
fmt.Printf("强调色1: %s\n", hexColor) // 输出: FF5B9BD5
这些新功能显著增强了Excelize库在处理复杂Excel文档时的能力,特别是在数据可视化、条件格式和大数据处理方面。升级到2.8.1版本可以充分利用这些改进,建议在测试环境中验证兼容性后部署到生产环境。

