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
相关产品推荐
相关产品推荐

