Skip to content

Commit d682f2f

Browse files
committed
Correct update to named ranges and formulae when inserting/deleting columns/rows
1 parent 3b0c450 commit d682f2f

File tree

4 files changed

+40
-29
lines changed

4 files changed

+40
-29
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ and this project adheres to [Semantic Versioning](https://semver.org).
3838

3939
### Fixed
4040

41+
- Fix update to defined names when inserting/deleting rows/columns [Issue #3076](https://github.com/PHPOffice/PhpSpreadsheet/issues/3076) [PR #3077](https://github.com/PHPOffice/PhpSpreadsheet/pull/3077)
4142
- Fix DataValidation sqRef when inserting/deleting rows/columns [Issue #3056](https://github.com/PHPOffice/PhpSpreadsheet/issues/3056) [PR #3074](https://github.com/PHPOffice/PhpSpreadsheet/pull/3074)
4243
- Named ranges not usable as anchors in OFFSET function [Issue #3013](https://github.com/PHPOffice/PhpSpreadsheet/issues/3013)
4344
- Fully flatten an array [Issue #2955](https://github.com/PHPOffice/PhpSpreadsheet/issues/2955) [PR #2956](https://github.com/PHPOffice/PhpSpreadsheet/pull/2956)

src/PhpSpreadsheet/DefinedName.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,7 @@ public function setName(string $name): self
150150

151151
// New title
152152
$newTitle = $this->name;
153-
ReferenceHelper::getInstance()->updateNamedFormulas($this->worksheet->getParent(), $oldTitle, $newTitle);
153+
ReferenceHelper::getInstance()->updateNamedFormulae($this->worksheet->getParent(), $oldTitle, $newTitle);
154154
}
155155

156156
return $this;

src/PhpSpreadsheet/ReferenceHelper.php

Lines changed: 37 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -862,13 +862,13 @@ private function updateCellReference($cellReference = 'A1', bool $includeAbsolut
862862
}
863863

864864
/**
865-
* Update named formulas (i.e. containing worksheet references / named ranges).
865+
* Update named formulae (i.e. containing worksheet references / named ranges).
866866
*
867867
* @param Spreadsheet $spreadsheet Object to update
868868
* @param string $oldName Old name (name to replace)
869869
* @param string $newName New name
870870
*/
871-
public function updateNamedFormulas(Spreadsheet $spreadsheet, $oldName = '', $newName = ''): void
871+
public function updateNamedFormulae(Spreadsheet $spreadsheet, $oldName = '', $newName = ''): void
872872
{
873873
if ($oldName == '') {
874874
return;
@@ -889,6 +889,41 @@ public function updateNamedFormulas(Spreadsheet $spreadsheet, $oldName = '', $ne
889889
}
890890
}
891891

892+
private function updateDefinedNames(Worksheet $worksheet, string $beforeCellAddress, int $numberOfColumns, int $numberOfRows): void
893+
{
894+
foreach ($worksheet->getParent()->getDefinedNames() as $definedName) {
895+
if ($definedName->isFormula() === false) {
896+
$this->updateNamedRange($definedName, $worksheet, $beforeCellAddress, $numberOfColumns, $numberOfRows);
897+
} else {
898+
$this->updateNamedFormula($definedName, $worksheet, $beforeCellAddress, $numberOfColumns, $numberOfRows);
899+
}
900+
}
901+
}
902+
903+
private function updateNamedRange(DefinedName $definedName, Worksheet $worksheet, string $beforeCellAddress, int $numberOfColumns, int $numberOfRows): void
904+
{
905+
$cellAddress = $definedName->getValue();
906+
$asFormula = ($cellAddress[0] === '=');
907+
if ($definedName->getWorksheet() !== null && $definedName->getWorksheet()->getHashCode() === $worksheet->getHashCode()) {
908+
if ($asFormula === true) {
909+
$formula = $definedName->getValue();
910+
$formula = $this->updateFormulaReferences($formula, $beforeCellAddress, $numberOfColumns, $numberOfRows, $worksheet->getTitle());
911+
$definedName->setValue($formula);
912+
} else {
913+
$definedName->setValue($asFormula . $this->updateCellReference(ltrim($cellAddress, '=')));
914+
}
915+
}
916+
}
917+
918+
private function updateNamedFormula(DefinedName $definedName, Worksheet $worksheet, string $beforeCellAddress, int $numberOfColumns, int $numberOfRows): void
919+
{
920+
if ($definedName->getWorksheet() !== null && $definedName->getWorksheet()->getHashCode() === $worksheet->getHashCode()) {
921+
$formula = $definedName->getValue();
922+
$formula = $this->updateFormulaReferences($formula, $beforeCellAddress, $numberOfColumns, $numberOfRows, $worksheet->getTitle());
923+
$definedName->setValue($formula);
924+
}
925+
}
926+
892927
/**
893928
* Update cell range.
894929
*
@@ -1159,29 +1194,4 @@ final public function __clone()
11591194
{
11601195
throw new Exception('Cloning a Singleton is not allowed!');
11611196
}
1162-
1163-
public function updateDefinedNames(Worksheet $worksheet, string $beforeCellAddress, int $numberOfColumns, int $numberOfRows): void
1164-
{
1165-
foreach ($worksheet->getParent()->getDefinedNames() as $definedName) {
1166-
if ($definedName->isFormula() === false) {
1167-
$cellAddress = $definedName->getValue();
1168-
$asFormula = ($cellAddress[0] === '=');
1169-
if ($definedName->getWorksheet() !== null && $definedName->getWorksheet()->getHashCode() === $worksheet->getHashCode()) {
1170-
if ($asFormula === true) {
1171-
$formula = $definedName->getValue();
1172-
$formula = $this->updateFormulaReferences($formula, $beforeCellAddress, $numberOfColumns, $numberOfRows, $worksheet->getTitle());
1173-
$definedName->setValue($formula);
1174-
} else {
1175-
$definedName->setValue($asFormula . $this->updateCellReference(ltrim($cellAddress, '=')));
1176-
}
1177-
}
1178-
} else {
1179-
$formula = $definedName->getValue();
1180-
if ($definedName->getWorksheet() !== null && $definedName->getWorksheet()->getHashCode() === $worksheet->getHashCode()) {
1181-
$formula = $this->updateFormulaReferences($formula, $beforeCellAddress, $numberOfColumns, $numberOfRows, $worksheet->getTitle());
1182-
$definedName->setValue($formula);
1183-
}
1184-
}
1185-
}
1186-
}
11871197
}

src/PhpSpreadsheet/Worksheet/Worksheet.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -923,7 +923,7 @@ public function setTitle($title, $updateFormulaCellReferences = true, $validate
923923
$this->parent->getCalculationEngine()
924924
->renameCalculationCacheForWorksheet($oldTitle, $newTitle);
925925
if ($updateFormulaCellReferences) {
926-
ReferenceHelper::getInstance()->updateNamedFormulas($this->parent, $oldTitle, $newTitle);
926+
ReferenceHelper::getInstance()->updateNamedFormulae($this->parent, $oldTitle, $newTitle);
927927
}
928928
}
929929

0 commit comments

Comments
 (0)