Skip to content

Commit 9a68553

Browse files
authored
This closes #1792, support to update defined names reference when rename worksheet (#1797)
1 parent e4497c4 commit 9a68553

File tree

3 files changed

+52
-0
lines changed

3 files changed

+52
-0
lines changed

adjust.go

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -454,6 +454,33 @@ func (f *File) adjustFormulaRef(sheet, sheetN, formula string, keepRelative bool
454454
return val, nil
455455
}
456456

457+
// adjustRangeSheetName returns replaced range reference by given source and
458+
// target sheet name.
459+
func adjustRangeSheetName(rng, source, target string) string {
460+
cellRefs := strings.Split(rng, ",")
461+
for i, cellRef := range cellRefs {
462+
rangeRefs := strings.Split(cellRef, ":")
463+
for j, rangeRef := range rangeRefs {
464+
parts := strings.Split(rangeRef, "!")
465+
for k, part := range parts {
466+
singleQuote := strings.HasPrefix(part, "'") && strings.HasSuffix(part, "'")
467+
if singleQuote {
468+
part = strings.TrimPrefix(strings.TrimSuffix(part, "'"), "'")
469+
}
470+
if part == source {
471+
if part = target; singleQuote {
472+
part = "'" + part + "'"
473+
}
474+
}
475+
parts[k] = part
476+
}
477+
rangeRefs[j] = strings.Join(parts, "!")
478+
}
479+
cellRefs[i] = strings.Join(rangeRefs, ":")
480+
}
481+
return strings.Join(cellRefs, ",")
482+
}
483+
457484
// arrayFormulaOperandToken defines meta fields for transforming the array
458485
// formula to the normal formula.
459486
type arrayFormulaOperandToken struct {

sheet.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -374,6 +374,12 @@ func (f *File) SetSheetName(source, target string) error {
374374
delete(f.sheetMap, source)
375375
}
376376
}
377+
if wb.DefinedNames == nil {
378+
return err
379+
}
380+
for i, dn := range wb.DefinedNames.DefinedName {
381+
wb.DefinedNames.DefinedName[i].Data = adjustRangeSheetName(dn.Data, source, target)
382+
}
377383
return err
378384
}
379385

sheet_test.go

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -467,6 +467,25 @@ func TestSetSheetName(t *testing.T) {
467467
assert.Equal(t, "Sheet1", f.GetSheetName(0))
468468
// Test set sheet name with invalid sheet name
469469
assert.EqualError(t, f.SetSheetName("Sheet:1", "Sheet1"), ErrSheetNameInvalid.Error())
470+
471+
// Test set worksheet name with existing defined name and auto filter
472+
assert.NoError(t, f.AutoFilter("Sheet1", "A1:A2", nil))
473+
assert.NoError(t, f.SetDefinedName(&DefinedName{
474+
Name: "Name1",
475+
RefersTo: "$B$2",
476+
}))
477+
assert.NoError(t, f.SetDefinedName(&DefinedName{
478+
Name: "Name2",
479+
RefersTo: "$A1$2:A2",
480+
}))
481+
assert.NoError(t, f.SetDefinedName(&DefinedName{
482+
Name: "Name3",
483+
RefersTo: "Sheet1!$A$1:'Sheet1'!A1:Sheet1!$A$1,Sheet1!A1:Sheet3!A1,Sheet3!A1",
484+
}))
485+
assert.NoError(t, f.SetSheetName("Sheet1", "Sheet2"))
486+
for i, expected := range []string{"'Sheet2'!$A$1:$A$2", "$B$2", "$A1$2:A2", "Sheet2!$A$1:'Sheet2'!A1:Sheet2!$A$1,Sheet2!A1:Sheet3!A1,Sheet3!A1"} {
487+
assert.Equal(t, expected, f.WorkBook.DefinedNames.DefinedName[i].Data)
488+
}
470489
}
471490

472491
func TestWorksheetWriter(t *testing.T) {

0 commit comments

Comments
 (0)