Golang Excelize 2.1.0 正式发布
Golang Excelize 2.1.0 正式发布
Excelize 是一个用纯 Go 语言编写的库,提供了一系列函数,允许您读写 XLSX 文件。支持读写由 Microsoft Excel™ 2007 及更高版本生成的 XLSX 文件。支持保存文件而不丢失 XLSX 的原始图表。
GitHub: github.com/xuri/excelize
我们很高兴地宣布发布 2.1.0 版本。此版本包含一些新的功能领域和大量的错误修复。
变更摘要可在发布说明中查看。完整的变更列表可在更新日志中找到。
发布说明
此版本中最值得注意的变更有:
重要特性
- 新增函数
DeleteDefinedName,支持删除工作簿或工作表的定义名称 - 新增函数
SetPageMargins和GetPageMargins,支持获取和设置页面边距 - 新增函数
DeleteChart和DeletePicture,支持从工作表中删除图表和图片 - 添加对使用非 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
性能
- 新增函数
NewStreamWriter和Flush,用于生成包含大量数据的新工作表。与非流式写入相比,内存使用减少了 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
更多关于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)
}
}
新增的 DeleteChart 和 DeletePicture 函数使用示例如下:
// 删除图表
if err := f.DeleteChart("Sheet1", "chart1"); err != nil {
fmt.Println("删除图表失败:", err)
}
// 删除图片
if err := f.DeletePicture("Sheet1", "picture1"); err != nil {
fmt.Println("删除图片失败:", err)
}
SetPageMargins 和 GetPageMargins 的用法:
// 设置页面边距
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文件时更加灵活和高效。

