rows.go 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  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,
  43. // this function is inteded to be used with for range on rows
  44. // an argument with the xlsx opened file.
  45. func (xlsx *xlsxC) getValueFrom(f *File) (string, error) {
  46. switch xlsx.T {
  47. case "s":
  48. xlsxSI := 0
  49. xlsxSI, _ = strconv.Atoi(xlsx.V)
  50. d, err := readXMLSST(f)
  51. if err != nil {
  52. return "", err
  53. }
  54. return d.SI[xlsxSI].T, nil
  55. case "str":
  56. return xlsx.V, nil
  57. default:
  58. return xlsx.V, nil
  59. }
  60. }