Skip to content

Commit 4969d9d

Browse files
jimmy4o4PowerKiKi
authored andcommitted
Fix for Xls writer wrong selected cells and active sheet
1 parent cb18163 commit 4969d9d

File tree

4 files changed

+143
-3
lines changed

4 files changed

+143
-3
lines changed

CHANGELOG.md

+6
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,19 @@ and this project adheres to [Semantic Versioning](https://semver.org).
77

88
## [Unreleased]
99

10+
### Added
11+
1012
- Added support for the BASE function
1113
- Added support for the ARABIC function
1214
- Conditionals - Extend Support for (NOT)CONTAINSBLANKS [#1278](https://github.com/PHPOffice/PhpSpreadsheet/pull/1278)
15+
16+
### Fixed
17+
1318
- Handle Error in Formula Processing Better for Xls [#1267](https://github.com/PHPOffice/PhpSpreadsheet/pull/1267)
1419
- Handle ConditionalStyle NumberFormat When Reading Xlsx File [#1296](https://github.com/PHPOffice/PhpSpreadsheet/pull/1296)
1520
- Fix Xlsx Writer's handling of decimal commas [#1282](https://github.com/PHPOffice/PhpSpreadsheet/pull/1282)
1621
- Fix for issue by removing test code mistakenly left in [#1328](https://github.com/PHPOffice/PhpSpreadsheet/pull/1328)
22+
- Fix for Xls writer wrong selected cells and active sheet [#1256](https://github.com/PHPOffice/PhpSpreadsheet/pull/1256)
1723

1824
## [1.10.1] - 2019-12-02
1925

src/PhpSpreadsheet/Writer/Xls/Worksheet.php

+12-3
Original file line numberDiff line numberDiff line change
@@ -281,6 +281,10 @@ public function close()
281281
{
282282
$phpSheet = $this->phpSheet;
283283

284+
// Storing selected cells and active sheet because it changes while parsing cells with formulas.
285+
$selectedCells = $this->phpSheet->getSelectedCells();
286+
$activeSheetIndex = $this->phpSheet->getParent()->getActiveSheetIndex();
287+
284288
// Write BOF record
285289
$this->storeBof(0x0010);
286290

@@ -481,6 +485,9 @@ public function close()
481485
// Append
482486
$this->writeMsoDrawing();
483487

488+
// Restoring active sheet.
489+
$this->phpSheet->getParent()->setActiveSheetIndex($activeSheetIndex);
490+
484491
// Write WINDOW2 record
485492
$this->writeWindow2();
486493

@@ -493,6 +500,9 @@ public function close()
493500
$this->writePanes();
494501
}
495502

503+
// Restoring selected cells.
504+
$this->phpSheet->setSelectedCells($selectedCells);
505+
496506
// Write SELECTION record
497507
$this->writeSelection();
498508

@@ -1250,7 +1260,6 @@ private function writeWindow2()
12501260
$fFrozenNoSplit = 0; // 0 - bit
12511261
// no support in PhpSpreadsheet for selected sheet, therefore sheet is only selected if it is the active sheet
12521262
$fSelected = ($this->phpSheet === $this->phpSheet->getParent()->getActiveSheet()) ? 1 : 0;
1253-
$fPaged = 1; // 2
12541263
$fPageBreakPreview = $this->phpSheet->getSheetView()->getView() === SheetView::SHEETVIEW_PAGE_BREAK_PREVIEW;
12551264

12561265
$grbit = $fDspFmla;
@@ -1262,8 +1271,8 @@ private function writeWindow2()
12621271
$grbit |= $fArabic << 6;
12631272
$grbit |= $fDspGuts << 7;
12641273
$grbit |= $fFrozenNoSplit << 8;
1265-
$grbit |= $fSelected << 9;
1266-
$grbit |= $fPaged << 10;
1274+
$grbit |= $fSelected << 9; // Selected sheets.
1275+
$grbit |= $fSelected << 10; // Active sheet.
12671276
$grbit |= $fPageBreakPreview << 11;
12681277

12691278
$header = pack('vv', $record, $length);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
<?php
2+
3+
namespace PhpOffice\PhpSpreadsheetTests\Functional;
4+
5+
use PhpOffice\PhpSpreadsheet\Spreadsheet;
6+
7+
class ActiveSheetTest extends AbstractFunctional
8+
{
9+
public function providerFormats()
10+
{
11+
return [
12+
['Xls'],
13+
];
14+
}
15+
16+
/**
17+
* Test load file with correct active sheet.
18+
*
19+
* @dataProvider providerFormats
20+
*
21+
* @param string $format
22+
*/
23+
public function testActiveSheet($format)
24+
{
25+
$spreadsheet = new Spreadsheet();
26+
27+
$spreadsheet->setActiveSheetIndex(0)
28+
->setTitle('Test1')
29+
->setCellValue('D1', 1)
30+
->setCellValue('D2', 2)
31+
->setCellValue('D3', 3)
32+
->setCellValue('D4', 4)
33+
->setCellValue('D5', '=SUM(D1:D4)')
34+
->setSelectedCell('B2');
35+
36+
$spreadsheet->createSheet(1);
37+
38+
$spreadsheet->setActiveSheetIndex(1)
39+
->setTitle('Test2')
40+
->setCellValue('D1', 4)
41+
->setCellValue('E1', 3)
42+
->setCellValue('F1', 2)
43+
->setCellValue('G1', 1)
44+
->setCellValue('H1', '=SUM(D1:G4)')
45+
->setSelectedCells('A1:B2');
46+
47+
$spreadsheet->createSheet(2);
48+
49+
$spreadsheet->setActiveSheetIndex(2)
50+
->setTitle('Test3')
51+
->setCellValue('A1', 4)
52+
->setCellValue('B1', 3)
53+
->setCellValue('C1', 2)
54+
->setCellValue('D1', 1)
55+
->setCellValue('E1', '=SUM(A1:D4)')
56+
->setSelectedCells('A1:D1');
57+
58+
$spreadsheet->setActiveSheetIndex(1);
59+
60+
$reloadedSpreadsheet = $this->writeAndReload($spreadsheet, $format);
61+
62+
// Original object.
63+
self::assertSame(1, $spreadsheet->getActiveSheetIndex());
64+
65+
// Saved and reloaded file.
66+
self::assertSame(1, $reloadedSpreadsheet->getActiveSheetIndex());
67+
}
68+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
<?php
2+
3+
namespace PhpOffice\PhpSpreadsheetTests\Functional;
4+
5+
use PhpOffice\PhpSpreadsheet\Spreadsheet;
6+
7+
class SelectedCellsTest extends AbstractFunctional
8+
{
9+
public function providerFormats()
10+
{
11+
return [
12+
['Xls'],
13+
];
14+
}
15+
16+
/**
17+
* Test load file with correct selected cells.
18+
*
19+
* @dataProvider providerFormats
20+
*
21+
* @param string $format
22+
*/
23+
public function testSelectedCells($format)
24+
{
25+
$spreadsheet = new Spreadsheet();
26+
27+
$spreadsheet->setActiveSheetIndex(0)
28+
->setTitle('Test1')
29+
->setCellValue('D1', 1)
30+
->setCellValue('D2', 2)
31+
->setCellValue('D3', 3)
32+
->setCellValue('D4', 4)
33+
->setCellValue('D5', '=SUM(D1:D4)')
34+
->setSelectedCell('B2');
35+
36+
$spreadsheet->createSheet(1);
37+
38+
$spreadsheet->setActiveSheetIndex(1)
39+
->setTitle('Test2')
40+
->setCellValue('D1', 4)
41+
->setCellValue('E1', 3)
42+
->setCellValue('F1', 2)
43+
->setCellValue('G1', 1)
44+
->setCellValue('H1', '=SUM(D1:G4)')
45+
->setSelectedCells('A1:B2');
46+
47+
$reloadedSpreadsheet = $this->writeAndReload($spreadsheet, $format);
48+
49+
// Original object.
50+
self::assertSame('B2', $spreadsheet->setActiveSheetIndex(0)->getSelectedCells());
51+
self::assertSame('A1:B2', $spreadsheet->setActiveSheetIndex(1)->getSelectedCells());
52+
53+
// Saved and reloaded file.
54+
self::assertSame('B2', $reloadedSpreadsheet->setActiveSheetIndex(0)->getSelectedCells());
55+
self::assertSame('A1:B2', $reloadedSpreadsheet->setActiveSheetIndex(1)->getSelectedCells());
56+
}
57+
}

0 commit comments

Comments
 (0)