Golang Excel文档处理库Excelize 2.6.0版本发布

Golang Excel文档处理库Excelize 2.6.0版本发布 Excelize 2.6.0 Released – Go language API for spreadsheet (Excel) documents

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

GitHub: github.com/xuri/excelize

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

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

Release Notes

此版本中最值得注意的变更如下:

Compatibility

  • 将导出的常量 NameSpaceDublinCoreMetadataIntiative 重命名为 NameSpaceDublinCoreMetadataInitiative 以修复拼写错误
  • 将导出的变量 ErrUnsupportEncryptMechanism 重命名为 ErrUnsupportedEncryptMechanism
  • 将导出的变量 ErrDataValidationFormulaLenth 重命名为 ErrDataValidationFormulaLength
  • 将导出的变量 ErrDefinedNameduplicate 重命名为 ErrDefinedNameDuplicate
  • 移除导出的变量 XMLHeaderByte
  • 移除函数 SetSqrefDropList 的第二个无用参数 isCurrentSheet 和错误返回值
  • 移除行迭代器的 TotalRows

Notable Features

  • ProtectSheet 现在支持使用指定算法保护工作表:XOR、MD4、MD5、SHA1、SHA256、SHA384 和 SHA512
  • UnprotectSheet 现在支持指定第二个可选密码参数,以通过密码验证移除工作表保护
  • 新增支持 71 个公式函数:AVERAGEIFS, BETADIST, BETA.DIST, BETAINV, BETA.INV, BINOMDIST, BINOM.DIST, BINOM.DIST.RANGE, BINOM.INV, CHIINV, CHITEST, CHISQ.DIST, CHISQ.DIST.RT, CHISQ.INV, CHISQ.INV.RT, CHISQ.TEST, CONFIDENCE.T, CORREL, COVAR, COVARIANCE.P, CRITBINOM, ERROR.TYPE, EXPON.DIST, EXPONDIST, F.DIST, F.DIST.RT, FDIST, F.INV, F.INV.RT, FINV, FORMULATEXT, F.TEST, FTEST, GAMMA.DIST, GAMMADIST, GAMMA.INV, GAMMAINV, GAMMALN.PRECISE, GAUSS, HOUR, HYPGEOM.DIST, HYPGEOMDIST, INDIRECT, LOGINV, LOGNORM.DIST, LOGNORMDIST, LOGNORM.INV, MODE, MODE.MULT, MODE.SNGL, NEGBINOM.DIST, NEGBINOMDIST, PHI, SECOND, SERIESSUM, SUMIFS, SUMPRODUCT, SUMX2MY2, SUMX2PY2, SUMXMY2, T.DIST, T.DIST.2T, T.DIST.RT, TDIST, TIMEVALUE, T.INV, T.INV.2T, TINV, T.TEST, TTEST, TYPE
  • 在保存工作簿时检查文件扩展名
  • 支持工作簿视图模式和标尺显示设置
  • 改进数字格式支持,引入了 NFP(数字格式解析器)依赖模块,以支持自定义日期和时间数字格式以及文本占位符,包括对 19 种语言(南非荷兰语、孟加拉语、中文、英语、法语、德语、奥地利语、爱尔兰语、意大利语、俄语、西班牙语、泰语、藏语、土耳其语、威尔士语、沃洛夫语、科萨语、彝语和祖鲁语)的本地月份名称和 AM/PM 格式支持,相关议题 #660, #764, #1093, #1112, #1133
  • 新增导出的函数 SetWorkbookPrOptionsGetWorkbookPrOptions,用于设置和获取工作簿的 FilterPrivacyCodeName 属性,解决了向工作簿添加 VBA 项目时的限制,相关议题 #1148
  • 公式引擎现在支持在中缀运算符表示法后使用无参数公式函数进行计算
  • 支持读取布尔数据类型单元格值
  • 支持在通过 AddChart 函数创建环形图时设置孔洞大小,解决议题 #1172
  • 导出 4 个错误 ErrPasswordLengthInvalidErrUnsupportedHashAlgorithmErrUnsupportedNumberFormatErrWorkbookExt,以便用户可以根据不同类型的错误采取不同的操作

