From c3f3b76ac2815899d1d14f834bb882eb413cc7f6 Mon Sep 17 00:00:00 2001 From: rootsec1 Date: Tue, 14 Apr 2026 17:48:40 -0400 Subject: [PATCH] Fix worksheet dimension after cell writes --- sheet.go | 39 +++++++++++++++++++++++++++++++++++++++ sheet_test.go | 28 +++++++++++++++++++++++++++- 2 files changed, 66 insertions(+), 1 deletion(-) diff --git a/sheet.go b/sheet.go index dc41783c48..140c0c0aa7 100644 --- a/sheet.go +++ b/sheet.go @@ -2104,6 +2104,45 @@ func (ws *xlsxWorksheet) prepareSheetXML(col, row int) { } rowData := &ws.SheetData.Row[row-1] fillColumns(rowData, col, row) + ws.expandSheetDimension(col, row) +} + +func (ws *xlsxWorksheet) expandSheetDimension(col, row int) { + if col < 1 || row < 1 { + return + } + cell, err := CoordinatesToCellName(col, row) + if err != nil { + return + } + if ws.Dimension == nil || ws.Dimension.Ref == "" { + ws.Dimension = &xlsxDimension{Ref: cell} + return + } + coordinates, err := rangeRefToCoordinates(ws.Dimension.Ref) + if err != nil { + ws.Dimension = &xlsxDimension{Ref: cell} + return + } + _ = sortCoordinates(coordinates) + if col < coordinates[0] { + coordinates[0] = col + } + if row < coordinates[1] { + coordinates[1] = row + } + if col > coordinates[2] { + coordinates[2] = col + } + if row > coordinates[3] { + coordinates[3] = row + } + ref, err := coordinatesToRangeRef(coordinates) + if err != nil { + ws.Dimension = &xlsxDimension{Ref: cell} + return + } + ws.Dimension = &xlsxDimension{Ref: ref} } // fillColumns fill cells in the column of the row as contiguous. diff --git a/sheet_test.go b/sheet_test.go index bb91f2c5a9..d859c337da 100644 --- a/sheet_test.go +++ b/sheet_test.go @@ -513,13 +513,14 @@ func TestWorksheetWriter(t *testing.T) { // Test set cell value with alternate content f.Sheet.Delete("xl/worksheets/sheet1.xml") worksheet := xml.Header + `%d` + updatedWorksheet := xml.Header + `%d` f.Pkg.Store("xl/worksheets/sheet1.xml", []byte(fmt.Sprintf(worksheet, 1))) f.checked = sync.Map{} assert.NoError(t, f.SetCellValue("Sheet1", "A1", 2)) f.workSheetWriter() value, ok := f.Pkg.Load("xl/worksheets/sheet1.xml") assert.True(t, ok) - assert.Equal(t, fmt.Sprintf(worksheet, 2), string(value.([]byte))) + assert.Equal(t, fmt.Sprintf(updatedWorksheet, 2), string(value.([]byte))) } func TestGetWorkbookPath(t *testing.T) { @@ -840,6 +841,31 @@ func TestSheetDimension(t *testing.T) { assert.Empty(t, dimension) assert.Equal(t, err, ErrSheetNameBlank) + f = NewFile() + assert.NoError(t, f.SetCellValue(sheetName, "C5", "value")) + dimension, err = f.GetSheetDimension(sheetName) + assert.NoError(t, err) + assert.Equal(t, "C5", dimension) + + filePath := filepath.Join(t.TempDir(), "sheet-dimension.xlsx") + assert.NoError(t, f.SaveAs(filePath)) + assert.NoError(t, f.Close()) + + f, err = OpenFile(filePath) + assert.NoError(t, err) + dimension, err = f.GetSheetDimension(sheetName) + assert.NoError(t, err) + assert.Equal(t, "C5", dimension) + assert.NoError(t, f.Close()) + + f = NewFile() + assert.NoError(t, f.SetSheetDimension(sheetName, "B2:E61")) + assert.NoError(t, f.SetCellValue(sheetName, "G64", "value")) + dimension, err = f.GetSheetDimension(sheetName) + assert.NoError(t, err) + assert.Equal(t, "B2:G64", dimension) + assert.NoError(t, f.Close()) + // Test get the worksheet dimension with in mode f, err = OpenFile(filepath.Join("test", "Book1.xlsx"), Options{UnzipXMLSizeLimit: 128}) assert.NoError(t, err)