From 530e6642bf26522176504fccc81385d7358936d2 Mon Sep 17 00:00:00 2001 From: aswinkumar863 Date: Sun, 17 Apr 2022 17:48:38 +0530 Subject: [PATCH] Table name as an constructor argument Replaced worksheet argument with table name --- samples/Table/01_Table.php | 4 +- samples/Table/03_Column_Formula.php | 3 +- src/PhpSpreadsheet/Worksheet/Table.php | 43 +++++----- src/PhpSpreadsheet/Worksheet/Worksheet.php | 6 +- .../Worksheet/Table/RemoveTableTest.php | 4 +- .../Worksheet/Table/TableStyleTest.php | 6 +- .../Worksheet/Table/TableTest.php | 78 +++++++------------ 7 files changed, 63 insertions(+), 81 deletions(-) diff --git a/samples/Table/01_Table.php b/samples/Table/01_Table.php index c8301680..476f187c 100644 --- a/samples/Table/01_Table.php +++ b/samples/Table/01_Table.php @@ -52,9 +52,7 @@ $spreadsheet->getActiveSheet()->fromArray($dataArray, null, 'A2'); // Create Table $helper->log('Create Table'); -$table = new Table(); -$table->setName('Sales_Data'); -$table->setRange('A1:D17'); +$table = new Table('A1:D17', 'Sales_Data'); // Create Columns $table->getColumn('D')->setShowFilterButton(false); diff --git a/samples/Table/03_Column_Formula.php b/samples/Table/03_Column_Formula.php index e8ae5d99..b431af34 100644 --- a/samples/Table/03_Column_Formula.php +++ b/samples/Table/03_Column_Formula.php @@ -49,8 +49,7 @@ $spreadsheet->getActiveSheet()->fromArray($dataArray, null, 'A1'); // Create Table $helper->log('Create Table'); -$table = new Table(); -$table->setName('Sales_Data'); +$table = new Table('A1:G15', 'Sales_Data'); $table->setRange('A1:G15'); // Set Column Formula diff --git a/src/PhpSpreadsheet/Worksheet/Table.php b/src/PhpSpreadsheet/Worksheet/Table.php index b2d29ce7..35966d6f 100644 --- a/src/PhpSpreadsheet/Worksheet/Table.php +++ b/src/PhpSpreadsheet/Worksheet/Table.php @@ -61,13 +61,14 @@ class Table * Create a new Table. * * @param string $range (e.g. A1:D4) + * @param string $name (e.g. Table1) * * @return $this */ - public function __construct(string $range = '', ?Worksheet $worksheet = null) + public function __construct(string $range = '', string $name = '') { $this->setRange($range); - $this->setWorksheet($worksheet); + $this->setName($name); $this->style = new TableStyle(); } @@ -86,24 +87,26 @@ class Table { $name = trim($name); - if (strlen($name) === 1 && in_array($name, ['C', 'c', 'R', 'r'])) { - throw new PhpSpreadsheetException('The table name is invalid'); - } - if (strlen($name) > 255) { - throw new PhpSpreadsheetException('The table name cannot be longer than 255 characters'); - } - // Check for A1 or R1C1 cell reference notation - if ( - preg_match(Coordinate::A1_COORDINATE_REGEX, $name) || - preg_match('/^R\[?\-?[0-9]*\]?C\[?\-?[0-9]*\]?$/i', $name) - ) { - throw new PhpSpreadsheetException('The table name can\'t be the same as a cell reference'); - } - if (!preg_match('/^[\p{L}_\\\\]/iu', $name)) { - throw new PhpSpreadsheetException('The table name must begin a name with a letter, an underscore character (_), or a backslash (\)'); - } - if (!preg_match('/^[\p{L}_\\\\][\p{L}\p{M}0-9\._]+$/iu', $name)) { - throw new PhpSpreadsheetException('The table name contains invalid characters'); + if (!empty($name)) { + if (strlen($name) === 1 && in_array($name, ['C', 'c', 'R', 'r'])) { + throw new PhpSpreadsheetException('The table name is invalid'); + } + if (strlen($name) > 255) { + throw new PhpSpreadsheetException('The table name cannot be longer than 255 characters'); + } + // Check for A1 or R1C1 cell reference notation + if ( + preg_match(Coordinate::A1_COORDINATE_REGEX, $name) || + preg_match('/^R\[?\-?[0-9]*\]?C\[?\-?[0-9]*\]?$/i', $name) + ) { + throw new PhpSpreadsheetException('The table name can\'t be the same as a cell reference'); + } + if (!preg_match('/^[\p{L}_\\\\]/iu', $name)) { + throw new PhpSpreadsheetException('The table name must begin a name with a letter, an underscore character (_), or a backslash (\)'); + } + if (!preg_match('/^[\p{L}_\\\\][\p{L}\p{M}0-9\._]+$/iu', $name)) { + throw new PhpSpreadsheetException('The table name contains invalid characters'); + } } $this->name = $name; diff --git a/src/PhpSpreadsheet/Worksheet/Worksheet.php b/src/PhpSpreadsheet/Worksheet/Worksheet.php index 2facf172..6f04d2ba 100644 --- a/src/PhpSpreadsheet/Worksheet/Worksheet.php +++ b/src/PhpSpreadsheet/Worksheet/Worksheet.php @@ -2212,7 +2212,11 @@ class Worksheet implements IComparable { $cellRange = Coordinate::stringFromColumnIndex($columnIndex1) . $row1 . ':' . Coordinate::stringFromColumnIndex($columnIndex2) . $row2; - return $this->addTable(new Table($cellRange, $this)); + $table = new Table($cellRange); + $table->setWorksheet($this); + $this->addTable($table); + + return $this; } /** diff --git a/tests/PhpSpreadsheetTests/Worksheet/Table/RemoveTableTest.php b/tests/PhpSpreadsheetTests/Worksheet/Table/RemoveTableTest.php index b33e6c79..0495b11c 100644 --- a/tests/PhpSpreadsheetTests/Worksheet/Table/RemoveTableTest.php +++ b/tests/PhpSpreadsheetTests/Worksheet/Table/RemoveTableTest.php @@ -12,7 +12,7 @@ class RemoveTableTest extends SetupTeardown { $sheet = $this->getSheet(); - $table = new Table(self::INITIAL_RANGE, $sheet); + $table = new Table(self::INITIAL_RANGE); $table->setName('Table1'); $sheet->addTable($table); @@ -26,7 +26,7 @@ class RemoveTableTest extends SetupTeardown { $sheet = $this->getSheet(); - $table = new Table(self::INITIAL_RANGE, $sheet); + $table = new Table(self::INITIAL_RANGE); $table->setName('Table1'); $sheet->addTable($table); diff --git a/tests/PhpSpreadsheetTests/Worksheet/Table/TableStyleTest.php b/tests/PhpSpreadsheetTests/Worksheet/Table/TableStyleTest.php index e3cdaa7c..830cc87b 100644 --- a/tests/PhpSpreadsheetTests/Worksheet/Table/TableStyleTest.php +++ b/tests/PhpSpreadsheetTests/Worksheet/Table/TableStyleTest.php @@ -11,8 +11,7 @@ class TableStyleTest extends SetupTeardown public function testVariousSets(): void { - $sheet = $this->getSheet(); - $table = new Table(self::INITIAL_RANGE, $sheet); + $table = new Table(self::INITIAL_RANGE); $style = $table->getStyle(); $result = $style->setTheme(TableStyle::TABLE_STYLE_DARK1); @@ -38,8 +37,7 @@ class TableStyleTest extends SetupTeardown public function testTable(): void { - $sheet = $this->getSheet(); - $table = new Table(self::INITIAL_RANGE, $sheet); + $table = new Table(self::INITIAL_RANGE); $style = new TableStyle(); $style->setTable($table); self::assertEquals($table, $style->getTable()); diff --git a/tests/PhpSpreadsheetTests/Worksheet/Table/TableTest.php b/tests/PhpSpreadsheetTests/Worksheet/Table/TableTest.php index 9602f27d..af205196 100644 --- a/tests/PhpSpreadsheetTests/Worksheet/Table/TableTest.php +++ b/tests/PhpSpreadsheetTests/Worksheet/Table/TableTest.php @@ -14,8 +14,7 @@ class TableTest extends SetupTeardown public function testToString(): void { $expectedResult = self::INITIAL_RANGE; - $sheet = $this->getSheet(); - $table = new Table(self::INITIAL_RANGE, $sheet); + $table = new Table(self::INITIAL_RANGE); // magic __toString should return the active table range $result = (string) $table; @@ -27,8 +26,7 @@ class TableTest extends SetupTeardown */ public function testValidTableNames(string $name, string $expected): void { - $sheet = $this->getSheet(); - $table = new Table(self::INITIAL_RANGE, $sheet); + $table = new Table(self::INITIAL_RANGE); $result = $table->setName($name); self::assertInstanceOf(Table::class, $result); @@ -38,6 +36,7 @@ class TableTest extends SetupTeardown public function validTableNamesProvider(): array { return [ + ['', ''], ['Table_1', 'Table_1'], ['_table_2', '_table_2'], ['\table_3', '\table_3'], @@ -52,8 +51,7 @@ class TableTest extends SetupTeardown */ public function testInvalidTableNames(string $name): void { - $sheet = $this->getSheet(); - $table = new Table(self::INITIAL_RANGE, $sheet); + $table = new Table(self::INITIAL_RANGE); $this->expectException(PhpSpreadsheetException::class); @@ -95,8 +93,7 @@ class TableTest extends SetupTeardown public function testVariousSets(): void { - $sheet = $this->getSheet(); - $table = new Table(self::INITIAL_RANGE, $sheet); + $table = new Table(self::INITIAL_RANGE); $result = $table->setShowHeaderRow(false); self::assertInstanceOf(Table::class, $result); @@ -110,15 +107,15 @@ class TableTest extends SetupTeardown public function testGetWorksheet(): void { $sheet = $this->getSheet(); - $table = new Table(self::INITIAL_RANGE, $sheet); + $table = new Table(self::INITIAL_RANGE); + $sheet->addTable($table); $result = $table->getWorksheet(); self::assertSame($sheet, $result); } public function testSetWorksheet(): void { - $sheet = $this->getSheet(); - $table = new Table(self::INITIAL_RANGE, $sheet); + $table = new Table(self::INITIAL_RANGE); $spreadsheet = $this->getSpreadsheet(); $sheet2 = $spreadsheet->createSheet(); // Setters return the instance to implement the fluent interface @@ -129,8 +126,7 @@ class TableTest extends SetupTeardown public function testGetRange(): void { $expectedResult = self::INITIAL_RANGE; - $sheet = $this->getSheet(); - $table = new Table(self::INITIAL_RANGE, $sheet); + $table = new Table(self::INITIAL_RANGE); // Result should be the active table range $result = $table->getRange(); @@ -141,7 +137,7 @@ class TableTest extends SetupTeardown { $sheet = $this->getSheet(); $title = $sheet->getTitle(); - $table = new Table(self::INITIAL_RANGE, $sheet); + $table = new Table(self::INITIAL_RANGE); $ranges = [ 'G1:J512' => "$title!G1:J512", 'K1:N20' => 'K1:N20', @@ -161,8 +157,7 @@ class TableTest extends SetupTeardown public function testClearRange(): void { $expectedResult = ''; - $sheet = $this->getSheet(); - $table = new Table(self::INITIAL_RANGE, $sheet); + $table = new Table(self::INITIAL_RANGE); // Setters return the instance to implement the fluent interface $result = $table->setRange(''); @@ -180,8 +175,7 @@ class TableTest extends SetupTeardown { $this->expectException(PhpSpreadsheetException::class); - $sheet = $this->getSheet(); - new Table($range, $sheet); + new Table($range); } public function invalidTableRangeProvider(): array @@ -198,8 +192,7 @@ class TableTest extends SetupTeardown public function testGetColumnsEmpty(): void { // There should be no columns yet defined - $sheet = $this->getSheet(); - $table = new Table(self::INITIAL_RANGE, $sheet); + $table = new Table(self::INITIAL_RANGE); $result = $table->getColumns(); self::assertIsArray($result); self::assertCount(0, $result); @@ -212,8 +205,7 @@ class TableTest extends SetupTeardown 'K' => 3, 'M' => 5, ]; - $sheet = $this->getSheet(); - $table = new Table(self::INITIAL_RANGE, $sheet); + $table = new Table(self::INITIAL_RANGE); // If we request a specific column by its column ID, we should get an // integer returned representing the column offset within the range @@ -296,8 +288,7 @@ class TableTest extends SetupTeardown public function testSetColumnWithString(): void { $expectedResult = 'L'; - $sheet = $this->getSheet(); - $table = new Table(self::INITIAL_RANGE, $sheet); + $table = new Table(self::INITIAL_RANGE); // Setters return the instance to implement the fluent interface $result = $table->setColumn($expectedResult); @@ -315,8 +306,7 @@ class TableTest extends SetupTeardown public function testSetInvalidColumnWithString(): void { $this->expectException(PhpSpreadsheetException::class); - $sheet = $this->getSheet(); - $table = new Table(self::INITIAL_RANGE, $sheet); + $table = new Table(self::INITIAL_RANGE); $invalidColumn = 'A'; $table->setColumn($invalidColumn); @@ -326,8 +316,7 @@ class TableTest extends SetupTeardown { $expectedResult = 'M'; $columnObject = new Column($expectedResult); - $sheet = $this->getSheet(); - $table = new Table(self::INITIAL_RANGE, $sheet); + $table = new Table(self::INITIAL_RANGE); // Setters return the instance to implement the fluent interface $result = $table->setColumn($columnObject); @@ -347,8 +336,7 @@ class TableTest extends SetupTeardown $this->expectException(PhpSpreadsheetException::class); $invalidColumn = 'E'; - $sheet = $this->getSheet(); - $table = new Table(self::INITIAL_RANGE, $sheet); + $table = new Table(self::INITIAL_RANGE); $table->setColumn($invalidColumn); } @@ -356,8 +344,7 @@ class TableTest extends SetupTeardown { $this->expectException(PhpSpreadsheetException::class); - $sheet = $this->getSheet(); - $table = new Table(self::INITIAL_RANGE, $sheet); + $table = new Table(self::INITIAL_RANGE); $invalidColumn = 123.456; // @phpstan-ignore-next-line $table->setColumn($invalidColumn); @@ -365,8 +352,7 @@ class TableTest extends SetupTeardown public function testGetColumns(): void { - $sheet = $this->getSheet(); - $table = new Table(self::INITIAL_RANGE, $sheet); + $table = new Table(self::INITIAL_RANGE); $columnIndexes = ['L', 'M']; @@ -391,8 +377,7 @@ class TableTest extends SetupTeardown public function testGetColumn(): void { - $sheet = $this->getSheet(); - $table = new Table(self::INITIAL_RANGE, $sheet); + $table = new Table(self::INITIAL_RANGE); $columnIndexes = ['L', 'M']; @@ -410,8 +395,7 @@ class TableTest extends SetupTeardown public function testGetColumnByOffset(): void { - $sheet = $this->getSheet(); - $table = new Table(self::INITIAL_RANGE, $sheet); + $table = new Table(self::INITIAL_RANGE); $columnIndexes = [ 0 => 'H', @@ -430,8 +414,7 @@ class TableTest extends SetupTeardown public function testGetColumnIfNotSet(): void { - $sheet = $this->getSheet(); - $table = new Table(self::INITIAL_RANGE, $sheet); + $table = new Table(self::INITIAL_RANGE); // If we request a specific column by its column ID, we should // get a \PhpOffice\PhpSpreadsheet\Worksheet\Worksheet\Table\Column object returned $result = $table->getColumn('K'); @@ -441,8 +424,7 @@ class TableTest extends SetupTeardown public function testGetColumnWithoutRangeSet(): void { $this->expectException(\PhpOffice\PhpSpreadsheet\Exception::class); - $sheet = $this->getSheet(); - $table = new Table(self::INITIAL_RANGE, $sheet); + $table = new Table(self::INITIAL_RANGE); // Clear the range $table->setRange(''); @@ -451,8 +433,7 @@ class TableTest extends SetupTeardown public function testClearRangeWithExistingColumns(): void { - $sheet = $this->getSheet(); - $table = new Table(self::INITIAL_RANGE, $sheet); + $table = new Table(self::INITIAL_RANGE); $expectedResult = ''; $columnIndexes = ['L', 'M', 'N']; @@ -476,8 +457,7 @@ class TableTest extends SetupTeardown public function testSetRangeWithExistingColumns(): void { - $sheet = $this->getSheet(); - $table = new Table(self::INITIAL_RANGE, $sheet); + $table = new Table(self::INITIAL_RANGE); $expectedResult = 'G1:J512'; // These columns should be retained @@ -509,7 +489,8 @@ class TableTest extends SetupTeardown public function testClone(): void { $sheet = $this->getSheet(); - $table = new Table(self::INITIAL_RANGE, $sheet); + $table = new Table(self::INITIAL_RANGE); + $sheet->addTable($table); $columnIndexes = ['L', 'M']; foreach ($columnIndexes as $columnIndex) { @@ -546,8 +527,7 @@ class TableTest extends SetupTeardown public function testClearColumn(): void { - $sheet = $this->getSheet(); - $table = new Table(self::INITIAL_RANGE, $sheet); + $table = new Table(self::INITIAL_RANGE); $columnIndexes = ['J', 'K', 'L', 'M']; foreach ($columnIndexes as $columnIndex) {