我正在编写一个程序来读取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为空。
请告知更好的方法或解决方案。
答案 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{}
}