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

Golang Excel文档处理库Excelize 2.7.0版本发布 Excelize 2.7.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.7.0 版本的发布。此版本包含了一些新的功能领域和大量的错误修复。

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

发布说明

此版本中最显著的变化包括:

重大变更

  • 升级要求 Go 语言版本为 1.16 或更高,以迁移已弃用的 ioutil
  • 检查并返回无效工作表名称的错误,而不是修剪无效字符
  • GetCellStyle 函数不再返回合并单元格范围的主单元格样式
  • 重命名了 5 个导出的数据类型和错误常量:
    • PivotTableOption 重命名为 PivotTableOptions
    • FormatHeaderFooter 重命名为 HeaderFooterOptions
    • FormatSheetProtection 重命名为 SheetProtectionOptions
    • SparklineOption 重命名为 SparklineOptions
    • ErrExistsWorksheet 重命名为 ErrExistsSheet
  • 移除了 54 个导出的类型,更多细节请参阅官方文档网站上的发布页面
  • 更改了 21 个函数的签名,更多细节请参阅官方文档网站上的发布页面
    • SetPageLayout
    • GetPageLayout
    • SetPageMargins
    • GetPageMargins
    • GetSheetIndex
    • SetSheetName
    • GetSheetVisible
    • DeleteSheet
    • NewSheet
    • NewConditionalStyle
    • NewStyle
    • AddChart
    • AddChartSheet
    • AddShape
    • AddPicture
    • AddPictureFromBytes
    • AddTable 和流模式 AddTable 函数
    • AutoFilter
    • SetPanes
    • SetConditionalFormat
  • 引入新函数以替代现有函数:
    • 使用 SetSheetProps 替代 SetSheetPrOptionsSetSheetFormatPr
    • 使用 GetSheetProps 替代 GetSheetPrOptionsGetSheetFormatPr
    • 使用 SetSheetView 替代 SetSheetViewOptions
    • 使用 GetSheetView 替代 GetSheetViewOptions
    • 使用 SetWorkbookProps 替代 SetWorkbookPrOptions
    • 使用 GetWorkbookProps 替代 GetWorkbookPrOptions
    • 使用 InsertRows 替代 InsertRow,以支持一次插入多行
    • 使用 InsertCols 替代 InsertCol,以支持一次插入多列
  • CellType 枚举中添加 CellTypeFormulaCellTypeInlineStringCellTypeSharedString 并移除 CellTypeString
  • AddComment 函数的参数已更改,支持在注释中创建富文本,相关议题 #1204
  • 移除了内部错误日志打印,XML 反序列化错误时将返回错误,为 GetCommentsGetDefaultFontSetDefaultFont 函数添加了错误返回值

显著特性

  • 新增 GetDataValidationsGetConditionalFormats 函数,用于获取数据验证和条件格式,相关议题 #827
  • 新增 ProtectWorkbookUnprotectWorkbook 函数,支持工作簿保护
  • 新增 SetSheetCol 函数,用于设置工作表列单元格,相关议题 #1247
  • 新增 GetColStyle 函数,用于设置列样式,相关议题 #1293
  • 新增 SetSheetBackgroundFromBytes 函数,用于通过给定的图像数据设置背景图片,相关议题 #1405
  • 新增导出变量 IndexedColorMapping
  • 新增 20 个导出类型:AutoFilterListOptionsAutoFilterOptionsChartChartAxisChartDimensionChartLegendChartLineChartMarkerChartPlotAreaChartSeriesChartTitleConditionalFormatOptionsPaneOptionsPanesGraphicOptionsShapeShapeColorShapeLineShapeParagraphTableOptions
  • 新支持 2 个公式函数:AGGREGATE 和 SUBTOTAL
  • SaveWriteWriteTo 函数现在接受保存选项,相关议题 #744
  • AddChart 函数支持指定折线图是否平滑,相关议题 #1290
  • AddChart 函数支持在图表中设置自定义线条颜色,相关议题 #1345
  • AddChart 函数支持自定义图表轴字体样式,相关议题 #320
  • AddChart 函数支持创建 3D 折线图
  • 函数 SetColWidthGetColWidthSetColVisibleGetColVisibleSetColStyleGetColStyle 现在支持并发安全
  • 设置不存在的样式 ID 时将返回错误,相关议题 #1323
  • 当设置流式行时行号未按升序排列时将返回错误,以避免潜在错误,相关议题 #1139
  • 流式写入器将为每个单元格应用 RowOpts 中的样式,相关议题 #1354
  • 流式写入器支持设置窗格,相关议题 #1047
  • 流式写入器支持设置内联富文本单元格
  • 流式写入器支持插入分页符
  • 新增 7 个导出错误:ErrUnprotectWorkbookErrUnprotectWorkbookPasswordErrStreamSetPanesErrSheetNameBlankErrSheetNameInvalidErrSheetNameLengthErrSheetNameSingleQuote
  • 引入 5 个新的导出数据类型:HeaderFooterOptionsPageLayoutMarginsOptionsPageLayoutOptionsSheetPropsOptionsViewOptions
  • 支持设置摘要列显示在明细的右侧
  • 支持使用主题和色调设置和获取字体颜色,相关议题 #1369
  • 支持获取包含 ISO 8601 格式日期的单元格值
  • 支持使用索引颜色设置和获取字体颜色
  • 支持在插入或删除列时更新列样式
  • 工作簿 Close 函数现在支持清理流式写入器的临时文件
  • AddPicture 函数现在允许插入 SVG 格式的图像

