From dbf25f0721fd42f4e4e9ce22b687f2cc8217915a Mon Sep 17 00:00:00 2001 From: MarkBaker Date: Sat, 5 Mar 2022 19:00:32 +0100 Subject: [PATCH] Set Selected Cells for Worksheets in Gnumeric Loader --- CHANGELOG.md | 4 +-- src/PhpSpreadsheet/Reader/Gnumeric.php | 29 +++++++++++++++++-- .../Reader/Gnumeric/GnumericLoadTest.php | 4 +++ 3 files changed, 33 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c1cdb9b6..372000d7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,11 +19,11 @@ and this project adheres to [Semantic Versioning](https://semver.org). ### Changed - Gnumeric Reader now loads number formatting for cells. -- Gnumeric Reader now correctly identifies selected worksheet. +- Gnumeric Reader now correctly identifies selected worksheet and selected cells in a worksheet. - Some Refactoring of the Ods Reader, moving all formula and address translation from Ods to Excel into a separate class to eliminate code duplication and ensure consistency. - Make Boolean Conversion in Csv Reader locale-aware when using the String Value Binder. - This is determined b the Calculation Engine locale setting. + This is determined by the Calculation Engine locale setting. (i.e. `"Vrai"` wil be converted to a boolean `true` if the Locale is set to `fr`.) diff --git a/src/PhpSpreadsheet/Reader/Gnumeric.php b/src/PhpSpreadsheet/Reader/Gnumeric.php index d3b2039e..ee2e8d3d 100644 --- a/src/PhpSpreadsheet/Reader/Gnumeric.php +++ b/src/PhpSpreadsheet/Reader/Gnumeric.php @@ -309,6 +309,7 @@ class Gnumeric extends BaseReader $this->processMergedCells($sheet); $this->processAutofilter($sheet); + $this->setSelectedCells($sheet); ++$worksheetID; } @@ -329,6 +330,28 @@ class Gnumeric extends BaseReader } } + private function setSelectedCells(?SimpleXMLElement $sheet): void + { + if ($sheet !== null && isset($sheet->Selections)) { + foreach ($sheet->Selections as $selection) { + $startCol = (int) ($selection->StartCol ?? 0); + $startRow = (int) ($selection->StartRow ?? 0) + 1; + $endCol = (int) ($selection->EndCol ?? $startCol); + $endRow = (int) ($selection->endRow ?? 0) + 1; + + $startColumn = Coordinate::stringFromColumnIndex($startCol + 1); + $endColumn = Coordinate::stringFromColumnIndex($endCol + 1); + + $startCell = "{$startColumn}{$startRow}"; + $endCell = "{$endColumn}{$endRow}"; + $selectedRange = $startCell . (($endCell !== $startCell) ? ':' . $endCell : ''); + $this->spreadsheet->getActiveSheet()->setSelectedCell($selectedRange); + + break; + } + } + } + private function processMergedCells(?SimpleXMLElement $sheet): void { // Handle Merged Cells in this worksheet @@ -357,7 +380,8 @@ class Gnumeric extends BaseReader private function setColumnWidth(int $whichColumn, float $defaultWidth): void { - $columnDimension = $this->spreadsheet->getActiveSheet()->getColumnDimension(Coordinate::stringFromColumnIndex($whichColumn + 1)); + $columnDimension = $this->spreadsheet->getActiveSheet() + ->getColumnDimension(Coordinate::stringFromColumnIndex($whichColumn + 1)); if ($columnDimension !== null) { $columnDimension->setWidth($defaultWidth); } @@ -365,7 +389,8 @@ class Gnumeric extends BaseReader private function setColumnInvisible(int $whichColumn): void { - $columnDimension = $this->spreadsheet->getActiveSheet()->getColumnDimension(Coordinate::stringFromColumnIndex($whichColumn + 1)); + $columnDimension = $this->spreadsheet->getActiveSheet() + ->getColumnDimension(Coordinate::stringFromColumnIndex($whichColumn + 1)); if ($columnDimension !== null) { $columnDimension->setVisible(false); } diff --git a/tests/PhpSpreadsheetTests/Reader/Gnumeric/GnumericLoadTest.php b/tests/PhpSpreadsheetTests/Reader/Gnumeric/GnumericLoadTest.php index 58dbe501..bdc777f6 100644 --- a/tests/PhpSpreadsheetTests/Reader/Gnumeric/GnumericLoadTest.php +++ b/tests/PhpSpreadsheetTests/Reader/Gnumeric/GnumericLoadTest.php @@ -125,6 +125,8 @@ class GnumericLoadTest extends TestCase self::assertTrue($sheet->getCell('B24')->getStyle()->getFont()->getSuperScript()); $rowDimension = $sheet->getRowDimension(30); self::assertFalse($rowDimension->getVisible()); + + self::assertSame('B24', $sheet->getSelectedCells()); } public function testLoadFilter(): void @@ -167,5 +169,7 @@ class GnumericLoadTest extends TestCase $sheet = $spreadsheet->getSheet(0); self::assertEquals('Report Data', $sheet->getTitle()); self::assertEquals('Third Heading', $sheet->getCell('C2')->getValue()); + + self::assertSame('A1', $sheet->getSelectedCells()); } }