golang преобразовать лист Excel в структуру

#excel #go

#excel #Вперед

Вопрос:

Я пытался использовать https://github.com/tealeg/xlsx и https://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', amp;invoices)
  

затем я могу повторять счета-фактуры

Комментарии:

1. Привет, я отредактировал свой ответ. Хорошего дня 🙂

Ответ №1:

Я не знаком с этим модулем, но, глядя на исходный код, я вижу, что есть функция «Столбцы ()», которую вы можете использовать для получения нужных вам значений.

 // 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] .

Эта ячейка будет выглядеть так:

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

Похоже, у них реализован некоторый итератор столбцов, который также может вам помочь.

Вот пример, который в основном решает вашу задачу (я опустил обработку ошибок, чтобы сделать ее короче).

     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
    }
  

Больше примеров со строками вы найдете в файлах тестов, например, здесь .

Теперь ваша очередь. Удачи!