diff --git a/src/PhpSpreadsheet/Worksheet/Worksheet.php b/src/PhpSpreadsheet/Worksheet/Worksheet.php index 1cc3dc81c..343b33b37 100644 --- a/src/PhpSpreadsheet/Worksheet/Worksheet.php +++ b/src/PhpSpreadsheet/Worksheet/Worksheet.php @@ -745,6 +745,7 @@ class Worksheet implements IComparable // There is only something to do if there are some auto-size columns if (!empty($autoSizes)) { + $holdActivePane = $this->activePane; // build list of cells references that participate in a merge $isMergeCell = []; foreach ($this->getMergeCells() as $cells) { @@ -829,6 +830,7 @@ class Worksheet implements IComparable } $this->getColumnDimension($columnIndex)->setWidth($width); } + $this->activePane = $holdActivePane; } return $this; diff --git a/src/PhpSpreadsheet/Writer/Xlsx/Worksheet.php b/src/PhpSpreadsheet/Writer/Xlsx/Worksheet.php index de9cc49e7..53f44e341 100644 --- a/src/PhpSpreadsheet/Writer/Xlsx/Worksheet.php +++ b/src/PhpSpreadsheet/Writer/Xlsx/Worksheet.php @@ -315,16 +315,26 @@ class Worksheet extends WriterPart $ySplit = $worksheet->getYSplit(); $pane = $worksheet->getActivePane(); $paneTopLeftCell = $worksheet->getPaneTopLeftCell(); + $paneState = $worksheet->getPaneState(); + $normalFreeze = ''; + if ($paneState === PhpSpreadsheetWorksheet::PANE_FROZEN) { + if ($ySplit > 0) { + $normalFreeze = ($xSplit <= 0) ? 'bottomLeft' : 'bottomRight'; + } else { + $normalFreeze = 'topRight'; + } + } if ($xSplit > 0) { $objWriter->writeAttribute('xSplit', "$xSplit"); } if ($ySplit > 0) { $objWriter->writeAttribute('ySplit', "$ySplit"); } - if ($pane !== '') { + if ($normalFreeze !== '') { + $objWriter->writeAttribute('activePane', $normalFreeze); + } elseif ($pane !== '') { $objWriter->writeAttribute('activePane', $pane); } - $paneState = $worksheet->getPaneState(); if ($paneState !== '') { $objWriter->writeAttribute('state', $paneState); } @@ -333,20 +343,33 @@ class Worksheet extends WriterPart } $objWriter->endElement(); // pane - foreach ($worksheet->getPanes() as $panex) { - if ($panex !== null) { - $sqref = $activeCell = ''; - $objWriter->startElement('selection'); - $objWriter->writeAttribute('pane', $panex->getPosition()); - $activeCellPane = $panex->getActiveCell(); - if ($activeCellPane !== '') { - $objWriter->writeAttribute('activeCell', $activeCellPane); + if ($normalFreeze !== '') { + $objWriter->startElement('selection'); + $objWriter->writeAttribute('pane', $normalFreeze); + if ($activeCell !== '') { + $objWriter->writeAttribute('activeCell', $activeCell); + } + if ($sqref !== '') { + $objWriter->writeAttribute('sqref', $sqref); + } + $objWriter->endElement(); // selection + $sqref = $activeCell = ''; + } else { + foreach ($worksheet->getPanes() as $panex) { + if ($panex !== null) { + $sqref = $activeCell = ''; + $objWriter->startElement('selection'); + $objWriter->writeAttribute('pane', $panex->getPosition()); + $activeCellPane = $panex->getActiveCell(); + if ($activeCellPane !== '') { + $objWriter->writeAttribute('activeCell', $activeCellPane); + } + $sqrefPane = $panex->getSqref(); + if ($sqrefPane !== '') { + $objWriter->writeAttribute('sqref', $sqrefPane); + } + $objWriter->endElement(); // selection } - $sqrefPane = $panex->getSqref(); - if ($sqrefPane !== '') { - $objWriter->writeAttribute('sqref', $sqrefPane); - } - $objWriter->endElement(); // selection } } } diff --git a/tests/PhpSpreadsheetTests/Functional/FreezePaneTest.php b/tests/PhpSpreadsheetTests/Functional/FreezePaneTest.php index 72e9ad1aa..28b05b2d7 100644 --- a/tests/PhpSpreadsheetTests/Functional/FreezePaneTest.php +++ b/tests/PhpSpreadsheetTests/Functional/FreezePaneTest.php @@ -7,6 +7,7 @@ namespace PhpOffice\PhpSpreadsheetTests\Functional; use PhpOffice\PhpSpreadsheet\Spreadsheet; use PhpOffice\PhpSpreadsheet\Worksheet\Pane; use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet; +use PhpOffice\PhpSpreadsheet\Writer\Xlsx as XlsxWriter; class FreezePaneTest extends AbstractFunctional { @@ -94,8 +95,23 @@ class FreezePaneTest extends AbstractFunctional // Read written file $reloadedActive = $reloadedSpreadsheet->getActiveSheet(); - $expected = 'C3'; - self::assertSame($expected, $reloadedActive->getSelectedCells()); + self::assertSame('C3', $reloadedActive->getSelectedCells()); + self::assertSame('A2', $reloadedActive->getFreezePane()); + if ($format === 'Xlsx') { + $writer = new XlsxWriter($reloadedSpreadsheet); + $writerSheet = new XlsxWriter\Worksheet($writer); + $data = $writerSheet->writeWorksheet($reloadedActive); + $expectedString = ''; + self::assertStringContainsString($expectedString, $data); + + $reloadedActive->freezePane('C1'); + $reloadedActive->setSelectedCells('A2'); + $writer = new XlsxWriter($reloadedSpreadsheet); + $writerSheet = new XlsxWriter\Worksheet($writer); + $data = $writerSheet->writeWorksheet($reloadedActive); + $expectedString = ''; + self::assertStringContainsString($expectedString, $data); + } $reloadedSpreadsheet->disconnectWorksheets(); } @@ -256,4 +272,29 @@ class FreezePaneTest extends AbstractFunctional $spreadsheet->disconnectWorksheets(); } + + public function testAutoWidthDoesNotCorruptActivePane(): void + { + $spreadsheet = new Spreadsheet(); + $sheet = $spreadsheet->getActiveSheet(); + $sheet->fromArray( + [ + [1, 2, 3, 4], + [5, 6, 7, 8], + [9, 10, 11, 12], + ] + ); + $sheet->freezePane('A2'); + $sheet->setSelectedCell('B1'); + $paneBefore = $sheet->getActivePane(); + self::assertSame('topLeft', $paneBefore); + $sheet->getColumnDimension('A')->setAutoSize(true); + $sheet->getColumnDimension('B')->setAutoSize(true); + $sheet->getColumnDimension('C')->setAutoSize(true); + $sheet->getColumnDimension('D')->setAutoSize(true); + $sheet->calculateColumnWidths(); + $paneAfter = $sheet->getActivePane(); + self::assertSame('topLeft', $paneAfter); + $spreadsheet->disconnectWorksheets(); + } }