Skip to content

Commit

Permalink
Merge pull request #2 from PreciousNyasulu/read_with_sheetname
Browse files Browse the repository at this point in the history
Read with sheetname
  • Loading branch information
PreciousNyasulu committed Apr 12, 2024
2 parents 29cfc71 + 3dee7b3 commit c2a5fef
Show file tree
Hide file tree
Showing 3 changed files with 74 additions and 18 deletions.
20 changes: 18 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,20 @@ import (
)

func main() {
data, err := structurama.ReadFile("./example.xlsx", Person{}, true)
data, err := structurama.ReadFileDefault("./example.xlsx", Person{}, true)
if err != nil {
fmt.Println(err)
return
}
fmt.Println(data)
}
```

Here is how you can read file by Sheetname:

```go
func main() {
data, err := structurama.ReadFileBySheetName("./example.xlsx", Person{}, true,"Sheet1")
if err != nil {
fmt.Println(err)
return
Expand All @@ -53,7 +66,7 @@ func main() {

```go
func main() {
data, err := structurama.ReadFile("./example.xlsx", Person{}, true)
data, err := structurama.ReadFileDefault("./example.xlsx", Person{}, true)
if err != nil {
fmt.Println(err)
return
Expand All @@ -73,6 +86,9 @@ func main() {

Contributions are welcome! Feel free to open issues or submit pull requests.

## Inspiration
[tealeg/xlsx](https://github.com/tealeg/xlsx) - Go library for reading and writing XLSX files.

## License

This package is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.
18 changes: 9 additions & 9 deletions example/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,15 @@ import (
"github.com/PreciousNyasulu/structurama/reader"
)

type Person struct {
Id string `xlsx:"0"`
FirstName string `xlsx:"1"`
LastName string `xlsx:"2"`
Age string `xlsx:"3"`
}

func main() {
data, err := structurama.ReadFile("./example.xlsx", Person{}, true)
data, err := structurama.ReadFileDefault("./example.xlsx", Person{}, true)
if err != nil {
fmt.Println(err)
return
Expand All @@ -19,11 +26,4 @@ func main() {
fmt.Println(item.Id, item.FirstName, item.LastName, item.Age)
}
}
}

type Person struct {
Id string `xlsx:"0"`
FirstName string `xlsx:"1"`
LastName string `xlsx:"2"`
Age string `xlsx:"3"`
}
}
54 changes: 47 additions & 7 deletions reader/reader.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,15 +9,18 @@ import (
"time"
)

func ReadFile(filePath string, sheetStruct interface{}, skipHeader bool, sheetNumber ...int) (interface{}, error) {
var sheet *xlsx.Sheet
var sheetStruct interface{}
var _skipHeader bool

func ReadFileDefault(filePath string, customStruct interface{}, skipHeader bool, sheetNumber ...int) (interface{}, error) {
sheetStruct = customStruct
_skipHeader = skipHeader
xlFile, err := xlsx.OpenFile(filePath)
if err != nil {
return nil, err
}

var sheet *xlsx.Sheet

if len(sheetNumber) > 0 {
sheet, err = getSheetByNumber(xlFile, sheetNumber[0])
if err != nil {
Expand All @@ -27,6 +30,36 @@ func ReadFile(filePath string, sheetStruct interface{}, skipHeader bool, sheetNu
sheet = xlFile.Sheets[0]
}

data, err := read(sheet)
if err != nil {
return nil, err
}

return data, nil
}

func ReadFileBySheetName(filePath string, customStruct interface{}, skipHeader bool, sheetName string) (interface{}, error) {
sheetStruct = customStruct
_skipHeader = skipHeader
xlFile, err := xlsx.OpenFile(filePath)
if err != nil {
return nil, err
}

sheet, err = getSheetByName(xlFile, sheetName)
if err != nil {
return nil, err
}

data, err := read(sheet)
if err != nil {
return nil, err
}

return data, nil
}

func read(sheet *xlsx.Sheet) (interface{}, error) {
// Get the type of struct
templateType := reflect.TypeOf(sheetStruct)

Expand All @@ -37,7 +70,7 @@ func ReadFile(filePath string, sheetStruct interface{}, skipHeader bool, sheetNu
// Iterate through rows
for r_i, row := range sheet.Rows {
// Skip header if
if skipHeader && r_i == 0 {
if _skipHeader && r_i == 0 {
continue
}

Expand All @@ -48,7 +81,7 @@ func ReadFile(filePath string, sheetStruct interface{}, skipHeader bool, sheetNu
// Get the field corresponding to the current column index
field := newStruct.FieldByIndex([]int{i})
if field.IsValid() {
err = handleFieldKind(field, cell)
err := handleFieldKind(field, cell)
if err != nil {
return nil, err
}
Expand All @@ -69,7 +102,14 @@ func getSheetByNumber(xlFile *xlsx.File, sheetNumber int) (*xlsx.Sheet, error) {
if isValidSheetNumber(sheetNumber, len(xlFile.Sheets)) {
return xlFile.Sheets[sheetNumber], nil
}
return nil, fmt.Errorf("Invalid sheet number: %v", sheetNumber)
return nil, fmt.Errorf("invalid sheet number: %v", sheetNumber)
}

func getSheetByName(xlFile *xlsx.File, sheetName string) (*xlsx.Sheet, error) {
if xlFile.Sheet[sheetName] != nil {
return xlFile.Sheet[sheetName], nil
}
return nil, fmt.Errorf("invalid sheet name: %s", sheetName)
}

// handleFieldKind: Convert cell value based on the field type
Expand Down Expand Up @@ -103,7 +143,7 @@ func handleFieldKind(field reflect.Value, cell *xlsx.Cell) error {
}
}
} else {
fmt.Errorf("Unsupported type for pointer: %v", field.Type().Elem().Kind())
return fmt.Errorf("unsupported type for pointer: %v", field.Type().Elem().Kind())
}

case reflect.Struct:
Expand Down

0 comments on commit c2a5fef

Please sign in to comment.