Skip to content

Commit 1991cd6

Browse files
committed
Fix for Xls BIFF Window2 record structure where selected and active sheets are stored.
Added some tests for active sheet and selected cells in Xls.
1 parent b711923 commit 1991cd6

File tree

3 files changed

+127
-3
lines changed

3 files changed

+127
-3
lines changed

src/PhpSpreadsheet/Writer/Xls/Worksheet.php

+2-3
Original file line numberDiff line numberDiff line change
@@ -1260,7 +1260,6 @@ private function writeWindow2()
12601260
$fFrozenNoSplit = 0; // 0 - bit
12611261
// no support in PhpSpreadsheet for selected sheet, therefore sheet is only selected if it is the active sheet
12621262
$fSelected = ($this->phpSheet === $this->phpSheet->getParent()->getActiveSheet()) ? 1 : 0;
1263-
$fPaged = 1; // 2
12641263
$fPageBreakPreview = $this->phpSheet->getSheetView()->getView() === SheetView::SHEETVIEW_PAGE_BREAK_PREVIEW;
12651264

12661265
$grbit = $fDspFmla;
@@ -1272,8 +1271,8 @@ private function writeWindow2()
12721271
$grbit |= $fArabic << 6;
12731272
$grbit |= $fDspGuts << 7;
12741273
$grbit |= $fFrozenNoSplit << 8;
1275-
$grbit |= $fSelected << 9;
1276-
$grbit |= $fPaged << 10;
1274+
$grbit |= $fSelected << 9; // Selected sheets.
1275+
$grbit |= $fSelected << 10; // Active sheet.
12771276
$grbit |= $fPageBreakPreview << 11;
12781277

12791278
$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)