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

Golang Excelize 2.8.1发布 - 强大的开源电子表格(Excel)文档处理库 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 结构体字段 AlignWithMarginsScaleWithDoc 的数据类型更改为指针,解决 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 字段以设置线型
  • 新增导出的源关系和命名空间 NameSpaceSpreadSheetXR10ContentTypeSlicerContentTypeSlicerCacheSourceRelationshipSlicer
  • 新增导出的扩展 URI ExtURIPivotCacheDefinition
  • 允许在定义的名称、表名或数据透视表名中使用点字符
  • 删除表格时保留表格范围内的所有单元格值
  • 支持使用分数数字格式代码格式化单元格值
  • 支持在删除图片时从工作簿内部删除图像文件,以减少生成的工作簿大小并解决潜在的安全问题
  • 支持设置注释框的高度和宽度,相关 issue #1688
  • 支持在插入/删除列/行时更新条件格式、数据验证、定义的名称、绘图对象、公式引用和易失性依赖项,相关 issues #1306 和 #1615
  • 支持 6 种新的条件格式类型:文本、空值、非空值、错误、非错误和时间段
  • 支持计算包含多个短横线算术符号的公式
  • 支持在复制行时复制条件格式和数据验证,相关 issue #1729
  • 当使用 SetRowHeight 函数且高度值为 -1 时,支持取消设置自定义行高
  • 如果给定的行高值无效,SetRowHeight 函数将返回错误
  • AddChart 函数支持设置图表的数据标签位置,相关 issue #1704
  • AddChart 函数支持为图表区域、绘图区域和标记设置纯色或透明填充,在 ChartChartPlotAreaChartMarker 数据类型中新增 Fill 字段,相关 issue #1786
  • AddChart 函数支持设置图表轴字体族、大小和删除线样式,相关 issue #1809
  • ChartSeries 数据类型中新增字段 DataLabelPosition,支持设置图表系列数据标签的位置
  • Chart 数据类型中新增字段 BubbleSize,支持为气泡图或 3D 气泡图设置所有数据系列的气泡大小
  • 新增导出的 ChartDataLabelPositionType 数据类型
  • GetPictureCellsGetPictures 函数支持获取由金山 WPS™ Office 创建的嵌入式单元格图片,相关 issue #664
  • SetConditionalFormat 函数支持设置包含多个单元格范围的条件格式,相关 issue #1783
  • 支持在重命名工作表时更新定义的名称引用,相关 issue #1792
  • 新增 GetBaseColor 函数支持获取首选十六进制颜色代码,相关 issue #1794
  • 计算引擎支持日期和公式类型的单元格,相关 issue #1807
  • 单元格值读取函数继承 OpenReaderOptions 设置,相关 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
  • 修复了 GetStyleGetConditionalStyle 函数返回的 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

6 回复

干得漂亮,优秀的库!

更多关于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. 获取和删除数据透视表

新增的 GetPivotTablesDeletePivotTable 函数提供了对数据透视表更细粒度的控制。

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版本可以充分利用这些改进,建议在测试环境中验证兼容性后部署到生产环境。

回到顶部