Golang Excelize 2.3.2 正式发布

Golang Excelize 2.3.2 正式发布 github.com/360EntSecGroup-Skylar/excelize

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

GitHub: github.com/xuri/excelize

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

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

发布说明

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

主要特性

  • AddPivotTable 函数现在支持非列字段和多个数据字段,相关议题 #710
  • GetCellValue 函数支持自定义日期时间数字格式,相关议题 #703
  • CalcCellValue 函数现在支持新的公式函数 ANDCLEANTRIMLOWERPROPERUPPEROR,相关议题 #701#747
  • 数据验证的范围现在支持浮点小数,相关议题 #739
  • AddChart 函数现在支持设置标记类型和自定义线条宽度,相关议题 #549#657
  • AddChart 函数支持指定图例是否显示且不与图表重叠

兼容性改进

  • 改进了与金山 WPS™ 的超过 6 个系列线图的兼容性,解决问题 #627
  • 避免在某些情况下创建重复的内部样式
  • 动态解析文档核心部分(工作簿)
  • 支持工作表中包含重复行元素的单行数据,解决问题 #732

错误修复

  • 防止公式词法分析器在某些无效公式上检索顶部令牌类型时发生恐慌,解决问题 #711
  • 修复了使用相同名称重命名时工作表丢失的问题,解决问题 #713
  • 修复了在某些情况下 NewSheet 返回错误工作表索引的问题,解决问题 #714
  • 修复了在没有内置数字格式 ID 的情况下格式化值时发生恐慌的问题,解决问题 #715#741
  • 为公式计算对数值进行精度舍入,解决问题 #727
  • 修复行重复机制 #729
  • 修复了在某些情况下删除工作表后活动标签页不正确的问题,解决问题 #735
  • 修复了 AddPicture 在多个合并单元格情况下自动适应失败的问题,解决问题 #748

性能

  • 流式写入内存使用量减少约 60%,相关议题 #659
  • 优化 workSheetWriter 的内存分配,相关议题 #722
  • 提高 AddPicture 的性能,相关议题 #706

其他

  • 单元测试和 godoc 已更新
  • 文档网站 已更新,支持多语言:英语、法语、俄语、中文、日语和韩语,并发布了 3 种新语言版本:阿拉伯语、德语和西班牙语
  • 欢迎加入 Slack 频道Telegram 群组Discord 频道 来认识我们社区的其他成员

更多关于Golang Excelize 2.3.2 正式发布的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于Golang Excelize 2.3.2 正式发布的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


Excelize 2.3.2 的发布确实带来了许多重要的改进和新功能。以下是对其中一些关键特性的代码示例说明:

1. AddPivotTable 支持非列字段和多个数据字段

现在可以创建更灵活的数据透视表,例如将行字段设置为非列字段,并添加多个数据字段进行聚合计算。

package main

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

func main() {
    f := excelize.NewFile()
    // 创建示例数据
    for idx, row := range [][]interface{}{
        {"品类", "地区", "销售额", "利润"},
        {"电子产品", "北京", 1000, 200},
        {"电子产品", "上海", 1500, 300},
        {"服装", "北京", 800, 150},
        {"服装", "上海", 1200, 250},
    } {
        cell, _ := excelize.CoordinatesToCellName(1, idx+1)
        f.SetSheetRow("Sheet1", cell, &row)
    }
    
    // 创建数据透视表
    pivotTable := &excelize.PivotTableOptions{
        DataRange:       "Sheet1!$A$1:$D$5",
        PivotTableRange: "Sheet1!$F$2:$M$10",
        Rows: []excelize.PivotTableField{
            {Data: "品类", Name: "品类"},
            {Data: "地区", Name: "地区"},
        },
        Data: []excelize.PivotTableField{
            {Data: "销售额", Name: "总销售额", Subtotal: "Sum"},
            {Data: "利润", Name: "总利润", Subtotal: "Sum"},
        },
    }
    
    if err := f.AddPivotTable(pivotTable); err != nil {
        fmt.Println(err)
        return
    }
    
    if err := f.SaveAs("pivot_table.xlsx"); err != nil {
        fmt.Println(err)
    }
}

2. GetCellValue 支持自定义日期时间格式

现在可以正确读取使用自定义日期时间格式的单元格值。

package main

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

func main() {
    f := excelize.NewFile()
    
    // 设置自定义日期格式
    style, _ := f.NewStyle(&excelize.Style{
        NumFmt: 22, // 自定义日期格式:yyyy-mm-dd hh:mm:ss
    })
    
    f.SetCellValue("Sheet1", "A1", 44721.5) // Excel中的日期时间值
    f.SetCellStyle("Sheet1", "A1", "A1", style)
    
    // 读取单元格值
    value, _ := f.GetCellValue("Sheet1", "A1")
    fmt.Printf("单元格值: %s\n", value) // 输出: 2022-06-15 12:00:00
    
    f.SaveAs("custom_date.xlsx")
}

