Skip to content

Commit

Permalink
Properly set selected cells for frozen panes.
Browse files Browse the repository at this point in the history
Fix for issue PHPOffice#532.  Properly set the selected
cells for worksheets with frozen panes when writing Xlsx documents.
Beforehand, the saved Xlsx documents were generating corruption warnings
when opened in Excel.
  • Loading branch information
billblume committed Jun 6, 2018
1 parent 50dc5b8 commit c4ad550
Show file tree
Hide file tree
Showing 3 changed files with 54 additions and 1 deletion.
1 change: 1 addition & 0 deletions CHANGELOG.md
Expand Up @@ -20,6 +20,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
- `Helper\Html` support UTF-8 HTML input - [#444](https://github.com/PHPOffice/PhpSpreadsheet/issues/444)
- Xlsx loaded an extra empty comment for each real comment - [#375](https://github.com/PHPOffice/PhpSpreadsheet/issues/375)
- Xlsx reader do not read rows and columns filtered out in readFilter at all - [#370](https://github.com/PHPOffice/PhpSpreadsheet/issues/370)
- Corruption errors for saved Xlsx docs with frozen panes [#532](https://github.com/PHPOffice/PhpSpreadsheet/issues/532)

## [1.2.1] - 2018-04-10

Expand Down
4 changes: 3 additions & 1 deletion src/PhpSpreadsheet/Writer/Xlsx/Worksheet.php
Expand Up @@ -246,6 +246,7 @@ private function writeSheetViews(XMLWriter $objWriter, PhpspreadsheetWorksheet $
}

$activeCell = $pSheet->getActiveCell();
$sqref = $pSheet->getSelectedCells();

// Pane
$pane = '';
Expand All @@ -257,6 +258,7 @@ private function writeSheetViews(XMLWriter $objWriter, PhpspreadsheetWorksheet $

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

// pane
$pane = 'topRight';
Expand Down Expand Up @@ -292,7 +294,7 @@ private function writeSheetViews(XMLWriter $objWriter, PhpspreadsheetWorksheet $
$objWriter->writeAttribute('pane', $pane);
}
$objWriter->writeAttribute('activeCell', $activeCell);
$objWriter->writeAttribute('sqref', $pSheet->getSelectedCells());
$objWriter->writeAttribute('sqref', $sqref);
$objWriter->endElement();

$objWriter->endElement();
Expand Down
50 changes: 50 additions & 0 deletions tests/PhpSpreadsheetTests/Writer/Xlsx/WorksheetTest.php
@@ -0,0 +1,50 @@
<?php

namespace PhpOffice\PhpSpreadsheetTests\Writer\Xlsx;

use PhpOffice\PhpSpreadsheet\Settings;
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PHPUnit\Framework\TestCase;
use ZipArchive;

class WorksheetTest extends TestCase
{
public function testFrozenPaneSelection()
{
// Create a dummy workbook with two worksheets
$workbook = new Spreadsheet();
$worksheet = $workbook->getActiveSheet();
$worksheet->freezePane('A7', 'A24');
$worksheet->setSelectedCells('F5');

Settings::setLibXmlLoaderOptions(null); // reset to default options

$resultFilename = tempnam(sys_get_temp_dir(), 'xlsx');
$writer = new \PhpOffice\PhpSpreadsheet\Writer\Xlsx($workbook);
$writer->save($resultFilename);

try {
$this->assertFileExists($resultFilename);

$resultZip = new ZipArchive();
$resultZip->open($resultFilename);
$worksheetXmlStr = $resultZip->getFromName('xl/worksheets/sheet1.xml');
$worksheetXml = simplexml_load_string($worksheetXmlStr);
$this->assertInstanceOf('SimpleXMLElement', $worksheetXml);
$sheetViewEl = $worksheetXml->sheetViews->sheetView;

$paneEl = $sheetViewEl->pane;
$this->assertEquals('6', (string) $paneEl['ySplit']);
$this->assertEquals('A24', (string) $paneEl['topLeftCell']);
$this->assertEquals('bottomLeft', (string) $paneEl['activePane']);
$this->assertEquals('frozen', (string) $paneEl['state']);

$selectionEl = $sheetViewEl->selection;
$this->assertEquals('bottomLeft', (string) $selectionEl['pane']);
$this->assertEquals('A24', (string) $selectionEl['activeCell']);
$this->assertEquals('A24', (string) $selectionEl['sqref']);
} finally {
unlink($resultFilename);
}
}
}

0 comments on commit c4ad550

Please sign in to comment.