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

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

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

GitHub: github.com/xuri/excelize

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

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

发布说明

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

重大变更

  • 将导出的变量 ErrTableNameLength 重命名为 ErrNameLength
  • 将导出的类型 PaneOptions 重命名为 Selection
  • 在导出的 Comment 数据类型中,将 Runs 字段重命名为 Paragraph
  • 移除 Style 数据类型中的 Lang 字段
  • 移除了导出的 ChartTitle 数据类型,并使用 RichTextRun 数据类型替代
  • DecimalPlaces 的数据类型更改为整数指针
  • 更改默认的点到像素转换因子,解决问题 #279 和 #1536
  • 更改 AddShape 函数签名:func (f *File) AddShape(sheet, cell string, opts *Shape) error 改为 func (f *File) AddShape(sheet string, opts *Shape) error

重要特性

  • 新增导出的错误变量 ErrExistsTableNameErrorFormControlValue
  • Options 数据类型中新增选项 ShortDatePatternLongDatePatternLongTimePatternCultureInfo,相关议题 #1199
  • 新增导出的 CultureName 枚举数据类型,用于国家代码
  • 新增函数 GetTablesDeleteTable 支持获取和删除表格,相关议题 #674 和 #1454
  • 新增函数 GetStyle 支持获取样式定义,相关议题 #314、#1520 和 #1521
  • 支持对单元格值应用占位符、填充、数字舍入、货币、会计格式和切换参数数字格式,并支持为 812 种语言标签应用日期和时间数字格式,相关议题 #660
  • 新增支持 10 个公式函数:ARRAYTOTEXT, FORECAST, FORECAST.LINEAR, FREQUENCY, INTERCEPT, ODDFYIELD, ODDLPRICE, ODDLYIELD, PROB, VALUETOTEXT
  • 在错误信息中添加文件路径长度限制详情
  • 新增函数 GetPanes 支持获取工作表窗格和视图选择
  • 新增函数 AddFormControlGetFormControlsDeleteFormControl 支持表单控件,相关议题 #301 和 #1169
  • AddChart 函数支持设置主标题,相关议题 #1553
  • AddChart 函数支持创建带有次要系列轴的图表,相关议题 #518
  • AddChart 函数支持为图表设置格式化和富文本标题,相关议题 #1588
  • AddShape 函数添加形状类型检查,如果未指定形状类型将返回错误
  • 支持读取由日本日历数字格式格式化的单元格值,相关议题 #1590
  • GetPictures 函数支持读取单单元格锚定图片,相关议题 #1585
  • NewConditionalStyle 函数支持创建带有数字格式和保护的条件格式,相关议题 #1610

提升兼容性

  • 支持检查包含多字节字符的单元格值长度,相关议题 #1517
  • 防止创建重复的表格和同名的定义名称
  • 提升单元格注释框形状大小与金山 WPS 的兼容性
  • 支持在工作表格式属性中回退到默认列宽,相关议题 #1536
  • 使内部工作表 XML 路径对大小写不敏感以提高兼容性,相关议题 #1591

错误修复

  • 在检查单元格值长度后转义 XML 字符,修复流式写入器生成的文件损坏问题,解决问题 #1518、#1519 和 #1530
  • 修复多行纯文本注释的注释框大小不正确的问题
  • 防止将文本单元格值格式化为数字,解决问题 #1523、#1528 和 #1533
  • 修复并发安全函数的竞态条件
  • 修复日期时间毫秒舍入不正确的问题
  • 修复日期和时间在 AM 12 小时制下数字格式化结果不正确的问题
  • 修复公式函数 SUMIFS 和 AVERAGEIFS 结果不正确的问题,解决问题 #1564
  • 修复计算引擎中基本算术运算符优先级问题,解决问题 #1599
  • 修复公式计算引擎的跨工作表引用问题
  • 修复删除行后调整表格的问题,解决问题 #1539
  • 支持获取单个单元格中的多个图像,解决问题 #1548
  • 修复在某些情况下添加的图片位置不正确的问题,解决问题 #1560
  • 支持在插入列和行时调整公式,修复因插入列或行导致的工作簿损坏问题,解决问题 #1565
  • 公式函数 CONCAT、CONCATENATE 支持连接多个单元格值,解决问题 #1569
  • 修复嵌套参数函数返回数值结果时公式计算结果不正确的问题,解决问题 #1582
  • 修复内部图形对象计数器问题导致的添加图片重复问题,解决问题 #1584
  • 修复因小时舍入问题导致的读取日期时间单元格结果不正确的问题,解决问题 #1587
  • 修复获取起始和结束坐标相同的合并单元格时发生 panic 的问题

性能

  • 优化正则表达式调用以提高性能,相关议题 #1532
  • 避免不必要的字节/字符串转换,相关议题 #1541

