Skip to content

Commit 64b02b0

Browse files
authored
Merge pull request #4114 from oleibman/issue4112
Addsheet May Leave Active Sheet Uninitialized
2 parents b406367 + 459f442 commit 64b02b0

File tree

5 files changed

+79
-2
lines changed

5 files changed

+79
-2
lines changed

CHANGELOG.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ and this project adheres to [Semantic Versioning](https://semver.org).
2525

2626
### Fixed
2727

28-
- Nothing
28+
- Add Sheet may leave Active Sheet uninitialized. [Issue #4112](https://github.com/PHPOffice/PhpSpreadsheet/issues/4112) [PR #4114](https://github.com/PHPOffice/PhpSpreadsheet/pull/4114)
2929

3030
## 2024-07-24 - 2.2.0
3131

src/PhpSpreadsheet/Spreadsheet.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -558,6 +558,9 @@ public function addSheet(Worksheet $worksheet, ?int $sheetIndex = null): Workshe
558558
if ($this->activeSheetIndex >= $sheetIndex) {
559559
++$this->activeSheetIndex;
560560
}
561+
if ($this->activeSheetIndex < 0) {
562+
$this->activeSheetIndex = 0;
563+
}
561564
}
562565

563566
if ($worksheet->getParent() === null) {

src/PhpSpreadsheet/Worksheet/Worksheet.php

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3684,7 +3684,9 @@ public function applyStylesFromArray(string $coordinate, array $styleArray): boo
36843684
$originalSelected = $this->selectedCells;
36853685
$this->getStyle($coordinate)->applyFromArray($styleArray);
36863686
$this->selectedCells = $originalSelected;
3687-
$spreadsheet->setActiveSheetIndex($activeSheetIndex);
3687+
if ($activeSheetIndex >= 0) {
3688+
$spreadsheet->setActiveSheetIndex($activeSheetIndex);
3689+
}
36883690

36893691
return true;
36903692
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace PhpOffice\PhpSpreadsheetTests\Worksheet;
6+
7+
use PhpOffice\PhpSpreadsheet\Spreadsheet;
8+
use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet;
9+
use PhpOffice\PhpSpreadsheetTests\Functional\AbstractFunctional;
10+
11+
class Issue4112Test extends AbstractFunctional
12+
{
13+
/**
14+
* Problem deleting all sheets then adding one.
15+
*
16+
* @dataProvider providerSheetNumber
17+
*/
18+
public function testIssue4112(?int $sheetNumber): void
19+
{
20+
$mySpreadsheet = new Spreadsheet();
21+
$mySpreadsheet->removeSheetByIndex(0);
22+
$worksheet = new Worksheet($mySpreadsheet, 'addedsheet');
23+
self::assertSame(-1, $mySpreadsheet->getActiveSheetIndex());
24+
$mySpreadsheet->addSheet($worksheet, $sheetNumber);
25+
self::assertSame('addedsheet', $mySpreadsheet->getActiveSheet()->getTitle());
26+
$row = 1;
27+
$col = 1;
28+
$worksheet->getCell([$col, $row])->setValue('id_uti');
29+
self::assertSame('id_uti', $worksheet->getCell([$col, $row])->getValue());
30+
$mySpreadsheet->disconnectWorksheets();
31+
}
32+
33+
public static function providerSheetNumber(): array
34+
{
35+
return [
36+
'problem case' => [0],
37+
'normal case' => [null],
38+
'negative 1 (as if there were no sheets)' => [-1],
39+
'diffeent negative number' => [-4],
40+
'positive number' => [4],
41+
];
42+
}
43+
}

tests/PhpSpreadsheetTests/Writer/Xls/XlsGifBmpTest.php

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
use PhpOffice\PhpSpreadsheet\Spreadsheet;
1010
use PhpOffice\PhpSpreadsheet\Worksheet\Drawing;
1111
use PhpOffice\PhpSpreadsheet\Worksheet\MemoryDrawing;
12+
use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet;
1213
use PhpOffice\PhpSpreadsheetTests\Functional\AbstractFunctional;
1314

1415
class XlsGifBmpTest extends AbstractFunctional
@@ -83,6 +84,34 @@ public function testGif(): void
8384
$reloadedSpreadsheet->disconnectWorksheets();
8485
}
8586

87+
public function testGifIssue4112(): void
88+
{
89+
$spreadsheet = new Spreadsheet();
90+
$spreadsheet->removeSheetByIndex(0);
91+
$sheet = new Worksheet($spreadsheet, 'Insured List');
92+
$spreadsheet->addSheet($sheet, 0);
93+
94+
// Add a drawing to the worksheet
95+
$drawing = new Drawing();
96+
$drawing->setName('Letters G, I, and G');
97+
$drawing->setDescription('Handwritten G, I, and F');
98+
$drawing->setPath(__DIR__ . '/../../../../samples/images/gif.gif');
99+
$drawing->setHeight(36);
100+
$drawing->setWorksheet($sheet);
101+
$drawing->setCoordinates('A1');
102+
103+
$reloadedSpreadsheet = $this->writeAndReload($spreadsheet, 'Xls');
104+
$spreadsheet->disconnectWorksheets();
105+
$worksheet = $reloadedSpreadsheet->getActiveSheet();
106+
$drawings = $worksheet->getDrawingCollection();
107+
self::assertCount(1, $drawings);
108+
foreach ($worksheet->getDrawingCollection() as $drawing) {
109+
$mimeType = ($drawing instanceof MemoryDrawing) ? $drawing->getMimeType() : 'notmemorydrawing';
110+
self::assertEquals('image/png', $mimeType);
111+
}
112+
$reloadedSpreadsheet->disconnectWorksheets();
113+
}
114+
86115
public function testInvalidTimestamp(): void
87116
{
88117
$this->expectException(ReaderException::class);

0 commit comments

Comments
 (0)