Improve the Compatibility

  • 提高与 LibreOffice 的兼容性,修复了当工作表名称包含空格时,自动筛选在 LibreOffice 中不起作用的问题,解决议题 #1122
  • 提高与备用内容的兼容性,支持在工作簿、工作表和 drawingML 中保留备用内容
  • 提高与页面设置 DPI 字段的兼容性

Bug Fixes

  • 修复重新保存电子表格后工作表页面设置丢失的问题,解决议题 #1117
  • 修复在某些情况下操作后合并单元格未更新的问题
  • 修复样式解析问题,该问题导致粗体和其他样式丢失,解决议题 #1119
  • 修复在某些情况下以 XLAM / XLSM / XLTM / XLTX 扩展名保存时文件损坏的问题
  • 更正合并区域中的单元格样式,使单元格支持继承列/行样式,解决议题 #1129
  • 修复在某些情况下获取单元格样式时返回的样式 ID 不正确的问题
  • 修复内置数字格式 42 不正确的问题
  • 修复在某些情况下解析十进制精度的问题
  • SetCellDefault 支持非数值,解决议题 #1139
  • 修复在某些情况下另存为电子表格时缺少显示工作表选项卡设置的问题,解决议题 #1160
  • 修复嵌套公式计算结果错误,解决议题 #1164
  • 修复部分公式函数计算结果精度问题以及在 x86 和 arm64 处理器(CPU)架构下公式计算结果精度不一致的问题
  • 修复在某些情况下科学计数法解析问题
  • 修复当值为 0 时图表轴最大值和最小值不起作用的问题

Performance

  • 提高流式读取性能,基于之前发布的版本,对于读取大型数据电子表格,最多可减少约 50% 的内存使用,并将行迭代器的 GC 次数减少 80%

Miscellaneous

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

更多关于Golang Excel文档处理库Excelize 2.6.0版本发布的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于Golang Excel文档处理库Excelize 2.6.0版本发布的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


Excelize 2.6.0版本的发布确实带来了许多重要的改进和新功能,对于处理Excel文档的Go开发者来说是一个值得关注的更新。以下是一些关键点的技术解析和示例代码:

1. 工作表保护算法的增强

ProtectSheet 现在支持多种哈希算法,这增强了工作表保护的安全性。以下是使用SHA256算法保护工作表的示例:

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)
        }
    }()
    // 创建新工作表
    index, _ := f.NewSheet("Sheet2")
    // 设置单元格值
    f.SetCellValue("Sheet2", "A1", "Hello")
    // 使用SHA256算法保护工作表
    if err := f.ProtectSheet("Sheet2", &excelize.FormatSheetProtection{
        AlgorithmName: "SHA-256",
        Password:      "password",
    }); err != nil {
        fmt.Println(err)
        return
    }
    // 设置工作簿的活动工作表
    f.SetActiveSheet(index)
    // 保存工作簿
    if err := f.SaveAs("Book1.xlsx"); err != nil {
        fmt.Println(err)
    }
}

2. 新增公式函数支持

新增的71个公式函数大大扩展了Excelize的计算能力。以下是使用新增的SUMIFS函数的示例:

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)
        }
    }()
    // 设置单元格值
    data := [][]interface{}{
        {"Item", "Region", "Sales"},
        {"Apple", "North", 100},
        {"Apple", "South", 200},
        {"Orange", "North", 150},
        {"Orange", "South", 250},
    }
    for i, row := range data {
        cell, _ := excelize.CoordinatesToCellName(1, i+1)
        f.SetSheetRow("Sheet1", cell, &row)
    }
    // 设置SUMIFS公式
    f.SetCellFormula("Sheet1", "B6", "SUMIFS(C2:C5, A2:A5, \"Apple\", B2:B5, \"North\")")
    // 计算公式
    result, _ := f.CalcCellValue("Sheet1", "B6")
    fmt.Printf("SUMIFS result: %s\n", result) // 输出: 100
    // 保存工作簿
    if err := f.SaveAs("Book1.xlsx"); err != nil {
        fmt.Println(err)
    }
}

3. 布尔数据类型支持

