Skip to content

Commit 92c8626

Browse files
committed
Fixed qax-os#732, support single line with repeated row element in the sheet data
1 parent 2be4bfd commit 92c8626

File tree

4 files changed

+46
-24
lines changed

4 files changed

+46
-24
lines changed

Diff for: cell_test.go

+20-1
Original file line numberDiff line numberDiff line change
@@ -136,8 +136,9 @@ func TestSetCellBool(t *testing.T) {
136136
func TestGetCellValue(t *testing.T) {
137137
// Test get cell value without r attribute of the row.
138138
f := NewFile()
139+
sheetData := `<worksheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main"><sheetData>%s</sheetData></worksheet>`
139140
delete(f.Sheet, "xl/worksheets/sheet1.xml")
140-
f.XLSX["xl/worksheets/sheet1.xml"] = []byte(`<worksheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main"><sheetData><row r="3"><c t="str"><v>A3</v></c></row><row><c t="str"><v>A4</v></c><c t="str"><v>B4</v></c></row><row r="7"><c t="str"><v>A7</v></c><c t="str"><v>B7</v></c></row><row><c t="str"><v>A8</v></c><c t="str"><v>B8</v></c></row></sheetData></worksheet>`)
141+
f.XLSX["xl/worksheets/sheet1.xml"] = []byte(fmt.Sprintf(sheetData, `<row r="3"><c t="str"><v>A3</v></c></row><row><c t="str"><v>A4</v></c><c t="str"><v>B4</v></c></row><row r="7"><c t="str"><v>A7</v></c><c t="str"><v>B7</v></c></row><row><c t="str"><v>A8</v></c><c t="str"><v>B8</v></c></row>`))
141142
f.checked = nil
142143
cells := []string{"A3", "A4", "B4", "A7", "B7"}
143144
rows, err := f.GetRows("Sheet1")
@@ -151,6 +152,24 @@ func TestGetCellValue(t *testing.T) {
151152
cols, err := f.GetCols("Sheet1")
152153
assert.Equal(t, [][]string{{"", "", "A3", "A4", "", "", "A7", "A8"}, {"", "", "", "B4", "", "", "B7", "B8"}}, cols)
153154
assert.NoError(t, err)
155+
delete(f.Sheet, "xl/worksheets/sheet1.xml")
156+
f.XLSX["xl/worksheets/sheet1.xml"] = []byte(fmt.Sprintf(sheetData, `<row r="2"><c r="A2" t="str"><v>A2</v></c></row><row r="2"><c r="B2" t="str"><v>B2</v></c></row>`))
157+
f.checked = nil
158+
cell, err := f.GetCellValue("Sheet1", "A2")
159+
assert.Equal(t, "A2", cell)
160+
assert.NoError(t, err)
161+
delete(f.Sheet, "xl/worksheets/sheet1.xml")
162+
f.XLSX["xl/worksheets/sheet1.xml"] = []byte(fmt.Sprintf(sheetData, `<row r="2"><c r="A2" t="str"><v>A2</v></c></row><row r="2"><c r="B2" t="str"><v>B2</v></c></row>`))
163+
f.checked = nil
164+
rows, err = f.GetRows("Sheet1")
165+
assert.Equal(t, [][]string{nil, {"A2", "B2"}}, rows)
166+
assert.NoError(t, err)
167+
delete(f.Sheet, "xl/worksheets/sheet1.xml")
168+
f.XLSX["xl/worksheets/sheet1.xml"] = []byte(fmt.Sprintf(sheetData, `<row r="1"><c r="A1" t="str"><v>A1</v></c></row><row r="1"><c r="B1" t="str"><v>B1</v></c></row>`))
169+
f.checked = nil
170+
rows, err = f.GetRows("Sheet1")
171+
assert.Equal(t, [][]string{{"A1", "B1"}}, rows)
172+
assert.NoError(t, err)
154173
}
155174

156175
func TestGetCellFormula(t *testing.T) {

Diff for: col.go

+3-4
Original file line numberDiff line numberDiff line change
@@ -103,10 +103,9 @@ func (cols *Cols) Rows() ([]string, error) {
103103
if inElement == "row" {
104104
cellCol = 0
105105
cellRow++
106-
for _, attr := range startElement.Attr {
107-
if attr.Name.Local == "r" {
108-
cellRow, _ = strconv.Atoi(attr.Value)
109-
}
106+
attrR, _ := attrValToInt("r", startElement.Attr)
107+
if attrR != 0 {
108+
cellRow = attrR
110109
}
111110
}
112111
if inElement == "c" {

Diff for: excelize.go

+7-1
Original file line numberDiff line numberDiff line change
@@ -219,11 +219,17 @@ func checkSheet(ws *xlsxWorksheet) {
219219
row = r.R
220220
continue
221221
}
222-
row++
222+
if r.R != row {
223+
row++
224+
}
223225
}
224226
sheetData := xlsxSheetData{Row: make([]xlsxRow, row)}
225227
row = 0
226228
for _, r := range ws.SheetData.Row {
229+
if r.R == row {
230+
sheetData.Row[r.R-1].C = append(sheetData.Row[r.R-1].C, r.C...)
231+
continue
232+
}
227233
if r.R != 0 {
228234
sheetData.Row[r.R-1] = r
229235
row = r.R

Diff for: rows.go

+16-18
Original file line numberDiff line numberDiff line change
@@ -79,10 +79,10 @@ func (rows *Rows) Error() error {
7979
// Columns return the current row's column values.
8080
func (rows *Rows) Columns() ([]string, error) {
8181
var (
82-
err error
83-
inElement string
84-
row, cellCol int
85-
columns []string
82+
err error
83+
inElement string
84+
attrR, cellCol, row int
85+
columns []string
8686
)
8787

8888
if rows.stashRow >= rows.curRow {
@@ -99,26 +99,21 @@ func (rows *Rows) Columns() ([]string, error) {
9999
case xml.StartElement:
100100
inElement = startElement.Name.Local
101101
if inElement == "row" {
102-
for _, attr := range startElement.Attr {
103-
if attr.Name.Local == "r" {
104-
row, err = strconv.Atoi(attr.Value)
105-
if err != nil {
106-
return columns, err
107-
}
108-
if row > rows.curRow {
109-
rows.stashRow = row - 1
110-
return columns, err
111-
}
112-
}
102+
row++
103+
if attrR, err = attrValToInt("r", startElement.Attr); attrR != 0 {
104+
row = attrR
105+
}
106+
if row > rows.curRow {
107+
rows.stashRow = row - 1
108+
return columns, err
113109
}
114110
}
115111
if inElement == "c" {
116112
cellCol++
117113
colCell := xlsxC{}
118114
_ = rows.decoder.DecodeElement(&colCell, &startElement)
119115
if colCell.R != "" {
120-
cellCol, _, err = CellNameToCoordinates(colCell.R)
121-
if err != nil {
116+
if cellCol, _, err = CellNameToCoordinates(colCell.R); err != nil {
122117
return columns, err
123118
}
124119
}
@@ -128,7 +123,10 @@ func (rows *Rows) Columns() ([]string, error) {
128123
}
129124
case xml.EndElement:
130125
inElement = startElement.Name.Local
131-
if inElement == "row" {
126+
if row == 0 {
127+
row = rows.curRow
128+
}
129+
if inElement == "row" && row+1 < rows.curRow {
132130
return columns, err
133131
}
134132
}

0 commit comments

Comments
 (0)