diff --git a/cell_test.go b/cell_test.go
index f7072560..c934876e 100644
--- a/cell_test.go
+++ b/cell_test.go
@@ -136,8 +136,9 @@ func TestSetCellBool(t *testing.T) {
func TestGetCellValue(t *testing.T) {
// Test get cell value without r attribute of the row.
f := NewFile()
+ sheetData := `%s`
delete(f.Sheet, "xl/worksheets/sheet1.xml")
- f.XLSX["xl/worksheets/sheet1.xml"] = []byte(`A3
A4B4
A7B7
A8B8
`)
+ f.XLSX["xl/worksheets/sheet1.xml"] = []byte(fmt.Sprintf(sheetData, `A3
A4B4
A7B7
A8B8
`))
f.checked = nil
cells := []string{"A3", "A4", "B4", "A7", "B7"}
rows, err := f.GetRows("Sheet1")
@@ -151,6 +152,24 @@ func TestGetCellValue(t *testing.T) {
cols, err := f.GetCols("Sheet1")
assert.Equal(t, [][]string{{"", "", "A3", "A4", "", "", "A7", "A8"}, {"", "", "", "B4", "", "", "B7", "B8"}}, cols)
assert.NoError(t, err)
+ delete(f.Sheet, "xl/worksheets/sheet1.xml")
+ f.XLSX["xl/worksheets/sheet1.xml"] = []byte(fmt.Sprintf(sheetData, `A2
B2
`))
+ f.checked = nil
+ cell, err := f.GetCellValue("Sheet1", "A2")
+ assert.Equal(t, "A2", cell)
+ assert.NoError(t, err)
+ delete(f.Sheet, "xl/worksheets/sheet1.xml")
+ f.XLSX["xl/worksheets/sheet1.xml"] = []byte(fmt.Sprintf(sheetData, `A2
B2
`))
+ f.checked = nil
+ rows, err = f.GetRows("Sheet1")
+ assert.Equal(t, [][]string{nil, {"A2", "B2"}}, rows)
+ assert.NoError(t, err)
+ delete(f.Sheet, "xl/worksheets/sheet1.xml")
+ f.XLSX["xl/worksheets/sheet1.xml"] = []byte(fmt.Sprintf(sheetData, `A1
B1
`))
+ f.checked = nil
+ rows, err = f.GetRows("Sheet1")
+ assert.Equal(t, [][]string{{"A1", "B1"}}, rows)
+ assert.NoError(t, err)
}
func TestGetCellFormula(t *testing.T) {
diff --git a/col.go b/col.go
index f3e502cf..5d912291 100644
--- a/col.go
+++ b/col.go
@@ -103,10 +103,9 @@ func (cols *Cols) Rows() ([]string, error) {
if inElement == "row" {
cellCol = 0
cellRow++
- for _, attr := range startElement.Attr {
- if attr.Name.Local == "r" {
- cellRow, _ = strconv.Atoi(attr.Value)
- }
+ attrR, _ := attrValToInt("r", startElement.Attr)
+ if attrR != 0 {
+ cellRow = attrR
}
}
if inElement == "c" {
diff --git a/excelize.go b/excelize.go
index 5069756c..bcae4810 100644
--- a/excelize.go
+++ b/excelize.go
@@ -219,11 +219,17 @@ func checkSheet(ws *xlsxWorksheet) {
row = r.R
continue
}
- row++
+ if r.R != row {
+ row++
+ }
}
sheetData := xlsxSheetData{Row: make([]xlsxRow, row)}
row = 0
for _, r := range ws.SheetData.Row {
+ if r.R == row {
+ sheetData.Row[r.R-1].C = append(sheetData.Row[r.R-1].C, r.C...)
+ continue
+ }
if r.R != 0 {
sheetData.Row[r.R-1] = r
row = r.R
diff --git a/rows.go b/rows.go
index 04a06b94..4f93ed11 100644
--- a/rows.go
+++ b/rows.go
@@ -79,10 +79,10 @@ func (rows *Rows) Error() error {
// Columns return the current row's column values.
func (rows *Rows) Columns() ([]string, error) {
var (
- err error
- inElement string
- row, cellCol int
- columns []string
+ err error
+ inElement string
+ attrR, cellCol, row int
+ columns []string
)
if rows.stashRow >= rows.curRow {
@@ -99,17 +99,13 @@ func (rows *Rows) Columns() ([]string, error) {
case xml.StartElement:
inElement = startElement.Name.Local
if inElement == "row" {
- for _, attr := range startElement.Attr {
- if attr.Name.Local == "r" {
- row, err = strconv.Atoi(attr.Value)
- if err != nil {
- return columns, err
- }
- if row > rows.curRow {
- rows.stashRow = row - 1
- return columns, err
- }
- }
+ row++
+ if attrR, err = attrValToInt("r", startElement.Attr); attrR != 0 {
+ row = attrR
+ }
+ if row > rows.curRow {
+ rows.stashRow = row - 1
+ return columns, err
}
}
if inElement == "c" {
@@ -117,8 +113,7 @@ func (rows *Rows) Columns() ([]string, error) {
colCell := xlsxC{}
_ = rows.decoder.DecodeElement(&colCell, &startElement)
if colCell.R != "" {
- cellCol, _, err = CellNameToCoordinates(colCell.R)
- if err != nil {
+ if cellCol, _, err = CellNameToCoordinates(colCell.R); err != nil {
return columns, err
}
}
@@ -128,7 +123,10 @@ func (rows *Rows) Columns() ([]string, error) {
}
case xml.EndElement:
inElement = startElement.Name.Local
- if inElement == "row" {
+ if row == 0 {
+ row = rows.curRow
+ }
+ if inElement == "row" && row+1 < rows.curRow {
return columns, err
}
}