Golang中使用excelize库遍历Excel工作表列单元格的方法
Golang 基于excelize库遍历Excel列单元格实现方案
你原有代码的问题在于GetCellValue方法仅支持获取单个指定坐标的单元格值,无法返回整列批量数据,因此无法实现遍历需求。
本次使用的Excel文件示例如下:
以下是两种可直接落地的实现方案:
方案1:按列名遍历指定列(单列表场景首选)
适用于明确需要遍历某一固定列的场景,逻辑为获取工作表有效总行数后,循环拼接单元格坐标逐个取值。
package main import ( "fmt" "github.com/xuri/excelize/v2" ) func main() { f, err := excelize.OpenFile("pricematching.xlsx") if err != nil { fmt.Println("打开文件失败:", err) return } // 释放文件句柄 defer func() { _ = f.Close() }() sheetName := "sheet1" targetCol := "A" // 自定义要遍历的列,示例为A列 startRow := 2 // 自定义起始行,示例从第2行开始跳过表头 // 获取工作表所有行数据,用于计算有效总行数 rows, err := f.GetRows(sheetName) if err != nil { fmt.Println("读取工作表失败:", err) return } totalRow := len(rows) // 逐行遍历目标列 for rowNum := startRow; rowNum <= totalRow; rowNum++ { cellAxis := fmt.Sprintf("%s%d", targetCol, rowNum) cellVal, err := f.GetCellValue(sheetName, cellAxis) if err != nil { fmt.Printf("读取单元格%s失败: %v\n", cellAxis, err) continue } // 此处编写单元格业务处理逻辑 fmt.Printf("单元格%s值为:%s\n", cellAxis, cellVal) } }
方案2:全量行数据按列索引提取(多列处理场景首选)
适用于需要同时处理多列数据的场景,GetRows方法返回[][]string结构,外层切片对应行、内层切片对应每行的列值,列索引从0开始计数(A列对应索引0、B列对应索引1,以此类推)。
package main import ( "fmt" "github.com/xuri/excelize/v2" ) func main() { f, err := excelize.OpenFile("pricematching.xlsx") if err != nil { fmt.Println("打开文件失败:", err) return } defer func() { _ = f.Close() }() sheetName := "sheet1" targetColIdx := 0 // 自定义要遍历的列索引,示例为A列对应索引0 startRowIdx := 1 // 自定义起始行索引,从第2行开始对应切片索引1 allRows, err := f.GetRows(sheetName) if err != nil { fmt.Println("读取工作表失败:", err) return } // 逐行提取目标列值 for rowIdx := startRowIdx; rowIdx < len(allRows); rowIdx++ { // 校验当前行列数,避免索引越界 if len(allRows[rowIdx]) > targetColIdx { cellVal := allRows[rowIdx][targetColIdx] // 此处编写单元格业务处理逻辑 fmt.Printf("第%d行目标列值为:%s\n", rowIdx+1, cellVal) } else { // 处理当前行目标列为空的场景 fmt.Printf("第%d行目标列为空\n", rowIdx+1) } } }
注意事项:
- excelize对工作表名大小写敏感,填写sheet名时需要和文件内实际名称完全匹配
- 遍历过程中必须做索引长度校验,避免空行/短行导致的panic
- 打开文件后必须显式关闭释放句柄,避免文件被持续占用
内容的提问来源于stack exchange,提问作者نعمان منذر محمود الجميلي
相关产品推荐
相关产品推荐

