mirror of
https://github.com/PHPOffice/PhpSpreadsheet.git
synced 2026-08-31 04:28:51 +00:00
1388efb080
This PR will be merged at the end of this month. As the README says, we maintain support for Php Versions for six months beyond their end of life. That time has now arrived for 8.1.
115 lines
4.9 KiB
PHP
115 lines
4.9 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace PhpOffice\PhpSpreadsheetTests;
|
|
|
|
use PhpOffice\PhpSpreadsheet\Calculation\Calculation;
|
|
use PhpOffice\PhpSpreadsheet\NamedRange;
|
|
use PhpOffice\PhpSpreadsheet\Spreadsheet;
|
|
use PHPUnit\Framework\TestCase;
|
|
|
|
class ReferenceHelper3Test extends TestCase
|
|
{
|
|
public function testIssue3661(): void
|
|
{
|
|
$spreadsheet = new Spreadsheet();
|
|
$sheet = $spreadsheet->getActiveSheet();
|
|
$sheet->setTitle('Data');
|
|
|
|
$spreadsheet->addNamedRange(new NamedRange('FIRST', $sheet, '=$A1'));
|
|
$spreadsheet->addNamedRange(new NamedRange('SECOND', $sheet, '=$B1'));
|
|
$spreadsheet->addNamedRange(new NamedRange('THIRD', $sheet, '=$C1'));
|
|
|
|
$sheet->fromArray([
|
|
[1, 2, 3, '=FIRST', '=SECOND', '=THIRD', '=10*$A1'],
|
|
[4, 5, 6, '=FIRST', '=SECOND', '=THIRD'],
|
|
[7, 8, 9, '=FIRST', '=SECOND', '=THIRD'],
|
|
]);
|
|
|
|
$sheet->insertNewRowBefore(1, 4);
|
|
$sheet->insertNewColumnBefore('A', 1);
|
|
self::assertSame(1, $sheet->getCell('E5')->getCalculatedValue());
|
|
self::assertSame(5, $sheet->getCell('F6')->getCalculatedValue());
|
|
self::assertSame(9, $sheet->getCell('G7')->getCalculatedValue());
|
|
self::assertSame('=10*$B5', $sheet->getCell('H5')->getValue());
|
|
self::assertSame(10, $sheet->getCell('H5')->getCalculatedValue());
|
|
$firstColumn = $spreadsheet->getNamedRange('FIRST');
|
|
/** @var NamedRange $firstColumn */
|
|
self::assertSame('=$B1', $firstColumn->getRange());
|
|
$spreadsheet->disconnectWorksheets();
|
|
}
|
|
|
|
public function testCompletelyRelative(): void
|
|
{
|
|
$spreadsheet = new Spreadsheet();
|
|
$sheet = $spreadsheet->getActiveSheet();
|
|
$sheet->setTitle('Data');
|
|
|
|
$spreadsheet->addNamedRange(new NamedRange('CellAbove', $sheet, '=A1048576'));
|
|
$spreadsheet->addNamedRange(new NamedRange('CellBelow', $sheet, '=A2'));
|
|
$spreadsheet->addNamedRange(new NamedRange('CellToLeft', $sheet, '=XFD1'));
|
|
$spreadsheet->addNamedRange(new NamedRange('CellToRight', $sheet, '=B1'));
|
|
|
|
$sheet->fromArray([
|
|
[null, 'Above', null, null, 'Above', null, null, 'Above', null, null, 'Above', null],
|
|
['Left', '=CellAbove', 'Right', 'Left', '=CellBelow', 'Right', 'Left', '=CellToLeft', 'Right', 'Left', '=CellToRight', 'Right'],
|
|
[null, 'Below', null, null, 'Below', null, null, 'Below', null, null, 'Below', null],
|
|
], null, 'A1', true);
|
|
self::assertSame('Above', $sheet->getCell('B2')->getCalculatedValue());
|
|
self::assertSame('Below', $sheet->getCell('E2')->getCalculatedValue());
|
|
self::assertSame('Left', $sheet->getCell('H2')->getCalculatedValue());
|
|
self::assertSame('Right', $sheet->getCell('K2')->getCalculatedValue());
|
|
|
|
Calculation::getInstance($spreadsheet)->flushInstance();
|
|
self::assertNull($sheet->getCell('L7')->getCalculatedValue(), 'value in L7 after flush is null');
|
|
// Reset it once more
|
|
Calculation::getInstance($spreadsheet)->flushInstance();
|
|
// shift 5 rows down and 1 column to the right
|
|
$sheet->insertNewRowBefore(1, 5);
|
|
$sheet->insertNewColumnBefore('A', 1);
|
|
|
|
self::assertSame('Above', $sheet->getCell('C7')->getCalculatedValue()); // Above
|
|
self::assertSame('Below', $sheet->getCell('F7')->getCalculatedValue());
|
|
self::assertSame('Left', $sheet->getCell('I7')->getCalculatedValue());
|
|
self::assertSame('Right', $sheet->getCell('L7')->getCalculatedValue());
|
|
|
|
$sheet2 = $spreadsheet->createSheet();
|
|
$sheet2->setCellValue('L6', 'NotThisCell');
|
|
$sheet2->setCellValue('L7', '=CellAbove');
|
|
self::assertSame('Above', $sheet2->getCell('L7')->getCalculatedValue(), 'relative value uses cell on worksheet where name is defined');
|
|
$spreadsheet->disconnectWorksheets();
|
|
}
|
|
|
|
protected static bool $sumFormulaWorking = false;
|
|
|
|
public function testSumAboveCell(): void
|
|
{
|
|
$spreadsheet = new Spreadsheet();
|
|
$sheet = $spreadsheet->getActiveSheet();
|
|
$spreadsheet->addNamedRange(new NamedRange('AboveCell', $sheet, 'A1048576'));
|
|
$sheet->setCellValue('C2', 123);
|
|
$sheet->setCellValue('C3', '=AboveCell');
|
|
$sheet->fromArray([
|
|
['Column 1', 'Column 2'],
|
|
[2, 1],
|
|
[4, 3],
|
|
[6, 5],
|
|
[8, 7],
|
|
[10, 9],
|
|
[12, 11],
|
|
[14, 13],
|
|
[16, 15],
|
|
['=SUM(A2:AboveCell)', '=SUM(B2:AboveCell)'],
|
|
], null, 'A1', true);
|
|
self::assertSame(123, $sheet->getCell('C3')->getCalculatedValue());
|
|
if (self::$sumFormulaWorking) {
|
|
self::assertSame(72, $sheet->getCell('A10')->getCalculatedValue());
|
|
} else {
|
|
$spreadsheet->disconnectWorksheets();
|
|
self::markTestIncomplete('PhpSpreadsheet does not handle this correctly');
|
|
}
|
|
$spreadsheet->disconnectWorksheets();
|
|
}
|
|
}
|