59 lines
1.0 KiB
Go
59 lines
1.0 KiB
Go
package excel
|
|
|
|
import (
|
|
"errors"
|
|
"log/slog"
|
|
|
|
"github.com/xuri/excelize/v2"
|
|
)
|
|
|
|
type Importer struct {
|
|
SheetName string
|
|
Loader func(rowIndex int, row []string) error
|
|
StartFromRowIdx int
|
|
}
|
|
|
|
func ImportEntitiesFromSpreadsheet(path string, importers ...Importer) error {
|
|
for _, importer := range importers {
|
|
err := ImportFromSpreadsheet(path, importer)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func ImportFromSpreadsheet(filepath string, importer Importer) error {
|
|
f, err := excelize.OpenFile(filepath)
|
|
defer func() {
|
|
err := f.Close()
|
|
if err != nil {
|
|
slog.Error(p.Sprintf("Failed to close file: %s", err))
|
|
}
|
|
}()
|
|
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
sheetIndex, err := f.GetSheetIndex("MySheet")
|
|
if err != nil || sheetIndex == -1 {
|
|
return errors.New(p.Sprintf("Sheet `%s` not found", importer.SheetName))
|
|
}
|
|
|
|
rows, err := f.GetRows(importer.SheetName)
|
|
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
for i, row := range rows {
|
|
err := importer.Loader(i, row)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
}
|
|
|
|
return nil
|
|
}
|