#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
}
Больше примеров со строками вы найдете в файлах тестов, например, здесь .
Теперь ваша очередь. Удачи!