mirror of
https://github.com/PHPOffice/PhpSpreadsheet.git
synced 2026-09-24 17:19:29 +00:00
Merge branch 'master' into #984
This commit is contained in:
@@ -0,0 +1,51 @@
|
||||
<?php
|
||||
|
||||
namespace PhpOffice\PhpSpreadsheetTests\Calculation\Functions\LookupRef;
|
||||
|
||||
use PhpOffice\PhpSpreadsheet\Calculation\Functions;
|
||||
use PhpOffice\PhpSpreadsheet\Calculation\LookupRef;
|
||||
use PhpOffice\PhpSpreadsheet\Cell\Cell;
|
||||
use PhpOffice\PhpSpreadsheet\Cell\Hyperlink;
|
||||
use PHPUnit\Framework\TestCase;
|
||||
|
||||
class HyperlinkTest extends TestCase
|
||||
{
|
||||
/**
|
||||
* @dataProvider providerHYPERLINK
|
||||
*
|
||||
* @param mixed $expectedResult
|
||||
* @param null|string $linkUrl
|
||||
* @param null|string $description
|
||||
*/
|
||||
public function testHYPERLINK($expectedResult, $linkUrl, $description): void
|
||||
{
|
||||
$hyperlink = new Hyperlink();
|
||||
|
||||
$cell = $this->getMockBuilder(Cell::class)
|
||||
->onlyMethods(['getHyperlink'])
|
||||
->disableOriginalConstructor()
|
||||
->getMock();
|
||||
$cell->method('getHyperlink')
|
||||
->willReturn($hyperlink);
|
||||
|
||||
$result = LookupRef::HYPERLINK($linkUrl, $description, $cell);
|
||||
if (!is_array($expectedResult)) {
|
||||
self::assertSame($expectedResult, $result);
|
||||
} else {
|
||||
self::assertSame($expectedResult[1], $result);
|
||||
self::assertSame($expectedResult[0], $hyperlink->getUrl());
|
||||
self::assertSame($expectedResult[1], $hyperlink->getTooltip());
|
||||
}
|
||||
}
|
||||
|
||||
public function providerHYPERLINK(): array
|
||||
{
|
||||
return require 'tests/data/Calculation/LookupRef/HYPERLINK.php';
|
||||
}
|
||||
|
||||
public function testHYPERLINKwithoutCell(): void
|
||||
{
|
||||
$result = LookupRef::HYPERLINK('https://phpspreadsheet.readthedocs.io/en/latest/', 'Read the Docs');
|
||||
self::assertSame(Functions::REF(), $result);
|
||||
}
|
||||
}
|
||||
@@ -26,4 +26,22 @@ class SumTest extends AllSetupTeardown
|
||||
{
|
||||
return require 'tests/data/Calculation/MathTrig/SUM.php';
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider providerSUMLiterals
|
||||
*
|
||||
* @param mixed $expectedResult
|
||||
*/
|
||||
public function testSUMLiterals($expectedResult, string $args): void
|
||||
{
|
||||
$sheet = $this->sheet;
|
||||
$sheet->getCell('B1')->setValue("=SUM($args)");
|
||||
$result = $sheet->getCell('B1')->getCalculatedValue();
|
||||
self::assertEqualsWithDelta($expectedResult, $result, 1E-12);
|
||||
}
|
||||
|
||||
public function providerSUMLiterals(): array
|
||||
{
|
||||
return require 'tests/data/Calculation/MathTrig/SUMLITERALS.php';
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,31 @@
|
||||
<?php
|
||||
|
||||
namespace PhpOffice\PhpSpreadsheetTests\Reader\Gnumeric;
|
||||
|
||||
use PhpOffice\PhpSpreadsheet\Reader\Gnumeric;
|
||||
use PhpOffice\PhpSpreadsheet\Spreadsheet;
|
||||
use PHPUnit\Framework\TestCase;
|
||||
|
||||
class AutoFilterTest extends TestCase
|
||||
{
|
||||
/**
|
||||
* @var Spreadsheet
|
||||
*/
|
||||
private $spreadsheet;
|
||||
|
||||
protected function setUp(): void
|
||||
{
|
||||
$filename = 'tests/data/Reader/Gnumeric/Autofilter_Basic.gnumeric';
|
||||
$reader = new Gnumeric();
|
||||
$this->spreadsheet = $reader->load($filename);
|
||||
}
|
||||
|
||||
public function testAutoFilterRange(): void
|
||||
{
|
||||
$worksheet = $this->spreadsheet->getActiveSheet();
|
||||
|
||||
$autoFilterRange = $worksheet->getAutoFilter()->getRange();
|
||||
|
||||
self::assertSame('A1:D57', $autoFilterRange);
|
||||
}
|
||||
}
|
||||
@@ -115,7 +115,8 @@ class GnumericLoadTest extends TestCase
|
||||
self::assertEquals(Font::UNDERLINE_DOUBLE, $sheet->getCell('A24')->getStyle()->getFont()->getUnderline());
|
||||
self::assertTrue($sheet->getCell('B23')->getStyle()->getFont()->getSubScript());
|
||||
self::assertTrue($sheet->getCell('B24')->getStyle()->getFont()->getSuperScript());
|
||||
self::assertFalse($sheet->getRowDimension(30)->getVisible());
|
||||
$rowDimension = $sheet->getRowDimension(30);
|
||||
self::assertFalse($rowDimension->getVisible());
|
||||
}
|
||||
|
||||
public function testLoadFilter(): void
|
||||
|
||||
@@ -0,0 +1,31 @@
|
||||
<?php
|
||||
|
||||
namespace PhpOffice\PhpSpreadsheetTests\Reader\Ods;
|
||||
|
||||
use PhpOffice\PhpSpreadsheet\Reader\Ods;
|
||||
use PhpOffice\PhpSpreadsheet\Spreadsheet;
|
||||
use PHPUnit\Framework\TestCase;
|
||||
|
||||
class AutoFilterTest extends TestCase
|
||||
{
|
||||
/**
|
||||
* @var Spreadsheet
|
||||
*/
|
||||
private $spreadsheet;
|
||||
|
||||
protected function setUp(): void
|
||||
{
|
||||
$filename = 'tests/data/Reader/Ods/AutoFilter.ods';
|
||||
$reader = new Ods();
|
||||
$this->spreadsheet = $reader->load($filename);
|
||||
}
|
||||
|
||||
public function testAutoFilterRange(): void
|
||||
{
|
||||
$worksheet = $this->spreadsheet->getActiveSheet();
|
||||
|
||||
$autoFilterRange = $worksheet->getAutoFilter()->getRange();
|
||||
|
||||
self::assertSame('A1:C9', $autoFilterRange);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,35 @@
|
||||
<?php
|
||||
|
||||
namespace PhpOffice\PhpSpreadsheetTests\Reader\Ods;
|
||||
|
||||
use PhpOffice\PhpSpreadsheet\Reader\Ods;
|
||||
use PhpOffice\PhpSpreadsheet\Spreadsheet;
|
||||
use PHPUnit\Framework\TestCase;
|
||||
|
||||
class DefinedNamesTest extends TestCase
|
||||
{
|
||||
/**
|
||||
* @var Spreadsheet
|
||||
*/
|
||||
private $spreadsheet;
|
||||
|
||||
protected function setUp(): void
|
||||
{
|
||||
$filename = 'tests/data/Reader/Ods/DefinedNames.ods';
|
||||
$reader = new Ods();
|
||||
$this->spreadsheet = $reader->load($filename);
|
||||
}
|
||||
|
||||
public function testDefinedNames(): void
|
||||
{
|
||||
$worksheet = $this->spreadsheet->getActiveSheet();
|
||||
|
||||
$firstDefinedNameValue = $worksheet->getCell('First')->getValue();
|
||||
$secondDefinedNameValue = $worksheet->getCell('Second')->getValue();
|
||||
$calculatedFormulaValue = $worksheet->getCell('B2')->getCalculatedValue();
|
||||
|
||||
self::assertSame(3, $firstDefinedNameValue);
|
||||
self::assertSame(4, $secondDefinedNameValue);
|
||||
self::assertSame(12, $calculatedFormulaValue);
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
<?php
|
||||
|
||||
namespace PhpOffice\PhpSpreadsheetTests\Reader;
|
||||
namespace PhpOffice\PhpSpreadsheetTests\Reader\Xlsx;
|
||||
|
||||
use PhpOffice\PhpSpreadsheet\IOFactory;
|
||||
use PHPUnit\Framework\TestCase;
|
||||
@@ -29,4 +29,15 @@ class DefaultFillTest extends TestCase
|
||||
self::assertSame('none', $sheet->getCell('J16')->getStyle()->getFill()->getFillType());
|
||||
self::assertSame('solid', $sheet->getCell('C2')->getStyle()->getFill()->getFillType());
|
||||
}
|
||||
|
||||
public function testDefaultConditionalFill(): void
|
||||
{
|
||||
// default fill pattern for a conditional style where the filltype is not defined
|
||||
$filename = 'tests/data/Reader/XLSX/pr2050cf-fill.xlsx';
|
||||
$reader = IOFactory::createReader('Xlsx');
|
||||
$spreadsheet = $reader->load($filename);
|
||||
|
||||
$style = $spreadsheet->getActiveSheet()->getConditionalStyles('A1')[0]->getStyle();
|
||||
self::assertSame('solid', $style->getFill()->getFillType());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,22 @@
|
||||
<?php
|
||||
|
||||
namespace PhpOffice\PhpSpreadsheetTests\Reader\Xlsx;
|
||||
|
||||
use PhpOffice\PhpSpreadsheet\IOFactory;
|
||||
use PHPUnit\Framework\TestCase;
|
||||
|
||||
class DefaultFontTest extends TestCase
|
||||
{
|
||||
public function testDefaultConditionalFont(): void
|
||||
{
|
||||
// default fill pattern for a conditional style where the filltype is not defined
|
||||
$filename = 'tests/data/Reader/XLSX/pr2050cf-fill.xlsx';
|
||||
$reader = IOFactory::createReader('Xlsx');
|
||||
$spreadsheet = $reader->load($filename);
|
||||
|
||||
$style = $spreadsheet->getActiveSheet()->getConditionalStyles('A1')[0]->getStyle();
|
||||
self::assertSame('9C0006', $style->getFont()->getColor()->getRGB());
|
||||
self::assertNull($style->getFont()->getName());
|
||||
self::assertNull($style->getFont()->getSize());
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,49 @@
|
||||
<?php
|
||||
|
||||
namespace PhpOffice\PhpSpreadsheetTests\Writer\Csv;
|
||||
|
||||
use PhpOffice\PhpSpreadsheet\Reader\Csv as CsvReader;
|
||||
use PhpOffice\PhpSpreadsheet\Shared\File;
|
||||
use PhpOffice\PhpSpreadsheet\Spreadsheet;
|
||||
use PhpOffice\PhpSpreadsheet\Writer\Csv as CsvWriter;
|
||||
use PhpOffice\PhpSpreadsheetTests\Functional;
|
||||
|
||||
class CsvExcelCompatibilityTest extends Functional\AbstractFunctional
|
||||
{
|
||||
// Excel seems to have changed with how they handle this.
|
||||
// In particular, it does not recognize UTF-8 non-ASCII characters
|
||||
// if a file is written with ExcelCompatibility on.
|
||||
// The initial 'sep=;' line seems to confuse it, even though
|
||||
// it has a BOM. The Unix "file" command also indicates a difference
|
||||
// when the sep line is or is not included:
|
||||
// UTF-8 Unicode (with BOM) text, with CRLF line terminators
|
||||
// vs CSV text (without sep line, with or without BOM)
|
||||
// So, this test has no UTF-8 yet while more research is conducted.
|
||||
public function testExcelCompatibility(): void
|
||||
{
|
||||
$spreadsheet = new Spreadsheet();
|
||||
$sheet = $spreadsheet->getActiveSheet();
|
||||
$sheet->setCellValue('A1', '1');
|
||||
$sheet->setCellValue('B1', '2');
|
||||
$sheet->setCellValue('C1', '3');
|
||||
$sheet->setCellValue('A2', '4');
|
||||
$sheet->setCellValue('B2', '5');
|
||||
$sheet->setCellValue('C2', '6');
|
||||
$writer = new CsvWriter($spreadsheet);
|
||||
$writer->setExcelCompatibility(true);
|
||||
self::assertSame('', $writer->getOutputEncoding());
|
||||
$filename = File::temporaryFilename();
|
||||
$writer->save($filename);
|
||||
$reader = new CsvReader();
|
||||
$spreadsheet2 = $reader->load($filename);
|
||||
$contents = file_get_contents($filename);
|
||||
unlink($filename);
|
||||
self::assertEquals(1, $spreadsheet2->getActiveSheet()->getCell('A1')->getValue());
|
||||
self::assertEquals(6, $spreadsheet2->getActiveSheet()->getCell('C2')->getValue());
|
||||
self::assertStringContainsString(CsvReader::UTF8_BOM, $contents);
|
||||
self::assertStringContainsString("\r\n", $contents);
|
||||
self::assertStringContainsString('sep=;', $contents);
|
||||
self::assertStringContainsString('"1";"2";"3"', $contents);
|
||||
self::assertStringContainsString('"4";"5";"6"', $contents);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,33 @@
|
||||
<?php
|
||||
|
||||
namespace PhpOffice\PhpSpreadsheetTests\Writer\Ods;
|
||||
|
||||
use PhpOffice\PhpSpreadsheet\Spreadsheet;
|
||||
use PhpOffice\PhpSpreadsheetTests\Functional\AbstractFunctional;
|
||||
|
||||
class AutoFilterTest extends AbstractFunctional
|
||||
{
|
||||
public function testAutoFilterWriter(): void
|
||||
{
|
||||
$spreadsheet = new Spreadsheet();
|
||||
$worksheet = $spreadsheet->getActiveSheet();
|
||||
|
||||
$dataSet = [
|
||||
['Year', 'Quarter', 'Sales'],
|
||||
[2020, 'Q1', 100],
|
||||
[2020, 'Q2', 120],
|
||||
[2020, 'Q3', 140],
|
||||
[2020, 'Q4', 160],
|
||||
[2021, 'Q1', 180],
|
||||
[2021, 'Q2', 75],
|
||||
[2021, 'Q3', 0],
|
||||
[2021, 'Q4', 0],
|
||||
];
|
||||
$worksheet->fromArray($dataSet, null, 'A1');
|
||||
$worksheet->getAutoFilter()->setRange('A1:C9');
|
||||
|
||||
$reloaded = $this->writeAndReload($spreadsheet, 'Ods');
|
||||
|
||||
self::assertSame('A1:C9', $reloaded->getActiveSheet()->getAutoFilter()->getRange());
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,33 @@
|
||||
<?php
|
||||
|
||||
namespace PhpOffice\PhpSpreadsheetTests\Writer\Ods;
|
||||
|
||||
use PhpOffice\PhpSpreadsheet\NamedFormula;
|
||||
use PhpOffice\PhpSpreadsheet\NamedRange;
|
||||
use PhpOffice\PhpSpreadsheet\Spreadsheet;
|
||||
use PhpOffice\PhpSpreadsheetTests\Functional\AbstractFunctional;
|
||||
|
||||
class DefinedNamesTest extends AbstractFunctional
|
||||
{
|
||||
public function testDefinedNamesWriter(): void
|
||||
{
|
||||
$spreadsheet = new Spreadsheet();
|
||||
$worksheet = $spreadsheet->getActiveSheet();
|
||||
|
||||
$dataSet = [
|
||||
[7, 'x', 5],
|
||||
['=', '=FORMULA'],
|
||||
];
|
||||
$worksheet->fromArray($dataSet, null, 'A1');
|
||||
|
||||
$spreadsheet->addDefinedName(new NamedRange('FIRST', $worksheet, '$A$1'));
|
||||
$spreadsheet->addDefinedName(new NamedRange('SECOND', $worksheet, '$C$1'));
|
||||
$spreadsheet->addDefinedName(new NamedFormula('FORMULA', $worksheet, '=FIRST*SECOND'));
|
||||
|
||||
$reloaded = $this->writeAndReload($spreadsheet, 'Ods');
|
||||
|
||||
self::assertSame(7, $reloaded->getActiveSheet()->getCell('FIRST')->getValue());
|
||||
self::assertSame(5, $reloaded->getActiveSheet()->getCell('SECOND')->getValue());
|
||||
self::assertSame(35, $reloaded->getActiveSheet()->getCell('B2')->getCalculatedValue());
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,99 @@
|
||||
<?php
|
||||
|
||||
namespace PhpOffice\PhpSpreadsheetTests\Writer\Xls;
|
||||
|
||||
use PhpOffice\PhpSpreadsheet\Spreadsheet;
|
||||
use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet;
|
||||
use PhpOffice\PhpSpreadsheetTests\Functional\AbstractFunctional;
|
||||
|
||||
class VisibilityTest extends AbstractFunctional
|
||||
{
|
||||
/**
|
||||
* @dataProvider dataProviderRowVisibility
|
||||
*/
|
||||
public function testRowVisibility(array $visibleRows): void
|
||||
{
|
||||
$spreadsheet = new Spreadsheet();
|
||||
$worksheet = $spreadsheet->getActiveSheet();
|
||||
foreach ($visibleRows as $row => $visibility) {
|
||||
$worksheet->setCellValue("A{$row}", $row);
|
||||
$worksheet->getRowDimension($row)->setVisible($visibility);
|
||||
}
|
||||
|
||||
$reloadedSpreadsheet = $this->writeAndReload($spreadsheet, 'Xls');
|
||||
$reloadedWorksheet = $reloadedSpreadsheet->getActiveSheet();
|
||||
foreach ($visibleRows as $row => $visibility) {
|
||||
self::assertSame($visibility, $reloadedWorksheet->getRowDimension($row)->getVisible());
|
||||
}
|
||||
}
|
||||
|
||||
public function dataProviderRowVisibility(): array
|
||||
{
|
||||
return [
|
||||
[
|
||||
[1 => true, 2 => false, 3 => false, 4 => true, 5 => true, 6 => false],
|
||||
],
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider dataProviderColumnVisibility
|
||||
*/
|
||||
public function testColumnVisibility(array $visibleColumns): void
|
||||
{
|
||||
$spreadsheet = new Spreadsheet();
|
||||
$worksheet = $spreadsheet->getActiveSheet();
|
||||
foreach ($visibleColumns as $column => $visibility) {
|
||||
$worksheet->setCellValue("{$column}1", $column);
|
||||
$worksheet->getColumnDimension($column)->setVisible($visibility);
|
||||
}
|
||||
|
||||
$reloadedSpreadsheet = $this->writeAndReload($spreadsheet, 'Xls');
|
||||
$reloadedWorksheet = $reloadedSpreadsheet->getActiveSheet();
|
||||
foreach ($visibleColumns as $column => $visibility) {
|
||||
self::assertSame($visibility, $reloadedWorksheet->getColumnDimension($column)->getVisible());
|
||||
}
|
||||
}
|
||||
|
||||
public function dataProviderColumnVisibility(): array
|
||||
{
|
||||
return [
|
||||
[
|
||||
['A' => true, 'B' => false, 'C' => false, 'D' => true, 'E' => true, 'F' => false],
|
||||
],
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider dataProviderSheetVisibility
|
||||
*/
|
||||
public function testSheetVisibility(array $visibleSheets): void
|
||||
{
|
||||
$spreadsheet = new Spreadsheet();
|
||||
$spreadsheet->removeSheetByIndex(0);
|
||||
foreach ($visibleSheets as $sheetName => $visibility) {
|
||||
$worksheet = $spreadsheet->addSheet(new Worksheet($spreadsheet, $sheetName));
|
||||
$worksheet->setCellValue('A1', $sheetName);
|
||||
$worksheet->setSheetState($visibility);
|
||||
}
|
||||
|
||||
$reloadedSpreadsheet = $this->writeAndReload($spreadsheet, 'Xls');
|
||||
foreach ($visibleSheets as $sheetName => $visibility) {
|
||||
$reloadedWorksheet = $reloadedSpreadsheet->getSheetByName($sheetName) ?? new Worksheet();
|
||||
self::assertSame($visibility, $reloadedWorksheet->getSheetState());
|
||||
}
|
||||
}
|
||||
|
||||
public function dataProviderSheetVisibility(): array
|
||||
{
|
||||
return [
|
||||
[
|
||||
[
|
||||
'Worksheet 1' => Worksheet::SHEETSTATE_HIDDEN,
|
||||
'Worksheet 2' => Worksheet::SHEETSTATE_VERYHIDDEN,
|
||||
'Worksheet 3' => Worksheet::SHEETSTATE_VISIBLE,
|
||||
],
|
||||
],
|
||||
];
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
<?php
|
||||
|
||||
namespace PhpOffice\PhpSpreadsheetTests\Writer\Xlsx;
|
||||
|
||||
use PhpOffice\PhpSpreadsheet\Shared\File;
|
||||
use PhpOffice\PhpSpreadsheet\Spreadsheet;
|
||||
use PhpOffice\PhpSpreadsheet\Writer\Xlsx as Writer;
|
||||
use PHPUnit\Framework\TestCase;
|
||||
|
||||
class Issue2082Test extends TestCase
|
||||
{
|
||||
public function testBoolWrite(): void
|
||||
{
|
||||
// Problem writing boolean function values is detected only when
|
||||
// opening spreadsheet in Excel 2007-2016. Test verifies that
|
||||
// value field is written correctly for those versions.
|
||||
$outputFilename = File::temporaryFilename();
|
||||
$spreadsheet = new Spreadsheet();
|
||||
$worksheet = $spreadsheet->getActiveSheet();
|
||||
$worksheet->fromArray(['A', 'B', 'C', 'D']);
|
||||
$worksheet->getCell('A2')->setValue('=A1<>"A"');
|
||||
$worksheet->getCell('A3')->setValue('=A1="A"');
|
||||
$worksheet->getCell('B2')->setValue('=LEFT(B1, 0)');
|
||||
$worksheet->getCell('B3')->setValue('=B2=""');
|
||||
|
||||
$writer = new Writer($spreadsheet);
|
||||
$writer->save($outputFilename);
|
||||
$zipfile = "zip://$outputFilename#xl/worksheets/sheet1.xml";
|
||||
$contents = file_get_contents($zipfile);
|
||||
unlink($outputFilename);
|
||||
if ($contents === false) {
|
||||
self::fail('Unable to open file');
|
||||
} else {
|
||||
self::assertStringContainsString('<c r="A2" t="b"><f>A1<>"A"</f><v>0</v></c>', $contents);
|
||||
self::assertStringContainsString('<c r="A3" t="b"><f>A1="A"</f><v>1</v></c>', $contents);
|
||||
self::assertStringContainsString('<c r="B2" t="str"><f>LEFT(B1, 0)</f><v></v></c>', $contents);
|
||||
self::assertStringContainsString('<c r="B3" t="b"><f>B2=""</f><v>1</v></c>', $contents);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,99 @@
|
||||
<?php
|
||||
|
||||
namespace PhpOffice\PhpSpreadsheetTests\Writer\Xlsx;
|
||||
|
||||
use PhpOffice\PhpSpreadsheet\Spreadsheet;
|
||||
use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet;
|
||||
use PhpOffice\PhpSpreadsheetTests\Functional\AbstractFunctional;
|
||||
|
||||
class VisibilityTest extends AbstractFunctional
|
||||
{
|
||||
/**
|
||||
* @dataProvider dataProviderRowVisibility
|
||||
*/
|
||||
public function testRowVisibility(array $visibleRows): void
|
||||
{
|
||||
$spreadsheet = new Spreadsheet();
|
||||
$worksheet = $spreadsheet->getActiveSheet();
|
||||
foreach ($visibleRows as $row => $visibility) {
|
||||
$worksheet->setCellValue("A{$row}", $row);
|
||||
$worksheet->getRowDimension($row)->setVisible($visibility);
|
||||
}
|
||||
|
||||
$reloadedSpreadsheet = $this->writeAndReload($spreadsheet, 'Xlsx');
|
||||
$reloadedWorksheet = $reloadedSpreadsheet->getActiveSheet();
|
||||
foreach ($visibleRows as $row => $visibility) {
|
||||
self::assertSame($visibility, $reloadedWorksheet->getRowDimension($row)->getVisible());
|
||||
}
|
||||
}
|
||||
|
||||
public function dataProviderRowVisibility(): array
|
||||
{
|
||||
return [
|
||||
[
|
||||
[1 => false, 2 => false, 3 => true, 4 => false, 5 => true, 6 => false],
|
||||
],
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider dataProviderColumnVisibility
|
||||
*/
|
||||
public function testColumnVisibility(array $visibleColumns): void
|
||||
{
|
||||
$spreadsheet = new Spreadsheet();
|
||||
$worksheet = $spreadsheet->getActiveSheet();
|
||||
foreach ($visibleColumns as $column => $visibility) {
|
||||
$worksheet->setCellValue("{$column}1", $column);
|
||||
$worksheet->getColumnDimension($column)->setVisible($visibility);
|
||||
}
|
||||
|
||||
$reloadedSpreadsheet = $this->writeAndReload($spreadsheet, 'Xlsx');
|
||||
$reloadedWorksheet = $reloadedSpreadsheet->getActiveSheet();
|
||||
foreach ($visibleColumns as $column => $visibility) {
|
||||
self::assertSame($visibility, $reloadedWorksheet->getColumnDimension($column)->getVisible());
|
||||
}
|
||||
}
|
||||
|
||||
public function dataProviderColumnVisibility(): array
|
||||
{
|
||||
return [
|
||||
[
|
||||
['A' => false, 'B' => false, 'C' => true, 'D' => false, 'E' => true, 'F' => false],
|
||||
],
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider dataProviderSheetVisibility
|
||||
*/
|
||||
public function testSheetVisibility(array $visibleSheets): void
|
||||
{
|
||||
$spreadsheet = new Spreadsheet();
|
||||
$spreadsheet->removeSheetByIndex(0);
|
||||
foreach ($visibleSheets as $sheetName => $visibility) {
|
||||
$worksheet = $spreadsheet->addSheet(new Worksheet($spreadsheet, $sheetName));
|
||||
$worksheet->setCellValue('A1', $sheetName);
|
||||
$worksheet->setSheetState($visibility);
|
||||
}
|
||||
|
||||
$reloadedSpreadsheet = $this->writeAndReload($spreadsheet, 'Xlsx');
|
||||
foreach ($visibleSheets as $sheetName => $visibility) {
|
||||
$reloadedWorksheet = $reloadedSpreadsheet->getSheetByName($sheetName) ?? new Worksheet();
|
||||
self::assertSame($visibility, $reloadedWorksheet->getSheetState());
|
||||
}
|
||||
}
|
||||
|
||||
public function dataProviderSheetVisibility(): array
|
||||
{
|
||||
return [
|
||||
[
|
||||
[
|
||||
'Worksheet 1' => Worksheet::SHEETSTATE_HIDDEN,
|
||||
'Worksheet 2' => Worksheet::SHEETSTATE_VERYHIDDEN,
|
||||
'Worksheet 3' => Worksheet::SHEETSTATE_VISIBLE,
|
||||
],
|
||||
],
|
||||
];
|
||||
}
|
||||
}
|
||||
@@ -25,4 +25,12 @@ return [
|
||||
'#VALUE!',
|
||||
0, 'red', 'blue', 'green', 'brown',
|
||||
],
|
||||
[
|
||||
'#VALUE!',
|
||||
'NaN', 'red', 'blue', 'green', 'brown',
|
||||
],
|
||||
[
|
||||
['blue', 'purple'],
|
||||
3, ['red', 'orange'], ['yellow', 'green'], ['blue', 'purple'],
|
||||
],
|
||||
];
|
||||
|
||||
@@ -328,4 +328,28 @@ return [
|
||||
2,
|
||||
false,
|
||||
],
|
||||
[
|
||||
0.61,
|
||||
'Ed',
|
||||
[
|
||||
[null, 'Ann', 'Cara', 'Colin', 'Ed', 'Frank'],
|
||||
['Math', 0.58, 0.90, 0.67, 0.76, 0.80],
|
||||
['French', 0.61, 0.71, 0.59, 0.59, 0.76],
|
||||
['Physics', 0.75, 0.45, 0.39, 0.52, 0.69],
|
||||
['Bioogy', 0.39, 0.55, 0.77, 0.61, 0.45],
|
||||
],
|
||||
5,
|
||||
false,
|
||||
],
|
||||
[
|
||||
'Normal Weight',
|
||||
23.5,
|
||||
[
|
||||
[null, 'Min', 0.0, 18.5, 25.0, 30.0],
|
||||
['BMI', 'Max', 18.4, 24.9, 29.9, null],
|
||||
[null, 'Body Type', 'Underweight', 'Normal Weight', 'Overweight', 'Obese'],
|
||||
],
|
||||
3,
|
||||
true,
|
||||
],
|
||||
];
|
||||
|
||||
@@ -0,0 +1,26 @@
|
||||
<?php
|
||||
|
||||
use PhpOffice\PhpSpreadsheet\Calculation\Functions;
|
||||
|
||||
return [
|
||||
[
|
||||
['https://phpspreadsheet.readthedocs.io/en/latest/', 'https://phpspreadsheet.readthedocs.io/en/latest/'],
|
||||
'https://phpspreadsheet.readthedocs.io/en/latest/',
|
||||
null,
|
||||
],
|
||||
[
|
||||
['https://phpspreadsheet.readthedocs.io/en/latest/', 'Read the Docs'],
|
||||
'https://phpspreadsheet.readthedocs.io/en/latest/',
|
||||
'Read the Docs',
|
||||
],
|
||||
[
|
||||
Functions::REF(),
|
||||
null,
|
||||
null,
|
||||
],
|
||||
[
|
||||
Functions::REF(),
|
||||
'',
|
||||
null,
|
||||
],
|
||||
];
|
||||
@@ -6,7 +6,7 @@ return [
|
||||
// Input
|
||||
[20 => ['R' => 1]],
|
||||
],
|
||||
[
|
||||
'Negative Row' => [
|
||||
'#VALUE!', // Expected
|
||||
// Input
|
||||
[
|
||||
@@ -15,7 +15,7 @@ return [
|
||||
],
|
||||
-1,
|
||||
],
|
||||
[
|
||||
'Row > matrix rows' => [
|
||||
'#REF!', // Expected
|
||||
// Input
|
||||
[
|
||||
@@ -24,7 +24,25 @@ return [
|
||||
],
|
||||
10,
|
||||
],
|
||||
[
|
||||
'Row is not a number' => [
|
||||
'#VALUE!', // Expected
|
||||
// Input
|
||||
[
|
||||
20 => ['R' => 1],
|
||||
21 => ['R' => 2],
|
||||
],
|
||||
'NaN',
|
||||
],
|
||||
'Row is Error' => [
|
||||
'#N/A', // Expected
|
||||
// Input
|
||||
[
|
||||
20 => ['R' => 1],
|
||||
21 => ['R' => 2],
|
||||
],
|
||||
'#N/A',
|
||||
],
|
||||
'Return row 2' => [
|
||||
[21 => ['R' => 2]], // Expected
|
||||
// Input
|
||||
[
|
||||
@@ -33,7 +51,7 @@ return [
|
||||
],
|
||||
2,
|
||||
],
|
||||
[
|
||||
'Return row 2 from larger matrix' => [
|
||||
[21 => ['R' => 2, 'S' => 4]], // Expected
|
||||
// Input
|
||||
[
|
||||
@@ -43,17 +61,17 @@ return [
|
||||
2,
|
||||
0,
|
||||
],
|
||||
[
|
||||
'Negative Column' => [
|
||||
'#VALUE!', // Expected
|
||||
// Input
|
||||
[
|
||||
'20' => ['R' => 1, 'S' => 3],
|
||||
'21' => ['R' => 2, 'S' => 4],
|
||||
],
|
||||
2,
|
||||
0,
|
||||
-1,
|
||||
],
|
||||
[
|
||||
'Column > matrix columns' => [
|
||||
'#REF!', // Expected
|
||||
// Input
|
||||
[
|
||||
@@ -63,15 +81,25 @@ return [
|
||||
2,
|
||||
10,
|
||||
],
|
||||
[
|
||||
'#REF!', // Expected
|
||||
'Column is not a number' => [
|
||||
'#VALUE!', // Expected
|
||||
// Input
|
||||
[
|
||||
'20' => ['R' => 1, 'S' => 3],
|
||||
'21' => ['R' => 2, 'S' => 4],
|
||||
20 => ['R' => 1],
|
||||
21 => ['R' => 2],
|
||||
],
|
||||
10,
|
||||
2,
|
||||
1,
|
||||
'NaN',
|
||||
],
|
||||
'Column is Error' => [
|
||||
'#N/A', // Expected
|
||||
// Input
|
||||
[
|
||||
20 => ['R' => 1],
|
||||
21 => ['R' => 2],
|
||||
],
|
||||
1,
|
||||
'#N/A',
|
||||
],
|
||||
[
|
||||
4, // Expected
|
||||
@@ -115,6 +143,15 @@ return [
|
||||
2,
|
||||
1,
|
||||
],
|
||||
[
|
||||
[1 => ['Bananas', 'Pears']],
|
||||
[
|
||||
['Apples', 'Lemons'],
|
||||
['Bananas', 'Pears'],
|
||||
],
|
||||
2,
|
||||
0,
|
||||
],
|
||||
[
|
||||
3,
|
||||
[
|
||||
|
||||
@@ -349,4 +349,35 @@ return [
|
||||
],
|
||||
2.0,
|
||||
],
|
||||
[
|
||||
3.50,
|
||||
'Cornflakes',
|
||||
[
|
||||
['Item Description', 'Price'],
|
||||
['Tinned Tomatoes', 0.90],
|
||||
['Tinned Tuna', 1.50],
|
||||
['Cornflakes', 3.50],
|
||||
['Shortcake Biscuits', 1.00],
|
||||
['Toothpaste', 4.10],
|
||||
['Tinned Baked Beans', 0.99],
|
||||
['White Sliced Bread', 0.80],
|
||||
],
|
||||
2,
|
||||
false,
|
||||
],
|
||||
[
|
||||
'E',
|
||||
0.52,
|
||||
[
|
||||
['Lower', 'Upper', 'Grade'],
|
||||
[0.00, 0.44, 'F'],
|
||||
[0.45, 0.54, 'E'],
|
||||
[0.55, 0.64, 'D'],
|
||||
[0.65, 0.74, 'C'],
|
||||
[0.75, 0.84, 'B'],
|
||||
[0.85, 1.00, 'A'],
|
||||
],
|
||||
3,
|
||||
true,
|
||||
],
|
||||
];
|
||||
|
||||
@@ -4,5 +4,9 @@ return [
|
||||
[50, 5, 15, 30],
|
||||
[52, 5, 15, 30, 2],
|
||||
[53.1, 5.7, 15, 30, 2.4],
|
||||
['#VALUE!', 5.7, 'X', 30, 2.4], // error here conflicts with SUMIF
|
||||
[52.1, 5.7, '14', 30, 2.4],
|
||||
[38.1, 5.7, 'X', 30, 2.4], // error if entered in formula, but not in cell
|
||||
[38.1, 5.7, null, 30, 2.4],
|
||||
[38.1, 5.7, false, 30, 2.4],
|
||||
[39.1, 5.7, true, 30, 2.4],
|
||||
];
|
||||
|
||||
@@ -0,0 +1,12 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
[50, '5, 15, 30'],
|
||||
[52, '5, 15, 30, 2'],
|
||||
[53.1, '5.7, 15, 30, 2.4'],
|
||||
[52.1, '5.7, "14", 30, 2.4'],
|
||||
['#VALUE!', '5.7, "X", 30, 2.4'], // error if entered in formula, but not in cell
|
||||
[38.1, '5.7, , 30, 2.4'],
|
||||
[38.1, '5.7, false, 30, 2.4'],
|
||||
[39.1, '5.7, true, 30, 2.4'],
|
||||
];
|
||||
@@ -2,18 +2,33 @@
|
||||
|
||||
return [
|
||||
['R[2]C[2]', 'O18', 16, 13],
|
||||
['R18C15', '$O$18', 16, 13],
|
||||
['R[-2]C[2]', 'O14', 16, 13],
|
||||
['R[-2]C15', '$O14', 16, 13],
|
||||
['R[2]C[-2]', 'K18', 16, 13],
|
||||
['R18C[-2]', 'K$18', 16, 13],
|
||||
['R[-2]C[-2]', 'K14', 16, 13],
|
||||
['RC[3]', 'P16', 16, 13],
|
||||
['R16C[3]', 'P$16', 16, 13],
|
||||
['RC[-3]', 'J16', 16, 13],
|
||||
['RC10', '$J16', 16, 13],
|
||||
['R[4]C', 'M20', 16, 13],
|
||||
['R[4]C13', '$M20', 16, 13],
|
||||
['R[-4]C', 'M12', 16, 13],
|
||||
['R12C', 'M$12', 16, 13],
|
||||
['RC', 'E5', 5, 5],
|
||||
['R5C5', '$E$5', 5, 5],
|
||||
['R5C', 'E5', null, 5],
|
||||
['R5C5', '$E5', null, 5],
|
||||
['R5C', 'E$5', null, 5],
|
||||
['RC5', 'E5', 5, null],
|
||||
['RC5', '$E5', 5, null],
|
||||
['R5C5', 'E$5', 5, null],
|
||||
['R5C[2]', 'E5', null, 3],
|
||||
['R5C5', '$E5', null, 3],
|
||||
['R5C[2]', 'E$5', null, 3],
|
||||
['R[2]C5', 'E5', 3, null],
|
||||
['R5C5', '$E$5', 3, null],
|
||||
['R5C[-2]', 'E5', null, 7],
|
||||
['R[-2]C5', 'E5', 7, null],
|
||||
];
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Reference in New Issue
Block a user