3. CalcCellValue 新增公式函数支持

现在支持更多的Excel公式函数,包括文本处理和逻辑函数。

package main

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

func main() {
    f := excelize.NewFile()
    
    // 设置数据
    f.SetCellValue("Sheet1", "A1", "  HELLO  ")
    f.SetCellValue("Sheet1", "A2", "world")
    f.SetCellValue("Sheet1", "B1", true)
    f.SetCellValue("Sheet1", "B2", false)
    
    // 使用TRIM和LOWER函数
    f.SetCellFormula("Sheet1", "C1", "=TRIM(A1)")
    f.SetCellFormula("Sheet1", "C2", "=LOWER(A2)")
    
    // 使用AND和OR函数
    f.SetCellFormula("Sheet1", "D1", "=AND(B1,B2)")
    f.SetCellFormula("Sheet1", "D2", "=OR(B1,B2)")
    
    // 计算公式结果
    result1, _ := f.CalcCellValue("Sheet1", "C1")
    result2, _ := f.CalcCellValue("Sheet1", "C2")
    result3, _ := f.CalcCellValue("Sheet1", "D1")
    result4, _ := f.CalcCellValue("Sheet1", "D2")
    
    fmt.Printf("TRIM结果: %s\n", result1)  // 输出: HELLO
    fmt.Printf("LOWER结果: %s\n", result2) // 输出: world
    fmt.Printf("AND结果: %s\n", result3)   // 输出: FALSE
    fmt.Printf("OR结果: %s\n", result4)    // 输出: TRUE
    
    f.SaveAs("formulas.xlsx")
}

4. 数据验证支持浮点小数

现在可以在数据验证中使用浮点数范围。

package main

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

func main() {
    f := excelize.NewFile()
    
    // 设置浮点数范围的数据验证
    dvRange := excelize.NewDataValidation(true)
    dvRange.SetSqref("A1:A10")
    dvRange.SetRange(excelize.DataValidationTypeDecimal, 
        excelize.DataValidationOperatorBetween, "0.5", "10.5", "")
    dvRange.SetError(excelize.DataValidationErrorStyleStop, 
        "输入错误", "请输入0.5到10.5之间的数值")
    
    f.AddDataValidation("Sheet1", dvRange)
    
    f.SaveAs("data_validation.xlsx")
}

5. AddChart 增强图表配置

现在可以更精细地控制图表样式,包括标记类型和线条宽度。

package main

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

func main() {
    f := excelize.NewFile()
    
    // 创建示例数据
    for idx, row := range [][]interface{}{
        {"月份", "销售额"},
        {"1月", 1000},
        {"2月", 1500},
        {"3月", 1200},
        {"4月", 1800},
    } {
        cell, _ := excelize.CoordinatesToCellName(1, idx+1)
        f.SetSheetRow("Sheet1", cell, &row)
    }
    
    // 创建带自定义样式的图表
    chart := &excelize.Chart{
        Type: excelize.Line,
        Series: []excelize.ChartSeries{
            {
                Name:       "Sheet1!$B$1",
                Categories: "Sheet1!$A$2:$A$5",
                Values:     "Sheet1!$B$2:$B$5",
                Marker: excelize.ChartMarker{
                    Symbol: "circle", // 设置标记类型
                    Size:   8,
                },
                Line: excelize.ChartLine{
                    Width: 2.5, // 设置线条宽度
                },
            },
        },
        Legend: excelize.ChartLegend{
            Position:      "bottom",
            ShowLegendKey: true,
        },
    }
    
    f.AddChart("Sheet1", "D2", chart)
    f.SaveAs("chart_custom.xlsx")
}

6. 流式写入内存优化

使用流式API处理大数据量时,内存使用量显著减少。

package main

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

func main() {
    f := excelize.NewFile()
    streamWriter, _ := f.NewStreamWriter("Sheet1")
    
    // 写入表头
    streamWriter.SetRow("A1", []interface{}{
        excelize.Cell{Value: "ID"},
        excelize.Cell{Value: "姓名"},
        excelize.Cell{Value: "年龄"},
    })
    
    // 流式写入大量数据
    for i := 2; i <= 100000; i++ {
        row := []interface{}{
            excelize.Cell{Value: i},
            excelize.Cell{Value: "用户"},
            excelize.Cell{Value: 25},
        }
        cell, _ := excelize.CoordinatesToCellName(1, i)
        streamWriter.SetRow(cell, row)
    }
    
    streamWriter.Flush()
    f.SaveAs("large_data.xlsx")
}

这些示例展示了Excelize 2.3.2版本中一些重要新功能的实际应用。性能优化和错误修复使得这个版本在处理复杂Excel文件时更加稳定和高效。

回到顶部