提高兼容性

  • 流式写入器为字符串单元格值写入内联字符串类型,相关议题 #1377
  • 保存电子表格时跳过空行以减少文件大小,相关议题 #1383

错误修复

  • 修复了使用内置数字格式时小数数字格式舍入问题,解决问题 #1328、#1368 和 #1373
  • 修复了在某些情况下应用 AM/PM 数字格式的问题,解决问题 #1338
  • 修复了因切片越界导致的删除注释时程序崩溃问题,解决问题 #1343
  • 修复了在某些情况下获取单元格值时程序崩溃问题,解决问题 #1384 和 #1415
  • 修复了默认数字格式解析长数字字符串的问题,解决问题 #1360
  • 修复了使用空名称创建工作表导致文件损坏的问题,解决问题 #1361
  • 修复了插入图片后获取图片内容为空的问题
  • 修复了在某些情况下插入列/行后生成的工作簿损坏问题
  • 在写入公式单元格时删除计算链中的共享公式,以修复在某些情况下生成的工作簿损坏问题
  • 规范化工作表名称以修复 2.6.0 和 2.6.1 版本之间的行为回归,解决问题 #1365
  • 修复了 OR 函数的公式计算结果问题
  • 修复了在包含单单元格合并单元格范围的工作表上插入列或行时的错误
  • 修复了在包含单单元格合并单元格范围的工作表上获取合并单元格范围时的错误
  • 修复了在某些情况下获取不完整的富文本单元格值的问题
  • 为流式写入器转义 XML 字符以避免文件损坏,解决问题 #1391
  • 修复了公式函数 ADDRESS 在空工作表名称时结果错误的问题,解决问题 #1396
  • 修复了在某些情况下插入图片的问题,解决问题 #1404

性能

  • 提高了流式写入器合并单元格的性能,时间成本降低超过 90%,内存使用最多减少约 86%
  • 提高了流式写入器 SetRow 函数的性能,减少内存使用并提速约 19%

其他

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

致谢

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

  • cdenicola (Cooper de Nicola)
  • chenliu1993
  • davidborry
  • patsak (Kostya Privezentsev)
  • dafengge0913
  • Beeb0p (Artem Tarasenko)
  • invzhi
  • zhangzitao (Zitao)
  • jtwatson (Joseph Watson)
  • carbin-gun (charles.deng)
  • harrison3000 (Harrison)
  • strivek (GaoFei)
  • gonghaibinx
  • martinmr (Martin Martinez Rivera)
  • zclark (Zach Clark)
  • March0715 (March)
  • renxiaotu
  • devloppper
  • jianxinhou
  • nesstord
  • Bayzet (Bayzet Tlyupov)
  • guoweikuang (郭伟匡)
  • qinyuguang (Gin)
  • liron-l (Liron Levin)

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

1 回复

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


Excelize 2.7.0 版本的发布确实带来了不少重要的改进和新特性。对于需要处理 Excel 文件的 Go 开发者来说,这个版本在 API 一致性、性能和功能上都有显著提升。特别是流式 API 的优化和新增的并发安全支持,对于处理大型数据集非常有用。

以下是一些关键变更的使用示例:

1. 新增的 SetSheetCol 函数

这个函数可以方便地设置整列的数据:

f := excelize.NewFile()
defer func() {
    if err := f.Close(); err != nil {
        fmt.Println(err)
    }
}()

