mirror of
https://github.com/PHPOffice/PhpSpreadsheet.git
synced 2026-09-18 05:57:33 +00:00
Problems With Panes
These glitches were probably due to PR #3622. - Excel may not properly identify the selected cell on a sheet if freeze panes is in effect, even though the Xml points to the correct pane and the correct selected cell is specified for that pane. - Worksheet::calculateColumnWidths may alter activePane.
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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 = '<pane ySplit="1" activePane="bottomLeft" state="frozen" topLeftCell="A2"/><selection pane="bottomLeft" activeCell="C3" sqref="C3"/>';
|
||||
self::assertStringContainsString($expectedString, $data);
|
||||
|
||||
$reloadedActive->freezePane('C1');
|
||||
$reloadedActive->setSelectedCells('A2');
|
||||
$writer = new XlsxWriter($reloadedSpreadsheet);
|
||||
$writerSheet = new XlsxWriter\Worksheet($writer);
|
||||
$data = $writerSheet->writeWorksheet($reloadedActive);
|
||||
$expectedString = '<pane xSplit="2" activePane="topRight" state="frozen" topLeftCell="C1"/><selection pane="topRight" activeCell="A2" sqref="A2"/>';
|
||||
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();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user