其他

  • 已更新依赖模块
  • 简化变量声明和错误返回语句
  • 移除内置语言数字格式代码与 Unicode 值的映射
  • 移除内部 xlsxTabColor 数据类型,使用 xlsxColor 数据类型替代 xlsxTabColor
  • 更新了单元测试和 godoc
  • 更新了多语言文档网站,支持阿拉伯语、德语、西班牙语、英语、法语、俄语、中文、日语和韩语

致谢

感谢所有为 Excelize 做出贡献的人。以下是此版本中有代码贡献的贡献者列表:

  • IAkumaI (Valery Ozarnichuk)
  • sillydong (陈志东)
  • fudali113 (fudali)
  • Juneezee (Eng Zer Jun)
  • joehan109
  • yicixin (壹次心)
  • vb6iscool
  • chengcxy (chengxinyao)
  • lidp20
  • JDavidVR (David)
  • fsfsx
  • cnmlgbgithub

更多关于Golang Excelize 2.8.0 发布 - 强大的开源电子表格(Excel)文档处理库的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

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


Excelize 2.8.0 的发布确实带来了许多重要的改进和新功能。以下是一些关键变更的示例代码,帮助大家快速了解如何使用部分新特性。

1. 获取和删除表格

新增的 GetTablesDeleteTable 函数使得表格操作更加方便。

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)
        }
    }()
    // 获取所有表格
    tables, err := f.GetTables("Sheet1")
    if err != nil {
        fmt.Println(err)
        return
    }
    for _, table := range tables {
        fmt.Println(table)
    }
    // 删除指定表格
    if err := f.DeleteTable("Sheet1", "Table1"); err != nil {
        fmt.Println(err)
    }
}

2. 获取样式定义

GetStyle 函数允许你获取单元格的样式定义。

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)
        }
    }()
    styleID, err := f.NewStyle(&excelize.Style{
        Font: &excelize.Font{Color: "1265BE", Bold: true},
    })
    if err != nil {
        fmt.Println(err)
        return
    }
    if err := f.SetCellStyle("Sheet1", "A1", "A1", styleID); err != nil {
        fmt.Println(err)
        return
    }
    // 获取样式定义
    style, err := f.GetStyle(styleID)
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Printf("%+v\n", style)
}

3. 新增公式函数

此版本新增了10个公式函数,例如 VALUETOTEXT

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.SetCellFormula("Sheet1", "A1", "VALUETOTEXT(123)"); err != nil {
        fmt.Println(err)
        return
    }
    // 计算公式
    result, err := f.CalcCellValue("Sheet1", "A1")
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Println(result) // 输出: 123
}

4. 表单控件支持

新增的 AddFormControl 等函数允许在Excel中添加表单控件。

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.AddFormControl("Sheet1", excelize.FormControl{
        Cell: "A1",
        Type: excelize.FormControlButton,
        Text: "Click Me",
    }); err != nil {
        fmt.Println(err)
    }
    if err := f.SaveAs("Book1.xlsx"); err != nil {
        fmt.Println(err)
    }
}

5. 带富文本标题的图表

AddChart 现在支持为图表设置格式化和富文本标题。

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)
        }
    }()
    for idx, row := range [][]interface{}{
        {"Apple", "Orange"},
        {1, 2},
        {3, 4},
    } {
        cell, err := excelize.CoordinatesToCellName(1, idx+1)
        if err != nil {
            fmt.Println(err)
            return
        }
        if err := f.SetSheetRow("Sheet1", cell, &row); err != nil {
            fmt.Println(err)
            return
        }
    }
    if err := f.AddChart("Sheet1", "E1", &excelize.Chart{
        Type: excelize.Col3DClustered,
        Series: []excelize.ChartSeries{
            {
                Name:       "Sheet1!$A$1",
                Categories: "Sheet1!$A$2:$A$3",
                Values:     "Sheet1!$B$2:$B$3",
            },
        },
        Title: []excelize.RichTextRun{
            {Text: "Sales ", Font: &excelize.Font{Bold: true, Color: "1265BE"}},
            {Text: "Report", Font: &excelize.Font{Italic: true, Color: "CC0000"}},
        },
    }); err != nil {
        fmt.Println(err)
        return
    }
    if err := f.SaveAs("Book1.xlsx"); err != nil {
        fmt.Println(err)
    }
}

6. 新增形状类型检查

AddShape 函数现在会检查形状类型,如果未指定将返回错误。

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.AddShape("Sheet1", &excelize.Shape{
        Cell: "A1",
        Type: excelize.ShapeOval,
    }); err != nil {
        fmt.Println(err)
    }
    // 未指定类型将返回错误
    if err := f.AddShape("Sheet1", &excelize.Shape{
        Cell: "B1",
    }); err != nil {
        fmt.Println(err) // 输出错误: shape type is required
    }
}

这些示例展示了Excelize 2.8.0中部分重要新功能的使用方法。更多详细信息和完整API请参考官方文档。

回到顶部