// 设置第一列的数据
data := [][]interface{}{
    {"姓名"},
    {"张三"},
    {"李四"},
    {"王五"},
}
if err := f.SetSheetCol("Sheet1", "A1", &data); err != nil {
    fmt.Println(err)
}

2. 工作簿保护功能

新增的 ProtectWorkbookUnprotectWorkbook 函数:

f := excelize.NewFile()

// 保护工作簿
if err := f.ProtectWorkbook(&excelize.WorkbookProtectionOptions{
    Password:      "password",
    LockStructure: true,
}); err != nil {
    fmt.Println(err)
}

// 解除保护
if err := f.UnprotectWorkbook("password"); err != nil {
    fmt.Println(err)
}

3. 并发安全的列操作

现在多个列操作函数支持并发安全:

f := excelize.NewFile()

// 并发设置列宽
var wg sync.WaitGroup
for i := 1; i <= 5; i++ {
    wg.Add(1)
    go func(col int) {
        defer wg.Done()
        if err := f.SetColWidth("Sheet1", excelize.ToAlphaString(col), 
            excelize.ToAlphaString(col), 20); err != nil {
            fmt.Println(err)
        }
    }(i)
}
wg.Wait()

4. 新的图表自定义选项

AddChart 函数现在支持更多自定义选项:

f := excelize.NewFile()

// 创建带自定义样式的图表
if err := f.AddChart("Sheet1", "E1", &excelize.Chart{
    Type: excelize.Line,
    Series: []excelize.ChartSeries{
        {
            Name:       "Sheet1!$A$1",
            Categories: "Sheet1!$B$1:$D$1",
            Values:     "Sheet1!$B$2:$D$2",
        },
    },
    Format: excelize.GraphicOptions{
        Smooth: true, // 平滑折线
    },
    Legend: excelize.ChartLegend{
        Position: "bottom",
    },
}); err != nil {
    fmt.Println(err)
}

5. 流式写入器的改进

流式写入器现在支持更多功能:

f := excelize.NewFile()
streamWriter, err := f.NewStreamWriter("Sheet1")
if err != nil {
    fmt.Println(err)
}

// 设置窗格
if err := streamWriter.SetPanes(&excelize.Panes{
    Freeze:      true,
    XSplit:      1,
    YSplit:      1,
    TopLeftCell: "B2",
    ActivePane:  "bottomRight",
}); err != nil {
    fmt.Println(err)
}

// 写入带样式的单元格
styleID, _ := f.NewStyle(&excelize.Style{Font: &excelize.Font{Bold: true}})
if err := streamWriter.SetRow("A1", []interface{}{
    excelize.Cell{Value: "标题", StyleID: styleID},
}, excelize.RowOpts{Height: 20}); err != nil {
    fmt.Println(err)
}

if err := streamWriter.Flush(); err != nil {
    fmt.Println(err)
}

6. 新增的公式函数支持

支持 AGGREGATE 和 SUBTOTAL 函数:

f := excelize.NewFile()

// 设置数据
f.SetSheetRow("Sheet1", "A1", &[]interface{}{1, 2, 3, 4, 5})
f.SetSheetRow("Sheet1", "A2", &[]interface{}{10, 20, 30, 40, 50})

// 使用 SUBTOTAL 函数
f.SetCellFormula("Sheet1", "C1", "SUBTOTAL(9,A1:A5)") // 求和
f.SetCellFormula("Sheet1", "C2", "SUBTOTAL(1,B1:B5)") // 平均值

7. 获取数据验证和条件格式

新增的 GetDataValidationsGetConditionalFormats 函数:

f := excelize.NewFile()

// 设置数据验证
dvRange := excelize.NewDataValidation(true)
dvRange.Sqref = "A1:A10"
dvRange.SetDropList([]string{"选项1", "选项2", "选项3"})
f.AddDataValidation("Sheet1", dvRange)

// 获取数据验证规则
validations, err := f.GetDataValidations("Sheet1")
if err != nil {
    fmt.Println(err)
}
fmt.Printf("数据验证范围: %v\n", validations["A1:A10"])

这些改进使得 Excelize 在处理复杂 Excel 文档时更加稳定和高效。特别是性能优化方面,流式写入器合并单元格的性能提升超过 90%,这对于生成大型报表非常有帮助。

需要注意的是,这个版本有一些破坏性变更,比如函数签名的更改和类型的重命名,在升级时需要相应调整代码。不过这些变更大多是为了提高 API 的一致性和可读性,长期来看是值得的。

回到顶部