【问题标题】:golang convert excel sheet to a structgolang将excel表格转换为结构
【发布时间】:2020-09-26 14:07:29
【问题描述】:

我尝试使用https://github.com/tealeg/xlsxhttps://github.com/360EntSecGroup-Skylar/excelize 我成功读取了excel文件

package main

import (
    "fmt"

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

func main() {
    f, err := excelize.OpenFile("Book1.xlsx")
    if err != nil {
        fmt.Println(err)
        return
    }
    // Get value from cell by given worksheet name and axis.
    cell, err := f.GetCellValue("Sheet1", "B2")
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Println(cell)
    // Get all the rows in the Sheet1.
    rows, err := f.GetRows("Sheet1")
    for _, row := range rows {
        for _, colCell := range row {
            fmt.Print(colCell, "\t")
        }
        fmt.Println()
    }
}

把我想将数据从excel转换为定义结构的数组

例子

type InvoiceSheet struct {
    amount string
    item   string
   
}

var invoices []InvoiceSheet

err := excel.READMETHOD('path of file', &invoices)

然后我可以迭代发票

【问题讨论】:

  • 您好,我编辑了我的答案。祝你有美好的一天:)

标签: excel go


【解决方案1】:

我没有使用该模块进行内部化,但查看源代码我发现有一个“Columns()”函数可用于获取所需的值。

// Columns return the current row's column values.
func (rows *Rows) Columns() ([]string, error)

https://github.com/360EntSecGroup-Skylar/excelize/blob/master/rows.go

【讨论】:

    【解决方案2】:

    我认为不支持任何直接序列化(不熟悉包)所以为什么不遍历电子表格并逐个初始化结构并将其附加到切片。

    如果您的架构事先已知,您可以使用您的类别定义地图并将它们用作参考点,例如

    columns:= map[string]string{"Id" : "A1", "Item" : "B1", "Amount" : "C1"}
    

    在你内部开始一个循环,将解析下一行以提取你的结构值。

    func (m *MergeCell) GetCellValue() string
    

    直到有东西要读,也许直到有Id 一个非空字符串。 我刚刚想出了一种更好地实现它的可能方法。

    相反,map[string]string 使用一些 map[string]Cell。

    那个 Cell 看起来像这样:

    type struct Cell {
        column : string
        row : int
    }
    func (c Cell) str() {
        return fmt.Sprintf("%s%d", c.column, c.row)
    }
    

    他们似乎已经实施了一些列 iterator 来帮助您。

    这是一个基本解决您的任务的示例(我省略了错误处理以使其更短)。

        const sheet2 = "SheetName"
    
        f, _ := OpenFile(filepath.Join("test", "Book1.xlsx"))
    
        rows, _ := f.Rows(sheet2)
    
        var collectedRows [][]string
        for rows.Next() {
            columns, _:= rows.Columns()
            // here init your struct and append it to slice as described above
        }
    

    您可以在测试文件中找到更多包含行的示例,例如here.

    现在轮到你了。祝你好运!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-12
      • 1970-01-01
      相关资源
      最近更新 更多