在linux系统上的golang中读取xls文件中的值

时间:2016-04-27 14:07:34

标签: linux go ubuntu-14.04 xls

我正在编写一个程序来读取Go中的xls文件。我正在使用github.com/extrame/xls包。 我想读取每个单元格,如果它不是空的。 (注意某些行在所有11列中都有值,但有些行不会。)

我的代码是:

if xlFile, err := Open("Table.xls", "utf-8"); err == nil {
    if sheet1 := xlFile.GetSheet(0); sheet1 != nil {
        fmt.Print("Total Lines ", sheet1.MaxRow, sheet1.Name)
        col1 := sheet1.Rows[0].Cols[0]
        col2 := sheet1.Rows[0].Cols[0]
        for i := 0; i <= (int(sheet1.MaxRow)); i++ {
            row1 := sheet1.Rows[uint16(i)]
            col1 = row1.Cols[0]
            col2 = row1.Cols[11]
            fmt.Print("\n", col1.String(xlFile), ",", col2.String(xlFile))
        }
    }
}

它出现以下错误:

panic: runtime error: invalid memory address or nil pointer dereference

因为某些行的单元格11为空。

请告知更好的方法或解决方案。

3 个答案:

答案 0 :(得分:1)

检查您提到的仓库有一个row.go文件。在此文件中定义Row结构如下:

type Row struct {
    info *RowInfo
    Cols map[uint16]contentHandler
}

这包含Cols映射,其中键为uint16值。因为您可以通过以下方式验证是否存在地图密钥:

if col2, ok := row1.Cols[11]; ok { }

这意味着您可以通过检查它们是否包含密钥来测试单元格是否为空。

if col2, ok := row1.Cols[11]; ok { 
    fmt.Print("\n", col2.String(xlFile))
}

答案 1 :(得分:0)

我假设如果你有空的尾随列,则Cols切片只有填充列的数量一样大。

在这种情况下,只需:

if len(row1.Cols) < 12 {
 // Whatever you want to do with < 12 columns 
} else {
 // Use Cols[11] (12th column) here
}

如果您只需要第一列和最后一列,您可以执行以下操作: rows1.Cols[0]rows1.Cols[len(row1.Cols)-1]可以使用任意宽行。

如果可能有空行,请先检查len(rows1.Cols) == 0以确保您不会尝试访问不存在的数据。

答案 2 :(得分:0)

在你收到Cols [11]之前,你有没有尝试检查Cols长度?

if len(row1.Cols) > 10 {
  col2 = row1.Cols[11]
}else{
  col2 = Col{}
}