Skip to content

Commit a17a56b

Browse files
authored
Merge pull request #3841 from oleibman/freezeselected
Problems With Panes
2 parents fb79600 + 5cfb7b3 commit a17a56b

File tree

3 files changed

+83
-17
lines changed

3 files changed

+83
-17
lines changed

src/PhpSpreadsheet/Worksheet/Worksheet.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -747,6 +747,7 @@ public function calculateColumnWidths(): static
747747

748748
// There is only something to do if there are some auto-size columns
749749
if (!empty($autoSizes)) {
750+
$holdActivePane = $this->activePane;
750751
// build list of cells references that participate in a merge
751752
$isMergeCell = [];
752753
foreach ($this->getMergeCells() as $cells) {
@@ -831,6 +832,7 @@ public function calculateColumnWidths(): static
831832
}
832833
$this->getColumnDimension($columnIndex)->setWidth($width);
833834
}
835+
$this->activePane = $holdActivePane;
834836
}
835837

836838
return $this;

src/PhpSpreadsheet/Writer/Xlsx/Worksheet.php

Lines changed: 38 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -315,16 +315,26 @@ private function writeSheetViews(XMLWriter $objWriter, PhpspreadsheetWorksheet $
315315
$ySplit = $worksheet->getYSplit();
316316
$pane = $worksheet->getActivePane();
317317
$paneTopLeftCell = $worksheet->getPaneTopLeftCell();
318+
$paneState = $worksheet->getPaneState();
319+
$normalFreeze = '';
320+
if ($paneState === PhpSpreadsheetWorksheet::PANE_FROZEN) {
321+
if ($ySplit > 0) {
322+
$normalFreeze = ($xSplit <= 0) ? 'bottomLeft' : 'bottomRight';
323+
} else {
324+
$normalFreeze = 'topRight';
325+
}
326+
}
318327
if ($xSplit > 0) {
319328
$objWriter->writeAttribute('xSplit', "$xSplit");
320329
}
321330
if ($ySplit > 0) {
322331
$objWriter->writeAttribute('ySplit', "$ySplit");
323332
}
324-
if ($pane !== '') {
333+
if ($normalFreeze !== '') {
334+
$objWriter->writeAttribute('activePane', $normalFreeze);
335+
} elseif ($pane !== '') {
325336
$objWriter->writeAttribute('activePane', $pane);
326337
}
327-
$paneState = $worksheet->getPaneState();
328338
if ($paneState !== '') {
329339
$objWriter->writeAttribute('state', $paneState);
330340
}
@@ -333,20 +343,33 @@ private function writeSheetViews(XMLWriter $objWriter, PhpspreadsheetWorksheet $
333343
}
334344
$objWriter->endElement(); // pane
335345

336-
foreach ($worksheet->getPanes() as $panex) {
337-
if ($panex !== null) {
338-
$sqref = $activeCell = '';
339-
$objWriter->startElement('selection');
340-
$objWriter->writeAttribute('pane', $panex->getPosition());
341-
$activeCellPane = $panex->getActiveCell();
342-
if ($activeCellPane !== '') {
343-
$objWriter->writeAttribute('activeCell', $activeCellPane);
344-
}
345-
$sqrefPane = $panex->getSqref();
346-
if ($sqrefPane !== '') {
347-
$objWriter->writeAttribute('sqref', $sqrefPane);
346+
if ($normalFreeze !== '') {
347+
$objWriter->startElement('selection');
348+
$objWriter->writeAttribute('pane', $normalFreeze);
349+
if ($activeCell !== '') {
350+
$objWriter->writeAttribute('activeCell', $activeCell);
351+
}
352+
if ($sqref !== '') {
353+
$objWriter->writeAttribute('sqref', $sqref);
354+
}
355+
$objWriter->endElement(); // selection
356+
$sqref = $activeCell = '';
357+
} else {
358+
foreach ($worksheet->getPanes() as $panex) {
359+
if ($panex !== null) {
360+
$sqref = $activeCell = '';
361+
$objWriter->startElement('selection');
362+
$objWriter->writeAttribute('pane', $panex->getPosition());
363+
$activeCellPane = $panex->getActiveCell();
364+
if ($activeCellPane !== '') {
365+
$objWriter->writeAttribute('activeCell', $activeCellPane);
366+
}
367+
$sqrefPane = $panex->getSqref();
368+
if ($sqrefPane !== '') {
369+
$objWriter->writeAttribute('sqref', $sqrefPane);
370+
}
371+
$objWriter->endElement(); // selection
348372
}
349-
$objWriter->endElement(); // selection
350373
}
351374
}
352375
}

tests/PhpSpreadsheetTests/Functional/FreezePaneTest.php

Lines changed: 43 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
use PhpOffice\PhpSpreadsheet\Spreadsheet;
88
use PhpOffice\PhpSpreadsheet\Worksheet\Pane;
99
use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet;
10+
use PhpOffice\PhpSpreadsheet\Writer\Xlsx as XlsxWriter;
1011

1112
class FreezePaneTest extends AbstractFunctional
1213
{
@@ -94,8 +95,23 @@ public function testFreezePaneUserSelectedCell(string $format): void
9495
// Read written file
9596
$reloadedActive = $reloadedSpreadsheet->getActiveSheet();
9697

97-
$expected = 'C3';
98-
self::assertSame($expected, $reloadedActive->getSelectedCells());
98+
self::assertSame('C3', $reloadedActive->getSelectedCells());
99+
self::assertSame('A2', $reloadedActive->getFreezePane());
100+
if ($format === 'Xlsx') {
101+
$writer = new XlsxWriter($reloadedSpreadsheet);
102+
$writerSheet = new XlsxWriter\Worksheet($writer);
103+
$data = $writerSheet->writeWorksheet($reloadedActive);
104+
$expectedString = '<pane ySplit="1" activePane="bottomLeft" state="frozen" topLeftCell="A2"/><selection pane="bottomLeft" activeCell="C3" sqref="C3"/>';
105+
self::assertStringContainsString($expectedString, $data);
106+
107+
$reloadedActive->freezePane('C1');
108+
$reloadedActive->setSelectedCells('A2');
109+
$writer = new XlsxWriter($reloadedSpreadsheet);
110+
$writerSheet = new XlsxWriter\Worksheet($writer);
111+
$data = $writerSheet->writeWorksheet($reloadedActive);
112+
$expectedString = '<pane xSplit="2" activePane="topRight" state="frozen" topLeftCell="C1"/><selection pane="topRight" activeCell="A2" sqref="A2"/>';
113+
self::assertStringContainsString($expectedString, $data);
114+
}
99115
$reloadedSpreadsheet->disconnectWorksheets();
100116
}
101117

@@ -256,4 +272,29 @@ public function testFreezePaneViaPaneState(): void
256272

257273
$spreadsheet->disconnectWorksheets();
258274
}
275+
276+
public function testAutoWidthDoesNotCorruptActivePane(): void
277+
{
278+
$spreadsheet = new Spreadsheet();
279+
$sheet = $spreadsheet->getActiveSheet();
280+
$sheet->fromArray(
281+
[
282+
[1, 2, 3, 4],
283+
[5, 6, 7, 8],
284+
[9, 10, 11, 12],
285+
]
286+
);
287+
$sheet->freezePane('A2');
288+
$sheet->setSelectedCell('B1');
289+
$paneBefore = $sheet->getActivePane();
290+
self::assertSame('topLeft', $paneBefore);
291+
$sheet->getColumnDimension('A')->setAutoSize(true);
292+
$sheet->getColumnDimension('B')->setAutoSize(true);
293+
$sheet->getColumnDimension('C')->setAutoSize(true);
294+
$sheet->getColumnDimension('D')->setAutoSize(true);
295+
$sheet->calculateColumnWidths();
296+
$paneAfter = $sheet->getActivePane();
297+
self::assertSame('topLeft', $paneAfter);
298+
$spreadsheet->disconnectWorksheets();
299+
}
259300
}

0 commit comments

Comments
 (0)