Golang读取Excel文件的性能对比
在Golang中读取Excel文件时,有哪些高性能的库推荐?目前主流的库如excelize、tealeg/xlsx等在处理大文件时的性能表现如何?是否有实测数据对比?另外,对于百万级数据的Excel文件,有哪些优化读取速度的技巧或最佳实践?
2 回复
在Golang中读取Excel文件,主要有以下几种方案:
-
tealeg/xlsx - 纯Go实现,支持读写,但处理大文件时内存占用较高,性能一般。
-
qax-os/excelize - 功能丰富,支持图表等高级特性,性能较好,适合处理复杂Excel文件。
-
unidoc/unioffice - 专业文档处理库,对Excel支持强,但较重量级。
-
streaming方式 - 如使用
excelize的流式API,适合处理超大型文件(如几十万行),内存占用低,但功能受限。
性能对比:
- 小文件(<1MB):各库差异不大,
excelize略优。 - 大文件(>10MB):
excelize流式读取性能最佳,内存控制好;tealeg/xlsx容易OOM。 - 超大数据集:推荐流式处理,避免全量加载。
建议:
- 日常使用选
excelize,平衡功能与性能。 - 仅读取数据可考虑
csv格式,速度更快。 - 内存敏感场景务必用流式API。
更多关于Golang读取Excel文件的性能对比的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
在Golang中读取Excel文件主要有以下几种方式,性能对比如下:
1. excelize(推荐)
性能:★★★★★
package main
import (
"fmt"
"time"
"github.com/xuri/excelize/v2"
)
func main() {
start := time.Now()
f, err := excelize.OpenFile("large_file.xlsx")
if err != nil {
fmt.Println(err)
return
}
defer f.Close()
// 读取所有工作表
rows, err := f.GetRows("Sheet1")
if err != nil {
fmt.Println(err)
return
}
for _, row := range rows {
// 处理每行数据
_ = row
}
fmt.Printf("excelize耗时: %v\n", time.Since(start))
}
2. tealeg/xlsx
性能:★★★★
package main
import (
"fmt"
"time"
"github.com/tealeg/xlsx"
)
func main() {
start := time.Now()
file, err := xlsx.OpenFile("large_file.xlsx")
if err != nil {
fmt.Println(err)
return
}
for _, sheet := range file.Sheets {
for _, row := range sheet.Rows {
for _, cell := range row.Cells {
text := cell.String()
_ = text
}
}
}
fmt.Printf("tealeg/xlsx耗时: %v\n", time.Since(start))
}
3. qax-os/excelize(旧版)
性能:★★★☆
性能对比总结
| 库名称 | 性能 | 内存占用 | 功能完整性 | 维护状态 |
|---|---|---|---|---|
| excelize/v2 | 优秀 | 较低 | 完整 | 活跃 |
| tealeg/xlsx | 良好 | 中等 | 完整 | 活跃 |
| qax-os/excelize | 一般 | 较高 | 完整 | 已废弃 |
优化建议
- 使用流式读取(excelize支持):
f, err := excelize.OpenFile("file.xlsx")
if err != nil {
return
}
rows, err := f.Rows("Sheet1")
for rows.Next() {
row, _ := rows.Columns()
// 处理数据
}
- 批量处理数据,减少内存分配
- 选择性读取需要的列和行
推荐使用 excelize/v2,它在性能和功能方面都是最佳选择。

