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() } eBalance.Version = conf.Version eBalance.Type = conf.Type 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 { axis := fmt.Sprintf("%s%d", c.Col, r) cellValue, err := xFile.GetCellValue( xFile.GetSheetName(a.Sheet), axis, ) if err != nil { errs = append(errs, err) } err = set.Field(&sf, c.Field, cellValue) if err != nil { errs = append(errs, fmt.Errorf("XLSXL.SupplyFraction: Sheet %d, Cell %s: %w", a.Sheet, axis, err)) } } 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 }