Golang读取Excel文件的性能对比

在Golang中读取Excel文件时,有哪些高性能的库推荐?目前主流的库如excelize、tealeg/xlsx等在处理大文件时的性能表现如何?是否有实测数据对比?另外,对于百万级数据的Excel文件,有哪些优化读取速度的技巧或最佳实践?

2 回复

在Golang中读取Excel文件,主要有以下几种方案:

  1. tealeg/xlsx - 纯Go实现,支持读写,但处理大文件时内存占用较高,性能一般。

  2. qax-os/excelize - 功能丰富,支持图表等高级特性,性能较好,适合处理复杂Excel文件。

  3. unidoc/unioffice - 专业文档处理库,对Excel支持强,但较重量级。

  4. 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 一般 较高 完整 已废弃

优化建议

  1. 使用流式读取(excelize支持):
f, err := excelize.OpenFile("file.xlsx")
if err != nil {
    return
}
rows, err := f.Rows("Sheet1")
for rows.Next() {
    row, _ := rows.Columns()
    // 处理数据
}
  1. 批量处理数据,减少内存分配
  2. 选择性读取需要的列和行

推荐使用 excelize/v2,它在性能和功能方面都是最佳选择。

回到顶部