瀏覽代碼

GetCols support the row element without r attribute in the worksheet

xuri 5 年之前
父節點
當前提交
1cbb05d497
共有 3 個文件被更改,包括 46 次插入32 次删除
  1. 3 0
      cell_test.go
  2. 35 20
      col.go
  3. 8 12
      rows.go

+ 3 - 0
cell_test.go

@@ -110,6 +110,9 @@ func TestGetCellValue(t *testing.T) {
 		assert.Equal(t, cell, value)
 		assert.Equal(t, cell, value)
 		assert.NoError(t, err)
 		assert.NoError(t, err)
 	}
 	}
+	cols, err := f.GetCols("Sheet1")
+	assert.Equal(t, [][]string{{"", "", "A3", "A4", "", "", "A7", "A8"}, {"", "", "", "B4", "", "", "B7", "B8"}}, cols)
+	assert.NoError(t, err)
 }
 }
 
 
 func TestGetCellFormula(t *testing.T) {
 func TestGetCellFormula(t *testing.T) {

+ 35 - 20
col.go

@@ -48,8 +48,8 @@ type Cols struct {
 //        return
 //        return
 //    }
 //    }
 //    for _, col := range cols {
 //    for _, col := range cols {
-//        for _, colCell := range col {
-//            fmt.Println(colCell, "\t")
+//        for _, rowCell := range col {
+//            fmt.Print(rowCell, "\t")
 //        }
 //        }
 //        fmt.Println()
 //        fmt.Println()
 //    }
 //    }
@@ -99,24 +99,34 @@ func (cols *Cols) Rows() ([]string, error) {
 		switch startElement := token.(type) {
 		switch startElement := token.(type) {
 		case xml.StartElement:
 		case xml.StartElement:
 			inElement = startElement.Name.Local
 			inElement = startElement.Name.Local
+			if inElement == "row" {
+				cellCol = 0
+				cellRow++
+				for _, attr := range startElement.Attr {
+					if attr.Name.Local == "r" {
+						cellRow, _ = strconv.Atoi(attr.Value)
+					}
+				}
+			}
 			if inElement == "c" {
 			if inElement == "c" {
+				cellCol++
 				for _, attr := range startElement.Attr {
 				for _, attr := range startElement.Attr {
 					if attr.Name.Local == "r" {
 					if attr.Name.Local == "r" {
 						if cellCol, cellRow, err = CellNameToCoordinates(attr.Value); err != nil {
 						if cellCol, cellRow, err = CellNameToCoordinates(attr.Value); err != nil {
 							return rows, err
 							return rows, err
 						}
 						}
-						blank := cellRow - len(rows)
-						for i := 1; i < blank; i++ {
-							rows = append(rows, "")
-						}
-						if cellCol == cols.curCol {
-							colCell := xlsxC{}
-							_ = decoder.DecodeElement(&colCell, &startElement)
-							val, _ := colCell.getValueFrom(cols.f, d)
-							rows = append(rows, val)
-						}
 					}
 					}
 				}
 				}
+				blank := cellRow - len(rows)
+				for i := 1; i < blank; i++ {
+					rows = append(rows, "")
+				}
+				if cellCol == cols.curCol {
+					colCell := xlsxC{}
+					_ = decoder.DecodeElement(&colCell, &startElement)
+					val, _ := colCell.getValueFrom(cols.f, d)
+					rows = append(rows, val)
+				}
 			}
 			}
 		}
 		}
 	}
 	}
@@ -152,10 +162,10 @@ func (f *File) Cols(sheet string) (*Cols, error) {
 		f.saveFileList(name, replaceRelationshipsNameSpaceBytes(output))
 		f.saveFileList(name, replaceRelationshipsNameSpaceBytes(output))
 	}
 	}
 	var (
 	var (
-		inElement string
-		cols      Cols
-		cellCol   int
-		err       error
+		inElement            string
+		cols                 Cols
+		cellCol, curRow, row int
+		err                  error
 	)
 	)
 	cols.sheetXML = f.readXML(name)
 	cols.sheetXML = f.readXML(name)
 	decoder := f.xmlNewDecoder(bytes.NewReader(cols.sheetXML))
 	decoder := f.xmlNewDecoder(bytes.NewReader(cols.sheetXML))
@@ -168,25 +178,30 @@ func (f *File) Cols(sheet string) (*Cols, error) {
 		case xml.StartElement:
 		case xml.StartElement:
 			inElement = startElement.Name.Local
 			inElement = startElement.Name.Local
 			if inElement == "row" {
 			if inElement == "row" {
+				row++
 				for _, attr := range startElement.Attr {
 				for _, attr := range startElement.Attr {
 					if attr.Name.Local == "r" {
 					if attr.Name.Local == "r" {
-						if cols.totalRow, err = strconv.Atoi(attr.Value); err != nil {
+						if curRow, err = strconv.Atoi(attr.Value); err != nil {
 							return &cols, err
 							return &cols, err
 						}
 						}
+						row = curRow
 					}
 					}
 				}
 				}
+				cols.totalRow = row
+				cellCol = 0
 			}
 			}
 			if inElement == "c" {
 			if inElement == "c" {
+				cellCol++
 				for _, attr := range startElement.Attr {
 				for _, attr := range startElement.Attr {
 					if attr.Name.Local == "r" {
 					if attr.Name.Local == "r" {
 						if cellCol, _, err = CellNameToCoordinates(attr.Value); err != nil {
 						if cellCol, _, err = CellNameToCoordinates(attr.Value); err != nil {
 							return &cols, err
 							return &cols, err
 						}
 						}
-						if cellCol > cols.totalCol {
-							cols.totalCol = cellCol
-						}
 					}
 					}
 				}
 				}
+				if cellCol > cols.totalCol {
+					cols.totalCol = cellCol
+				}
 			}
 			}
 		}
 		}
 	}
 	}

