2016-04-27 24 views
0

私はGoでxlsファイルを読むプログラムを書いています。私はgithub.com/extrame/xlsパッケージを使用しています。 空でない場合は、各セルを読みたいと思います。 (一部の行は、すべての11列の値を持つことになりますが、一部にはないことに注意してください。)Linuxシステムでgolangのxlsファイルから値を読み取る

私のコードは次のとおりです。セル11であるため

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

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)) 
     } 
    } 
} 

それは次のエラーを与えますいくつかの行が空です。

より良い方法や解決方法をご提案ください。

答えて

1

上記のレポを確認するには、row.goファイルがあります。このファイルの中に以下のよう構造体を定義している:

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

これは、キーがuint16値ですColsマップが含まれています。マップキーは、次のように存在している場合、外出先であなたが確認できますので:

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

これはあなたの細胞が、彼らはキーが含まれているかどうかをチェックすることにより、空でないかどうかをテストできることを意味します。

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

助けて ありがとうsimo endre – Hardy

+0

それは助けてよかった。 –

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をチェックして、存在しないデータにアクセスしないようにしてください。

+0

空のセルが中央にある場合でもこれは機能しますか?セル2のセル4も空にすることができます。 その特定のセルが空であるかどうかを知りたい場合 – Hardy

+0

可変幅の行の応答が更新されました –

0

Cols [11]を取得する前にColsの長さを確認しようとしましたか?

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

空のセルが中央にある場合でもこの作業はできますか? – Hardy

+0

はい、そうです。 'Cols'だけが12個以上の要素を持つなら、' Cols [11] 'にアクセスできます。 – rootatdarkstar

関連する問題