@@ -226,7 +226,13 @@ func (f *File) workSheetReader(sheet string) (ws *xlsxWorksheet, err error) {
226
226
// continuous in a worksheet of XML.
227
227
func checkSheet (ws * xlsxWorksheet ) {
228
228
var row int
229
- for _ , r := range ws .SheetData .Row {
229
+ var r0 xlsxRow
230
+ for i , r := range ws .SheetData .Row {
231
+ if i == 0 && r .R == 0 {
232
+ r0 = r
233
+ ws .SheetData .Row = ws .SheetData .Row [1 :]
234
+ continue
235
+ }
230
236
if r .R != 0 && r .R > row {
231
237
row = r .R
232
238
continue
@@ -254,7 +260,29 @@ func checkSheet(ws *xlsxWorksheet) {
254
260
for i := 1 ; i <= row ; i ++ {
255
261
sheetData .Row [i - 1 ].R = i
256
262
}
257
- ws .SheetData = sheetData
263
+ checkSheetR0 (ws , & sheetData , & r0 )
264
+ }
265
+
266
+ // checkSheetR0 handle the row element with r="0" attribute, cells in this row
267
+ // could be disorderly, the cell in this row can be used as the value of
268
+ // which cell is empty in the normal rows.
269
+ func checkSheetR0 (ws * xlsxWorksheet , sheetData * xlsxSheetData , r0 * xlsxRow ) {
270
+ for _ , cell := range r0 .C {
271
+ if col , row , err := CellNameToCoordinates (cell .R ); err == nil {
272
+ rows , rowIdx := len (sheetData .Row ), row - 1
273
+ for r := rows ; r < row ; r ++ {
274
+ sheetData .Row = append (sheetData .Row , xlsxRow {R : r + 1 })
275
+ }
276
+ columns , colIdx := len (sheetData .Row [rowIdx ].C ), col - 1
277
+ for c := columns ; c < col ; c ++ {
278
+ sheetData .Row [rowIdx ].C = append (sheetData .Row [rowIdx ].C , xlsxC {})
279
+ }
280
+ if ! sheetData .Row [rowIdx ].C [colIdx ].hasValue () {
281
+ sheetData .Row [rowIdx ].C [colIdx ] = cell
282
+ }
283
+ }
284
+ }
285
+ ws .SheetData = * sheetData
258
286
}
259
287
260
288
// addRels provides a function to add relationships by given XML path,
0 commit comments