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();
+ }
}