1
|
|
|
<?php |
2
|
|
|
|
3
|
|
|
declare(strict_types=1); |
4
|
|
|
|
5
|
|
|
namespace PhpOffice\PhpSpreadsheetTests\Worksheet; |
6
|
|
|
|
7
|
|
|
use PhpOffice\PhpSpreadsheet\Spreadsheet; |
8
|
|
|
use PHPUnit\Framework\TestCase; |
9
|
|
|
|
10
|
|
|
class Issue641Test extends TestCase |
11
|
|
|
{ |
12
|
|
|
/** |
13
|
|
|
* Problem cloning sheet referred to in formulas. |
14
|
|
|
*/ |
15
|
|
|
public function testIssue641(): void |
16
|
|
|
{ |
17
|
|
|
$xlsx = new Spreadsheet(); |
18
|
|
|
$xlsx->removeSheetByIndex(0); |
19
|
|
|
$availableWs = []; |
20
|
|
|
|
21
|
|
|
$worksheet = $xlsx->createSheet(); |
22
|
|
|
$worksheet->setTitle('Condensed A'); |
23
|
|
|
$worksheet->getCell('A1')->setValue("=SUM('Detailed A'!A1:A10)"); |
24
|
|
|
$worksheet->getCell('A2')->setValue(mt_rand(1, 30)); |
25
|
|
|
$availableWs[] = 'Condensed A'; |
26
|
|
|
|
27
|
|
|
$worksheet = $xlsx->createSheet(); |
28
|
|
|
$worksheet->setTitle('Condensed B'); |
29
|
|
|
$worksheet->getCell('A1')->setValue("=SUM('Detailed B'!A1:A10)"); |
30
|
|
|
$worksheet->getCell('A2')->setValue(mt_rand(1, 30)); |
31
|
|
|
$availableWs[] = 'Condensed B'; |
32
|
|
|
|
33
|
|
|
// at this point the value in worksheet 'Condensed B' cell A1 is |
34
|
|
|
// =SUM('Detailed B'!A1:A10) |
35
|
|
|
|
36
|
|
|
// worksheet in question is cloned and totals are attached |
37
|
|
|
$totalWs1 = clone $xlsx->getSheet($xlsx->getSheetCount() - 1); |
38
|
|
|
$totalWs1->setTitle('Condensed Total'); |
39
|
|
|
$xlsx->addSheet($totalWs1); |
40
|
|
|
$formula = '='; |
41
|
|
|
foreach ($availableWs as $ws) { |
42
|
|
|
$formula .= sprintf("+'%s'!A2", $ws); |
43
|
|
|
} |
44
|
|
|
$totalWs1->getCell('A1')->setValue("=SUM('Detailed Total'!A1:A10)"); |
45
|
|
|
$totalWs1->getCell('A2')->setValue($formula); |
46
|
|
|
|
47
|
|
|
$availableWs = []; |
48
|
|
|
|
49
|
|
|
$worksheet = $xlsx->createSheet(); |
50
|
|
|
$worksheet->setTitle('Detailed A'); |
51
|
|
|
for ($step = 1; $step <= 10; ++$step) { |
52
|
|
|
$worksheet->getCell("A{$step}")->setValue(mt_rand(1, 30)); |
53
|
|
|
} |
54
|
|
|
$availableWs[] = 'Detailed A'; |
55
|
|
|
|
56
|
|
|
$worksheet = $xlsx->createSheet(); |
57
|
|
|
$worksheet->setTitle('Detailed B'); |
58
|
|
|
for ($step = 1; $step <= 10; ++$step) { |
59
|
|
|
$worksheet->getCell("A{$step}")->setValue(mt_rand(1, 30)); |
60
|
|
|
} |
61
|
|
|
$availableWs[] = 'Detailed B'; |
62
|
|
|
|
63
|
|
|
$totalWs2 = clone $xlsx->getSheet($xlsx->getSheetCount() - 1); |
64
|
|
|
$totalWs2->setTitle('Detailed Total'); |
65
|
|
|
$xlsx->addSheet($totalWs2); |
66
|
|
|
|
67
|
|
|
for ($step = 1; $step <= 10; ++$step) { |
68
|
|
|
$formula = '='; |
69
|
|
|
foreach ($availableWs as $ws) { |
70
|
|
|
$formula .= sprintf("+'%s'!A%s", $ws, $step); |
71
|
|
|
} |
72
|
|
|
$totalWs2->getCell("A{$step}")->setValue($formula); |
73
|
|
|
} |
74
|
|
|
|
75
|
|
|
self::assertSame("=SUM('Detailed A'!A1:A10)", $xlsx->getSheetByName('Condensed A')?->getCell('A1')?->getValue()); |
76
|
|
|
self::assertSame("=SUM('Detailed B'!A1:A10)", $xlsx->getSheetByName('Condensed B')?->getCell('A1')?->getValue()); |
77
|
|
|
self::assertSame("=SUM('Detailed Total'!A1:A10)", $xlsx->getSheetByName('Condensed Total')?->getCell('A1')?->getValue()); |
78
|
|
|
self::assertSame("=+'Detailed A'!A1+'Detailed B'!A1", $xlsx->getSheetByName('Detailed Total')?->getCell('A1')?->getValue()); |
79
|
|
|
|
80
|
|
|
$xlsx->disconnectWorksheets(); |
81
|
|
|
} |
82
|
|
|
} |
83
|
|
|
|