|
2 | 2 |
|
3 | 3 | namespace PhpOffice\PhpSpreadsheetTests;
|
4 | 4 |
|
| 5 | +use PhpOffice\PhpSpreadsheet\Calculation\Calculation; |
5 | 6 | use PhpOffice\PhpSpreadsheet\Cell\DataType;
|
6 | 7 | use PhpOffice\PhpSpreadsheet\Cell\Hyperlink;
|
7 | 8 | use PhpOffice\PhpSpreadsheet\Comment;
|
| 9 | +use PhpOffice\PhpSpreadsheet\NamedFormula; |
| 10 | +use PhpOffice\PhpSpreadsheet\NamedRange; |
8 | 11 | use PhpOffice\PhpSpreadsheet\ReferenceHelper;
|
9 | 12 | use PhpOffice\PhpSpreadsheet\Spreadsheet;
|
10 | 13 | use PhpOffice\PhpSpreadsheet\Style\ConditionalFormatting\Wizard;
|
@@ -538,4 +541,110 @@ public function testDeleteColumnsWithPrintArea(): void
|
538 | 541 | $printArea = $sheet->getPageSetup()->getPrintArea();
|
539 | 542 | self::assertSame('A1:H10', $printArea);
|
540 | 543 | }
|
| 544 | + |
| 545 | + public function testInsertRowsWithDefinedNames(): void |
| 546 | + { |
| 547 | + $spreadsheet = $this->buildDefinedNamesTestWorkbook(); |
| 548 | + /** @var Worksheet $dataSheet */ |
| 549 | + $dataSheet = $spreadsheet->getSheetByName('Data'); |
| 550 | + /** @var Worksheet $totalsSheet */ |
| 551 | + $totalsSheet = $spreadsheet->getSheetByName('Totals'); |
| 552 | + |
| 553 | + $dataSheet->insertNewRowBefore(4, 2); |
| 554 | + Calculation::getInstance($spreadsheet)->flushInstance(); |
| 555 | + |
| 556 | + /** @var NamedRange $firstColumn */ |
| 557 | + $firstColumn = $spreadsheet->getNamedRange('FirstColumn'); |
| 558 | + /** @var NamedRange $secondColumn */ |
| 559 | + $secondColumn = $spreadsheet->getNamedRange('SecondColumn'); |
| 560 | + |
| 561 | + self::assertSame('=Data!$A$2:$A8', $firstColumn->getRange()); |
| 562 | + self::assertSame('=Data!B$2:B8', $secondColumn->getRange()); |
| 563 | + self::assertSame(30, $totalsSheet->getCell('A20')->getCalculatedValue()); |
| 564 | + self::assertSame(25, $totalsSheet->getCell('B20')->getCalculatedValue()); |
| 565 | + self::assertSame(750, $totalsSheet->getCell('D20')->getCalculatedValue()); |
| 566 | + } |
| 567 | + |
| 568 | + public function testInsertColumnsWithDefinedNames(): void |
| 569 | + { |
| 570 | + $spreadsheet = $this->buildDefinedNamesTestWorkbook(); |
| 571 | + /** @var Worksheet $dataSheet */ |
| 572 | + $dataSheet = $spreadsheet->getSheetByName('Data'); |
| 573 | + /** @var Worksheet $totalsSheet */ |
| 574 | + $totalsSheet = $spreadsheet->getSheetByName('Totals'); |
| 575 | + |
| 576 | + $dataSheet->insertNewColumnBefore('B', 2); |
| 577 | + Calculation::getInstance($spreadsheet)->flushInstance(); |
| 578 | + |
| 579 | + /** @var NamedRange $firstColumn */ |
| 580 | + $firstColumn = $spreadsheet->getNamedRange('FirstColumn'); |
| 581 | + /** @var NamedRange $secondColumn */ |
| 582 | + $secondColumn = $spreadsheet->getNamedRange('SecondColumn'); |
| 583 | + |
| 584 | + self::assertSame('=Data!$A$2:$A6', $firstColumn->getRange()); |
| 585 | + self::assertSame('=Data!D$2:D6', $secondColumn->getRange()); |
| 586 | + self::assertSame(30, $totalsSheet->getCell('A20')->getCalculatedValue()); |
| 587 | + self::assertSame(25, $totalsSheet->getCell('B20')->getCalculatedValue()); |
| 588 | + self::assertSame(750, $totalsSheet->getCell('D20')->getCalculatedValue()); |
| 589 | + } |
| 590 | + |
| 591 | + public function testDeleteRowsWithDefinedNames(): void |
| 592 | + { |
| 593 | + $spreadsheet = $this->buildDefinedNamesTestWorkbook(); |
| 594 | + /** @var Worksheet $dataSheet */ |
| 595 | + $dataSheet = $spreadsheet->getSheetByName('Data'); |
| 596 | + /** @var Worksheet $totalsSheet */ |
| 597 | + $totalsSheet = $spreadsheet->getSheetByName('Totals'); |
| 598 | + |
| 599 | + $dataSheet->removeRow(3, 2); |
| 600 | + Calculation::getInstance($spreadsheet)->flushInstance(); |
| 601 | + |
| 602 | + /** @var NamedRange $firstColumn */ |
| 603 | + $firstColumn = $spreadsheet->getNamedRange('FirstColumn'); |
| 604 | + /** @var NamedRange $secondColumn */ |
| 605 | + $secondColumn = $spreadsheet->getNamedRange('SecondColumn'); |
| 606 | + |
| 607 | + self::assertSame('=Data!$A$2:$A4', $firstColumn->getRange()); |
| 608 | + self::assertSame('=Data!B$2:B4', $secondColumn->getRange()); |
| 609 | + self::assertSame(20, $totalsSheet->getCell('A20')->getCalculatedValue()); |
| 610 | + self::assertSame(17, $totalsSheet->getCell('B20')->getCalculatedValue()); |
| 611 | + self::assertSame(340, $totalsSheet->getCell('D20')->getCalculatedValue()); |
| 612 | + } |
| 613 | + |
| 614 | + private function buildDefinedNamesTestWorkbook(): Spreadsheet |
| 615 | + { |
| 616 | + $spreadsheet = new Spreadsheet(); |
| 617 | + $dataSheet = $spreadsheet->getActiveSheet(); |
| 618 | + $dataSheet->setTitle('Data'); |
| 619 | + |
| 620 | + $totalsSheet = $spreadsheet->addSheet(new Worksheet()); |
| 621 | + $totalsSheet->setTitle('Totals'); |
| 622 | + |
| 623 | + $spreadsheet->setActiveSheetIndexByName('Data'); |
| 624 | + |
| 625 | + $dataSheet->fromArray([['Column 1', 'Column 2'], [2, 1], [4, 3], [6, 5], [8, 7], [10, 9]], null, 'A1', true); |
| 626 | + |
| 627 | + $spreadsheet->addNamedRange( |
| 628 | + new NamedRange('FirstColumn', $spreadsheet->getActiveSheet(), '=Data!$A$2:$A6') |
| 629 | + ); |
| 630 | + $spreadsheet->addNamedFormula( |
| 631 | + new NamedFormula('FirstTotal', $spreadsheet->getActiveSheet(), '=SUM(FirstColumn)') |
| 632 | + ); |
| 633 | + $totalsSheet->setCellValue('A20', '=FirstTotal'); |
| 634 | + |
| 635 | + $spreadsheet->addNamedRange( |
| 636 | + new NamedRange('SecondColumn', $spreadsheet->getActiveSheet(), '=Data!B$2:B6') |
| 637 | + ); |
| 638 | + $spreadsheet->addNamedFormula( |
| 639 | + new NamedFormula('SecondTotal', $spreadsheet->getActiveSheet(), '=SUM(SecondColumn)') |
| 640 | + ); |
| 641 | + $totalsSheet->setCellValue('B20', '=SecondTotal'); |
| 642 | + |
| 643 | + $spreadsheet->addNamedFormula( |
| 644 | + new NamedFormula('ProductTotal', $spreadsheet->getActiveSheet(), '=FirstTotal*SecondTotal') |
| 645 | + ); |
| 646 | + $totalsSheet->setCellValue('D20', '=ProductTotal'); |
| 647 | + |
| 648 | + return $spreadsheet; |
| 649 | + } |
541 | 650 | }
|
0 commit comments