rows.go 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. package excelize
  2. import (
  3. "encoding/xml"
  4. "strconv"
  5. "strings"
  6. )
  7. // GetRows return all the rows in a sheet, for example:
  8. //
  9. // rows := xlsx.GetRows("Sheet2")
  10. // for _, row := range rows {
  11. // for _, colCell := range row {
  12. // fmt.Print(colCell, "\t")
  13. // }
  14. // fmt.Println()
  15. // }
  16. //
  17. func (f *File) GetRows(sheet string) [][]string {
  18. xlsx := xlsxWorksheet{}
  19. r := [][]string{}
  20. name := "xl/worksheets/" + strings.ToLower(sheet) + ".xml"
  21. err := xml.Unmarshal([]byte(f.readXML(name)), &xlsx)
  22. if err != nil {
  23. return r
  24. }
  25. rows := xlsx.SheetData.Row
  26. for _, row := range rows {
  27. c := []string{}
  28. for _, colCell := range row.C {
  29. val, _ := colCell.getValueFrom(f)
  30. c = append(c, val)
  31. }
  32. r = append(r, c)
  33. }
  34. return r
  35. }
  36. // readXMLSST read xmlSST simple function.
  37. func readXMLSST(f *File) (xlsxSST, error) {
  38. shardStrings := xlsxSST{}
  39. err := xml.Unmarshal([]byte(f.readXML("xl/sharedStrings.xml")), &shardStrings)
  40. return shardStrings, err
  41. }
  42. // getValueFrom return a value from a column/row cell, this function is inteded
  43. // to be used with for range on rows an argument with the xlsx opened file.
  44. func (xlsx *xlsxC) getValueFrom(f *File) (string, error) {
  45. switch xlsx.T {
  46. case "s":
  47. xlsxSI := 0
  48. xlsxSI, _ = strconv.Atoi(xlsx.V)
  49. d, err := readXMLSST(f)
  50. if err != nil {
  51. return "", err
  52. }
  53. return d.SI[xlsxSI].T, nil
  54. case "str":
  55. return xlsx.V, nil
  56. default:
  57. return xlsx.V, nil
  58. }
  59. }