使用go

时间:2018-10-24 13:34:03

标签: excel go

在下面的代码中,我正在使用exclize库从Excel工作表中读取数据。

我的问题是,当我只想从几列中获取数据时,.GetRows方法会读取整个工作表。

浏览goDoc时,我找不到基于列索引或名称为您提供数据的方法。

尽管如此,是否有办法仅从选定的几列中读取数据?或以某种方式限制.GetRows方法的范围

代码如下:

package main 

import (
    "fmt"

    "github.com/360EntSecGroup-Skylar/excelize"
)

type AllData struct {
    Name, Team, SSN string
}

var mapping []AllData

func main() {

    fileName := "Blad1"

    xlsx, err := excelize.OpenFile(fileName + ".xlsx")
    if err != nil {
        fmt.Println(err)
        return
    }

    rows := xlsx.GetRows(fileName)
    for _, row := range rows[1:] {
        mapping = append(mapping, AllData{ Name: row[0] })
    }

    m := map[string]interface{}{
        "Data": mapping,
    }

    fmt.Println(m["Data"])
}

1 个答案:

答案 0 :(得分:2)

似乎至少还有其他几种方式

通过使用行迭代器

rows, err := xlsx.Rows("Sheet1")
if err != nil {
    log.Fatal(err)
}
for rows.Next() {
    row := rows.Columns()
    fmt.Printf("%s\t%s\n", row[1], row[3]) // Print values in columns B and D
}

或者如果您知道确切范围

n := 10001
for i := 1; i < n; i++ {
    b := xlsx.GetCellValue("Sheet1", fmt.Sprintf("B%d", i))
    d := xlsx.GetCellValue("Sheet1", fmt.Sprintf("D%d", i))

    fmt.Printf("%s\t%s\n", b, d) // Print values in columns B and D
}

我没有遍历库的源代码,因此它可能会或可能不会影响性能和(或)内存使用。