Skip to content

Commit

Permalink
Fix active cell when freeze pane is used
Browse files Browse the repository at this point in the history
When freeze pane is in use on a worksheet, PhpSpreadsheet saves to Xlsx in such
a way that the active cell is always set to the top left cell below the freeze
pane. I find it difficult to understand why:

  1. You have given users the setSelectedCells function, but then choose to
     ignore it.
  2. Excel itself does not act in this manner.
  3. PHPExcel did not act in this manner.
  4. PhpSpreadsheet when writing to Xls does not act in this manner.
     This is especially emphasized because the one test in FreezePaneTest which
     would expose the difference is the only test in that member which is
     not made for both Xls and Xlsx.
  5. It is *really* useful to be able to open a spreadsheet anywhere, even when
     it has header rows.

Closes PHPOffice#1323
  • Loading branch information
oleibman authored and Paul Kievits committed Mar 6, 2020
1 parent de806d4 commit 6c8bbae
Show file tree
Hide file tree
Showing 3 changed files with 61 additions and 11 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ and this project adheres to [Semantic Versioning](https://semver.org).
- Fix Xlsx Writer's handling of decimal commas [#1282](https://github.com/PHPOffice/PhpSpreadsheet/pull/1282)
- Fix for issue by removing test code mistakenly left in [#1328](https://github.com/PHPOffice/PhpSpreadsheet/pull/1328)
- Fix for Xls writer wrong selected cells and active sheet [#1256](https://github.com/PHPOffice/PhpSpreadsheet/pull/1256)
- Fix active cell when freeze pane is used [#1323](https://github.com/PHPOffice/PhpSpreadsheet/pull/1323)

## [1.10.1] - 2019-12-02

Expand Down
2 changes: 0 additions & 2 deletions src/PhpSpreadsheet/Writer/Xlsx/Worksheet.php
Original file line number Diff line number Diff line change
Expand Up @@ -262,8 +262,6 @@ private function writeSheetViews(XMLWriter $objWriter, PhpspreadsheetWorksheet $
--$ySplit;

$topLeftCell = $pSheet->getTopLeftCell();
$activeCell = $topLeftCell;
$sqref = $topLeftCell;

// pane
$pane = 'topRight';
Expand Down
69 changes: 60 additions & 9 deletions tests/PhpSpreadsheetTests/Functional/FreezePaneTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -38,15 +38,8 @@ public function testFreezePane($format)
self::assertSame($topLeftCell, $actualTopLeftCell, 'should be able to set the top left cell');
}

public function providerFormatsInvalidSelectedCells()
{
return [
['Xlsx'],
];
}

/**
* @dataProvider providerFormatsInvalidSelectedCells
* @dataProvider providerFormats
*
* @param string $format
*/
Expand All @@ -70,6 +63,64 @@ public function testFreezePaneWithInvalidSelectedCells($format)

self::assertSame($cellSplit, $actualCellSplit, 'should be able to set freeze pane');
self::assertSame($topLeftCell, $actualTopLeftCell, 'should be able to set the top left cell');
self::assertSame('A24', $reloadedActive->getSelectedCells(), 'selected cell should default to be first cell after the freeze pane');
self::assertSame('F5', $reloadedActive->getSelectedCells());
}

/**
* @dataProvider providerFormats
*
* @param string $format
*/
public function testFreezePaneUserSelectedCell($format)
{
$spreadsheet = new Spreadsheet();
$worksheet = $spreadsheet->getActiveSheet();
$worksheet->setCellValue('A1', 'Header1');
$worksheet->setCellValue('B1', 'Header2');
$worksheet->setCellValue('C1', 'Header3');
$worksheet->setCellValue('A2', 'Data1');
$worksheet->setCellValue('B2', 'Data2');
$worksheet->setCellValue('C2', 'Data3');
$worksheet->setCellValue('A3', 'Data4');
$worksheet->setCellValue('B3', 'Data5');
$worksheet->setCellValue('C3', 'Data6');
$worksheet->freezePane('A2');
$worksheet->setSelectedCells('C3');

$reloadedSpreadsheet = $this->writeAndReload($spreadsheet, $format);
// Read written file
$reloadedActive = $reloadedSpreadsheet->getActiveSheet();

$expected = 'C3';
self::assertSame($expected, $reloadedActive->getSelectedCells());
}

/**
* @dataProvider providerFormats
*
* @param string $format
*/
public function testNoFreezePaneUserSelectedCell($format)
{
$spreadsheet = new Spreadsheet();
$worksheet = $spreadsheet->getActiveSheet();
$worksheet->setCellValue('A1', 'Header1');
$worksheet->setCellValue('B1', 'Header2');
$worksheet->setCellValue('C1', 'Header3');
$worksheet->setCellValue('A2', 'Data1');
$worksheet->setCellValue('B2', 'Data2');
$worksheet->setCellValue('C2', 'Data3');
$worksheet->setCellValue('A3', 'Data4');
$worksheet->setCellValue('B3', 'Data5');
$worksheet->setCellValue('C3', 'Data6');
//$worksheet->freezePane('A2');
$worksheet->setSelectedCells('C3');

$reloadedSpreadsheet = $this->writeAndReload($spreadsheet, $format);
// Read written file
$reloadedActive = $reloadedSpreadsheet->getActiveSheet();

$expected = 'C3';
self::assertSame($expected, $reloadedActive->getSelectedCells());
}
}

0 comments on commit 6c8bbae

Please sign in to comment.