Skip to content

Commit 38f1317

Browse files
authored
This closes #1463, add new functions SetSheetDimension and GetSheetDimension (#1467)
1 parent 753969d commit 38f1317

File tree

2 files changed

+97
-0
lines changed

2 files changed

+97
-0
lines changed

sheet.go

+49
Original file line numberDiff line numberDiff line change
@@ -1883,3 +1883,52 @@ func makeContiguousColumns(ws *xlsxWorksheet, fromRow, toRow, colCount int) {
18831883
fillColumns(rowData, colCount, fromRow)
18841884
}
18851885
}
1886+
1887+
// SetSheetDimension provides the method to set or remove the used range of the
1888+
// worksheet by a given range reference. It specifies the row and column bounds
1889+
// of used cells in the worksheet. The range reference is set using the A1
1890+
// reference style(e.g., "A1:D5"). Passing an empty range reference will remove
1891+
// the used range of the worksheet.
1892+
func (f *File) SetSheetDimension(sheet string, rangeRef string) error {
1893+
ws, err := f.workSheetReader(sheet)
1894+
if err != nil {
1895+
return err
1896+
}
1897+
// Remove the dimension element if an empty string is provided
1898+
if rangeRef == "" {
1899+
ws.Dimension = nil
1900+
return nil
1901+
}
1902+
parts := len(strings.Split(rangeRef, ":"))
1903+
if parts == 1 {
1904+
_, _, err = CellNameToCoordinates(rangeRef)
1905+
if err == nil {
1906+
ws.Dimension = &xlsxDimension{Ref: strings.ToUpper(rangeRef)}
1907+
}
1908+
return err
1909+
}
1910+
if parts != 2 {
1911+
return ErrParameterInvalid
1912+
}
1913+
coordinates, err := rangeRefToCoordinates(rangeRef)
1914+
if err != nil {
1915+
return err
1916+
}
1917+
_ = sortCoordinates(coordinates)
1918+
ref, err := f.coordinatesToRangeRef(coordinates)
1919+
ws.Dimension = &xlsxDimension{Ref: ref}
1920+
return err
1921+
}
1922+
1923+
// SetSheetDimension provides the method to get the used range of the worksheet.
1924+
func (f *File) GetSheetDimension(sheet string) (string, error) {
1925+
var ref string
1926+
ws, err := f.workSheetReader(sheet)
1927+
if err != nil {
1928+
return ref, err
1929+
}
1930+
if ws.Dimension != nil {
1931+
ref = ws.Dimension.Ref
1932+
}
1933+
return ref, err
1934+
}

sheet_test.go

+48
Original file line numberDiff line numberDiff line change
@@ -644,3 +644,51 @@ func TestCheckSheetName(t *testing.T) {
644644
assert.EqualError(t, checkSheetName("'Sheet"), ErrSheetNameSingleQuote.Error())
645645
assert.EqualError(t, checkSheetName("Sheet'"), ErrSheetNameSingleQuote.Error())
646646
}
647+
648+
func TestSheetDimension(t *testing.T) {
649+
f := NewFile()
650+
const sheetName = "Sheet1"
651+
// Test get a new worksheet dimension
652+
dimension, err := f.GetSheetDimension(sheetName)
653+
assert.NoError(t, err)
654+
assert.Equal(t, "A1", dimension)
655+
// Test remove the worksheet dimension
656+
assert.NoError(t, f.SetSheetDimension(sheetName, ""))
657+
assert.NoError(t, err)
658+
dimension, err = f.GetSheetDimension(sheetName)
659+
assert.NoError(t, err)
660+
assert.Equal(t, "", dimension)
661+
// Test set the worksheet dimension
662+
for _, excepted := range []string{"A1", "A1:D5", "A1:XFD1048576", "a1", "A1:d5"} {
663+
err = f.SetSheetDimension(sheetName, excepted)
664+
assert.NoError(t, err)
665+
dimension, err := f.GetSheetDimension(sheetName)
666+
assert.NoError(t, err)
667+
assert.Equal(t, strings.ToUpper(excepted), dimension)
668+
}
669+
// Test set the worksheet dimension with invalid range reference or no exists worksheet
670+
for _, c := range []struct {
671+
sheetName string
672+
rangeRef string
673+
err string
674+
}{
675+
{"Sheet1", "A-1", "cannot convert cell \"A-1\" to coordinates: invalid cell name \"A-1\""},
676+
{"Sheet1", "A1:B-1", "cannot convert cell \"B-1\" to coordinates: invalid cell name \"B-1\""},
677+
{"Sheet1", "A1:XFD1048577", "row number exceeds maximum limit"},
678+
{"Sheet1", "123", "cannot convert cell \"123\" to coordinates: invalid cell name \"123\""},
679+
{"Sheet1", "A:B", "cannot convert cell \"A\" to coordinates: invalid cell name \"A\""},
680+
{"Sheet1", ":B10", "cannot convert cell \"\" to coordinates: invalid cell name \"\""},
681+
{"Sheet1", "XFE1", "the column number must be greater than or equal to 1 and less than or equal to 16384"},
682+
{"Sheet1", "A1048577", "row number exceeds maximum limit"},
683+
{"Sheet1", "ZZZ", "cannot convert cell \"ZZZ\" to coordinates: invalid cell name \"ZZZ\""},
684+
{"SheetN", "A1", "sheet SheetN does not exist"},
685+
{"Sheet1", "A1:B3:D5", ErrParameterInvalid.Error()},
686+
} {
687+
err = f.SetSheetDimension(c.sheetName, c.rangeRef)
688+
assert.EqualError(t, err, c.err)
689+
}
690+
// Test get the worksheet dimension no exists worksheet
691+
dimension, err = f.GetSheetDimension("SheetN")
692+
assert.Empty(t, dimension)
693+
assert.EqualError(t, err, "sheet SheetN does not exist")
694+
}

0 commit comments

Comments
 (0)