Golang Excelize 2.1.0 正式发布

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

Excelize 是一个用纯 Go 语言编写的库,提供了一系列函数,允许您读写 XLSX 文件。支持读写由 Microsoft Excel™ 2007 及更高版本生成的 XLSX 文件。支持保存文件而不丢失 XLSX 的原始图表。

GitHub: github.com/xuri/excelize

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

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

发布说明

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

重要特性

  • 新增函数 DeleteDefinedName,支持删除工作簿或工作表的定义名称
  • 新增函数 SetPageMarginsGetPageMargins,支持获取和设置页面边距
  • 新增函数 DeleteChartDeletePicture,支持从工作表中删除图表和图片
  • 添加对使用非 UTF-8 编码的 Excel 文件的支持
  • 函数 AddChart 现在支持创建复合饼图和条形饼图以及组合图表 函数 AddChart 现在支持为图表设置次要网格线,相关 issue #501 函数 AddChart 现在支持设置折线图的线宽,相关 issue #505 函数 AddChart 现在支持为图表设置主要单位和刻度标签跳过,相关 issue #538
  • 函数 SetColVisible 现在支持按列范围设置列可见性
  • 函数 AddPivotTable 允许数据透视表中存在空列,相关 issue #511

错误修复

  • 修复单元格文本末尾空格丢失的问题
  • MergeCell 函数支持重叠的合并单元格,解决 issue #533
  • 在某些情况下添加了对空内联富文本的处理,解决 issue #529
  • 在某些情况下添加了对空工作簿视图的处理,解决 issue #426
  • 添加了对公式中转义字符的处理,解决 issue #546

性能

  • 新增函数 NewStreamWriterFlush,用于生成包含大量数据的新工作表。与非流式写入相比,内存使用减少了 90.2%,时间成本降低了 53%
  • 使 GetRows 函数以流式方式读取数据。内存使用减少了 78.9%,相关 issues #146 和 #382
  • 兼容性改进,增加了对 49 个内部 XML 命名空间的支持

其他

  • 添加了在解码 XML 时记录可能错误的日志,相关 issues #539
  • 提高了代码覆盖率单元测试(行覆盖率:97.04%)
  • 在单元测试中添加了缺失的错误检查
  • 文档网站 支持多语言:英语、法语、俄语、中文、日语和韩语,并已更新

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

1 回复

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


Excelize 2.1.0 的发布确实带来了许多重要改进,特别是在性能优化和新功能支持方面。新增的流式读写API对于处理大型Excel文件尤其关键,能显著降低内存消耗。

下面是一个使用 NewStreamWriter 生成大型数据集的示例:

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)
        }
    }()

    // 创建流式写入器
    sw, err := f.NewStreamWriter("Sheet1")
    if err != nil {
        fmt.Println(err)
        return
    }

    // 设置表头
    headers := []interface{}{"ID", "Name", "Score"}
    cell, _ := excelize.CoordinatesToCellName(1, 1)
    if err := sw.SetRow(cell, headers); err != nil {
        fmt.Println(err)
        return
    }

    // 批量写入数据行
    for i := 2; i <= 100000; i++ {
        row := []interface{}{i, fmt.Sprintf("User%d", i), i % 100}
        cell, _ := excelize.CoordinatesToCellName(1, i)
        if err := sw.SetRow(cell, row); err != nil {
            fmt.Println(err)
            return
        }
    }

    // 刷新流式写入器
    if err := sw.Flush(); err != nil {
        fmt.Println(err)
        return
    }

    // 保存文件
    if err := f.SaveAs("large_file.xlsx"); err != nil {
        fmt.Println(err)
    }
}

新增的 DeleteChartDeletePicture 函数使用示例如下:

// 删除图表
if err := f.DeleteChart("Sheet1", "chart1"); err != nil {
    fmt.Println("删除图表失败:", err)
}

// 删除图片
if err := f.DeletePicture("Sheet1", "picture1"); err != nil {
    fmt.Println("删除图片失败:", err)
}

SetPageMarginsGetPageMargins 的用法:

// 设置页面边距
margins := &excelize.PageLayoutMargins{
    Left:   0.7,
    Right:  0.7,
    Top:    0.75,
    Bottom: 0.75,
    Header: 0.3,
    Footer: 0.3,
}
if err := f.SetPageMargins("Sheet1", margins); err != nil {
    fmt.Println(err)
}

// 获取页面边距
retrievedMargins, err := f.GetPageMargins("Sheet1")
if err != nil {
    fmt.Println(err)
} else {
    fmt.Printf("左边距: %.2f\n", retrievedMargins.Left)
}

对于复合饼图的创建:

if err := f.AddChart("Sheet1", "E1", &excelize.Chart{
    Type: excelize.Pie,
    Series: []excelize.ChartSeries{
        {
            Name:       "销售额",
            Categories: "Sheet1!$A$2:$A$5",
            Values:     "Sheet1!$B$2:$B$5",
        },
    },
    Format: excelize.GraphicOptions{
        OffsetX: 15,
        OffsetY: 10,
    },
    Title: []excelize.RichTextRun{
        {
            Text: "季度销售分布",
        },
    },
    PlotArea: excelize.ChartPlotArea{
        SecondPieSize: 75, // 设置第二饼图大小
    },
}); err != nil {
    fmt.Println(err)
}

流式读取的改进让 GetRows 在处理大文件时更加高效:

rows, err := f.GetRows("Sheet1")
if err != nil {
    fmt.Println(err)
    return
}
for _, row := range rows {
    for _, colCell := range row {
        fmt.Print(colCell, "\t")
    }
    fmt.Println()
}

这些新特性让Excelize在处理复杂Excel文件时更加灵活和高效。

回到顶部