+ 8 - 12
rows.go

@@ -32,7 +32,7 @@ import (
 //    }
 //    }
 //    for _, row := range rows {
 //    for _, row := range rows {
 //        for _, colCell := range row {
 //        for _, colCell := range row {
-//            fmt.Println(colCell, "\t")
+//            fmt.Print(colCell, "\t")
 //        }
 //        }
 //        fmt.Println()
 //        fmt.Println()
 //    }
 //    }
@@ -111,6 +111,7 @@ func (rows *Rows) Columns() ([]string, error) {
 				}
 				}
 			}
 			}
 			if inElement == "c" {
 			if inElement == "c" {
+				cellCol++
 				colCell := xlsxC{}
 				colCell := xlsxC{}
 				_ = rows.decoder.DecodeElement(&colCell, &startElement)
 				_ = rows.decoder.DecodeElement(&colCell, &startElement)
 				if colCell.R != "" {
 				if colCell.R != "" {
@@ -118,8 +119,6 @@ func (rows *Rows) Columns() ([]string, error) {
 					if err != nil {
 					if err != nil {
 						return columns, err
 						return columns, err
 					}
 					}
-				} else {
-					cellCol++
 				}
 				}
 				blank := cellCol - len(columns)
 				blank := cellCol - len(columns)
 				for i := 1; i < blank; i++ {
 				for i := 1; i < blank; i++ {
@@ -177,10 +176,10 @@ func (f *File) Rows(sheet string) (*Rows, error) {
 		f.saveFileList(name, replaceRelationshipsNameSpaceBytes(output))
 		f.saveFileList(name, replaceRelationshipsNameSpaceBytes(output))
 	}
 	}
 	var (
 	var (
-		err         error
-		inElement   string
-		row, curRow int
-		rows        Rows
+		err       error
+		inElement string
+		row       int
+		rows      Rows
 	)
 	)
 	decoder := f.xmlNewDecoder(bytes.NewReader(f.readXML(name)))
 	decoder := f.xmlNewDecoder(bytes.NewReader(f.readXML(name)))
 	for {
 	for {
@@ -192,18 +191,15 @@ func (f *File) Rows(sheet string) (*Rows, error) {
 		case xml.StartElement:
 		case xml.StartElement:
 			inElement = startElement.Name.Local
 			inElement = startElement.Name.Local
 			if inElement == "row" {
 			if inElement == "row" {
+				row++
 				for _, attr := range startElement.Attr {
 				for _, attr := range startElement.Attr {
 					if attr.Name.Local == "r" {
 					if attr.Name.Local == "r" {
-						curRow, err = strconv.Atoi(attr.Value)
+						row, err = strconv.Atoi(attr.Value)
 						if err != nil {
 						if err != nil {
 							return &rows, err
 							return &rows, err
 						}
 						}
-						row = curRow
 					}
 					}
 				}
 				}
-				if len(startElement.Attr) == 0 {
-					row++
-				}
 				rows.totalRow = row
 				rows.totalRow = row
 			}
 			}
 		default:
 		default: