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) } } } // TODO: error handling of errs return eBalance, nil }