You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Go语言如何逐行读取Excel?解决32Mi内存环境OOM问题

解决excelize v2.7.1内存不足的逐行读取方案

你的问题根源在于GetRows方法会一次性将工作表所有行加载到内存中,在小内存环境下容易触发OOM。excelize v2版本提供了行迭代器可以实现类似csv的逐行读取,避免一次性加载全部数据。

实现代码

func main() {
    f, err := excelize.OpenFile("electricinfo.xlsx")
    if err != nil {
        fmt.Println(err)
        return
    }
    defer func() {
        if err := f.Close(); err != nil {
            fmt.Println(err)
        }
    }()

    // 获取行迭代器,指定目标工作表名
    rows, err := f.Rows("mydistrict")
    if err != nil {
        fmt.Println(err)
        return
    }
    defer func() {
        // 关闭迭代器释放关联资源
        if err := rows.Close(); err != nil {
            fmt.Println(err)
        }
    }()

    // 逐行循环读取
    for rows.Next() {
        // 获取当前行的单元格数据
        rowCells, err := rows.Columns()
        if err != nil {
            fmt.Println(err)
            continue
        }
        // 执行你的业务逻辑
        for _, cell := range rowCells {
            // ... 此处编写业务逻辑代码
        }
        fmt.Println()
    }

    // 检查迭代过程中是否出现异常
    if err := rows.Err(); err != nil {
        fmt.Println(err)
    }
}

关键说明

  • Rows()方法返回的迭代器不会一次性加载所有行数据,仅在调用Next()时读取当前行
  • rows.Next()返回true表示存在下一行可读取,返回false则迭代结束
  • rows.Columns()仅加载当前行的单元格内容到内存,大幅降低内存占用
  • 必须调用rows.Close()释放迭代器资源,建议用defer提前声明
  • 最后通过rows.Err()排查迭代过程中出现的错误

内容的提问来源于stack exchange,提问作者erwin-lovecraft

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 16:13:33