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

Golang中如何将Excel读取的二维切片行转换为DataFrame?

解决Excel转DataFrame时的索引越界问题

问题详情

从Excel读取数据并转换为gota的DataFrame时,读取到的行是二维切片类型,运行代码后触发索引越界错误:

panic: runtime error: index out of range [1] with length 1
goroutine 1 [running]:

问题根源:数据共4列,但第25行仅第一列有值,当转换包含该行及后续的30行数据时触发错误;仅转换到第25行时可正常运行。

用户提供的代码:

import (
    "fmt"

    "github.com/go-gota/gota/dataframe"
    
    "github.com/xuri/excelize/v2"
)

func main() {
    f, err := excelize.OpenFile(sheetPath)
    if err != nil {
           fmt.Print(err)
        }

    rows, err := f.GetRows(sheetName)
    if err != nil {
        fmt.Print(err)
         }
    df := dataframe.LoadRecords(rows, dataframe.HasHeader(true))
}

解决方法

必须先处理行长度不一致的问题——gota的LoadRecords要求所有数据行的长度和表头列数完全匹配,否则会因尝试访问不存在的索引而panic。

具体处理步骤:

  1. 确定表头的列数(此处为4列)
  2. 遍历所有数据行,对长度不足的行补充空字符串,使其长度与表头一致;若行长度超过列数,可按需截断到对应长度
  3. 使用处理后的二维切片生成DataFrame

修改后的代码示例:

import (
    "fmt"

    "github.com/go-gota/gota/dataframe"
    "github.com/xuri/excelize/v2"
)

func main() {
    sheetPath := "your_excel_file.xlsx"
    sheetName := "Sheet1"

    f, err := excelize.OpenFile(sheetPath)
    if err != nil {
        fmt.Println(err)
        return
    }
    defer f.Close() // 释放文件资源

    rows, err := f.GetRows(sheetName)
    if err != nil {
        fmt.Println(err)
        return
    }

    if len(rows) == 0 {
        fmt.Println("工作表中无数据")
        return
    }

    // 获取表头列数(默认第一行为表头)
    colCount := len(rows[0])
    processedRows := make([][]string, len(rows))

    // 统一每行的长度
    for i, row := range rows {
        processedRow := make([]string, colCount)
        // 复制原有数据
        copy(processedRow, row)
        // 对长度不足的列填充空字符串
        for j := len(row); j < colCount; j++ {
            processedRow[j] = ""
        }
        processedRows[i] = processedRow
    }

    // 转换为DataFrame
    df := dataframe.LoadRecords(processedRows, dataframe.HasHeader(true))
    fmt.Println(df)
}

补充说明

  • 代码通过copy保留原有数据,对缺失列补充空字符串,确保每行长度与表头一致
  • 若存在行长度超过表头列数的情况,可添加row = row[:colCount]进行截断
  • 增加defer f.Close()避免文件资源泄漏

内容的提问来源于stack exchange,提问作者twinkle

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 22:05:26