146 lines
3.6 KiB
Go
146 lines
3.6 KiB
Go
package loader
|
|
|
|
import (
|
|
"fmt"
|
|
"io"
|
|
|
|
"git.ecogood.org/andreas.schroepfer/excelConverter/pkg/ecalc"
|
|
"git.ecogood.org/andreas.schroepfer/excelConverter/pkg/set"
|
|
"github.com/360EntSecGroup-Skylar/excelize/v2"
|
|
)
|
|
|
|
// XLSX reads the data out of the reader. If conf is nil
|
|
// the default configuration is used.
|
|
func XLSX(r io.Reader, conf *Conf) (*ecalc.Ecalc, error) {
|
|
eBalance := &ecalc.Ecalc{}
|
|
var errs []error
|
|
|
|
if conf == nil {
|
|
conf = DefaultConf()
|
|
}
|
|
xFile, err := excelize.OpenReader(r)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("XLSX.OpenReader: %w", err)
|
|
}
|
|
for _, v := range conf.Values {
|
|
cellValue, err := xFile.GetCellValue(
|
|
xFile.GetSheetName(v.Sheet),
|
|
v.Cell,
|
|
)
|
|
if err != nil {
|
|
errs = append(errs, err)
|
|
}
|
|
switch v.Struct {
|
|
case "CompanyFacts":
|
|
set.Field(&eBalance.CompanyFacts, v.Field, cellValue)
|
|
}
|
|
}
|
|
for _, a := range conf.Areas {
|
|
switch a.Struct {
|
|
case "SupplyFraction":
|
|
for r := a.StartRow; r <= a.EndRow; r++ {
|
|
sf := ecalc.SupplyFraction{}
|
|
for _, c := range a.Cols {
|
|
cellValue, err := xFile.GetCellValue(
|
|
xFile.GetSheetName(a.Sheet),
|
|
fmt.Sprintf("%s%d", c.Col, r),
|
|
)
|
|
if err != nil {
|
|
errs = append(errs, err)
|
|
}
|
|
set.Field(&sf, c.Field, cellValue)
|
|
}
|
|
eBalance.CompanyFacts.SupplyFractions =
|
|
append(
|
|
eBalance.CompanyFacts.SupplyFractions,
|
|
sf)
|
|
}
|
|
case "EmployeesFraction":
|
|
for r := a.StartRow; r <= a.EndRow; r++ {
|
|
ef := ecalc.EmployeesFraction{}
|
|
for _, c := range a.Cols {
|
|
cellValue, err := xFile.GetCellValue(
|
|
xFile.GetSheetName(a.Sheet),
|
|
fmt.Sprintf("%s%d", c.Col, r),
|
|
)
|
|
if err != nil {
|
|
errs = append(errs, err)
|
|
}
|
|
set.Field(&ef, c.Field, cellValue)
|
|
}
|
|
eBalance.CompanyFacts.EmployeesFractions =
|
|
append(
|
|
eBalance.CompanyFacts.EmployeesFractions,
|
|
ef)
|
|
}
|
|
case "IndustrySector":
|
|
for r := a.StartRow; r <= a.EndRow; r++ {
|
|
is := ecalc.IndustrySector{}
|
|
for _, c := range a.Cols {
|
|
cellValue, err := xFile.GetCellValue(
|
|
xFile.GetSheetName(a.Sheet),
|
|
fmt.Sprintf("%s%d", c.Col, r),
|
|
)
|
|
if err != nil {
|
|
errs = append(errs, err)
|
|
}
|
|
set.Field(&is, c.Field, cellValue)
|
|
}
|
|
eBalance.CompanyFacts.IndustrySectors =
|
|
append(
|
|
eBalance.CompanyFacts.IndustrySectors,
|
|
is)
|
|
}
|
|
}
|
|
|
|
}
|
|
var topic ecalc.Topic
|
|
for r := conf.Rating.StartRow; r <= conf.Rating.EndRow; r++ {
|
|
shortName, err := xFile.GetCellValue(
|
|
xFile.GetSheetName(conf.Rating.Sheet),
|
|
fmt.Sprintf("%s%d", conf.Rating.ShortNameCol, r),
|
|
)
|
|
if err != nil {
|
|
errs = append(errs, err)
|
|
}
|
|
if len(shortName) < 2 {
|
|
continue
|
|
} else if len(shortName) == 2 {
|
|
if topic.ShortName != "" {
|
|
eBalance.CompanyFacts.Rating.Topics = append(eBalance.CompanyFacts.Rating.Topics, topic)
|
|
}
|
|
topic = ecalc.Topic{
|
|
ShortName: shortName,
|
|
}
|
|
for _, c := range conf.Rating.Cols {
|
|
cellValue, err := xFile.GetCellValue(
|
|
xFile.GetSheetName(conf.Rating.Sheet),
|
|
fmt.Sprintf("%s%d", c.Col, r),
|
|
)
|
|
if err != nil {
|
|
errs = append(errs, err)
|
|
}
|
|
set.Field(&topic, c.Field, cellValue)
|
|
}
|
|
} else {
|
|
aspect := ecalc.Aspect{
|
|
ShortName: shortName,
|
|
}
|
|
for _, c := range conf.Rating.Cols {
|
|
cellValue, err := xFile.GetCellValue(
|
|
xFile.GetSheetName(conf.Rating.Sheet),
|
|
fmt.Sprintf("%s%d", c.Col, r),
|
|
)
|
|
if err != nil {
|
|
errs = append(errs, err)
|
|
}
|
|
set.Field(&aspect, c.Field, cellValue)
|
|
}
|
|
topic.Aspects = append(topic.Aspects, aspect)
|
|
}
|
|
}
|
|
eBalance.CompanyFacts.Rating.Topics = append(eBalance.CompanyFacts.Rating.Topics, topic)
|
|
// TODO: error handling of errs
|
|
return eBalance, nil
|
|
}
|