现在可以直接读取布尔类型的单元格值,这简化了布尔数据的处理:

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)
        }
    }()
    // 设置布尔值
    f.SetCellValue("Sheet1", "A1", true)
    f.SetCellValue("Sheet1", "A2", false)
    // 读取布尔值
    val1, _ := f.GetCellValue("Sheet1", "A1")
    val2, _ := f.GetCellValue("Sheet1", "A2")
    fmt.Printf("A1: %s, A2: %s\n", val1, val2) // 输出: A1: true, A2: false
    // 保存工作簿
    if err := f.SaveAs("Book1.xlsx"); err != nil {
        fmt.Println(err)
    }
}

4. 工作簿属性设置

新增的SetWorkbookPrOptions函数允许设置工作簿的FilterPrivacyCodeName属性:

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.SetWorkbookPrOptions(
        excelize.FilterPrivacy(true),
        excelize.CodeName("MyWorkbook"),
    ); err != nil {
        fmt.Println(err)
        return
    }
    // 获取工作簿属性
    opts, _ := f.GetWorkbookPrOptions()
    fmt.Printf("FilterPrivacy: %v, CodeName: %s\n", 
        opts.FilterPrivacy, opts.CodeName)
    // 保存工作簿
    if err := f.SaveAs("Book1.xlsx"); err != nil {
        fmt.Println(err)
    }
}

5. 环形图孔洞大小设置

现在可以在创建环形图时设置孔洞大小:

package main

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

func main() {
    f := excelize.NewFile()
    defer func() {
        if err := f.Close(); err != nil {
            panic(err)
        }
    }()
    // 设置图表数据
    for idx, row := range [][]interface{}{
        {"Apple", "Orange"},
        {10, 20},
    } {
        cell, _ := excelize.CoordinatesToCellName(1, idx+1)
        f.SetSheetRow("Sheet1", cell, &row)
    }
    // 创建环形图并设置孔洞大小
    if err := f.AddChart("Sheet1", "E1", &excelize.Chart{
        Type: excelize.Doughnut,
        Series: []excelize.ChartSeries{
            {
                Name:       "Sheet1!$A$1",
                Categories: "Sheet1!$A$2:$B$2",
                Values:     "Sheet1!$A$3:$B$3",
            },
        },
        Format: excelize.GraphicOptions{
            OffsetX: 15,
            OffsetY: 10,
        },
        Legend: excelize.ChartLegend{
            Position: "left",
        },
        Title: excelize.ChartTitle{
            Name: "环形图示例",
        },
        Doughnut: &excelize.DoughnutChartOptions{
            HoleSize: 50, // 设置孔洞大小为50%
        },
    }); err != nil {
        panic(err)
    }
    // 保存工作簿
    if err := f.SaveAs("Book1.xlsx"); err != nil {
        panic(err)
    }
}

6. 错误处理改进

新增的导出错误类型使得错误处理更加精确:

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)
        }
    }()
    // 尝试使用不支持的哈希算法
    err := f.ProtectSheet("Sheet1", &excelize.FormatSheetProtection{
        AlgorithmName: "UNSUPPORTED_ALGORITHM",
        Password:      "password",
    })
    if err != nil {
        if err == excelize.ErrUnsupportedHashAlgorithm {
            fmt.Println("不支持的哈希算法")
        } else {
            fmt.Printf("其他错误: %v\n", err)
        }
    }
}

7. 流式读取性能优化

对于大型Excel文件,流式读取现在有更好的内存表现:

package main

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

func main() {
    f, err := excelize.OpenFile("large_file.xlsx")
    if err != nil {
        fmt.Println(err)
        return
    }
    defer func() {
        if err := f.Close(); err != nil {
            fmt.Println(err)
        }
    }()
    // 使用流式读取器
    rows, err := f.Rows("Sheet1")
    if err != nil {
        fmt.Println(err)
        return
    }
    defer rows.Close()
    // 逐行读取
    for rows.Next() {
        row, err := rows.Columns()
        if err != nil {
            fmt.Println(err)
            break
        }
        // 处理行数据
        fmt.Println(row)
    }
}

这些示例展示了Excelize 2.6.0版本中一些重要新功能的实际应用。版本更新中的性能改进、错误修复和兼容性增强使得这个库在处理Excel文档时更加可靠和高效。特别是流式读取的内存优化,对于处理大型数据文件具有重要意义。

回到顶部