Table name as an constructor argument
Replaced worksheet argument with table name
This commit is contained in:
parent
44d63f027a
commit
530e6642bf
|
|
@ -52,9 +52,7 @@ $spreadsheet->getActiveSheet()->fromArray($dataArray, null, 'A2');
|
||||||
|
|
||||||
// Create Table
|
// Create Table
|
||||||
$helper->log('Create Table');
|
$helper->log('Create Table');
|
||||||
$table = new Table();
|
$table = new Table('A1:D17', 'Sales_Data');
|
||||||
$table->setName('Sales_Data');
|
|
||||||
$table->setRange('A1:D17');
|
|
||||||
|
|
||||||
// Create Columns
|
// Create Columns
|
||||||
$table->getColumn('D')->setShowFilterButton(false);
|
$table->getColumn('D')->setShowFilterButton(false);
|
||||||
|
|
|
||||||
|
|
@ -49,8 +49,7 @@ $spreadsheet->getActiveSheet()->fromArray($dataArray, null, 'A1');
|
||||||
|
|
||||||
// Create Table
|
// Create Table
|
||||||
$helper->log('Create Table');
|
$helper->log('Create Table');
|
||||||
$table = new Table();
|
$table = new Table('A1:G15', 'Sales_Data');
|
||||||
$table->setName('Sales_Data');
|
|
||||||
$table->setRange('A1:G15');
|
$table->setRange('A1:G15');
|
||||||
|
|
||||||
// Set Column Formula
|
// Set Column Formula
|
||||||
|
|
|
||||||
|
|
@ -61,13 +61,14 @@ class Table
|
||||||
* Create a new Table.
|
* Create a new Table.
|
||||||
*
|
*
|
||||||
* @param string $range (e.g. A1:D4)
|
* @param string $range (e.g. A1:D4)
|
||||||
|
* @param string $name (e.g. Table1)
|
||||||
*
|
*
|
||||||
* @return $this
|
* @return $this
|
||||||
*/
|
*/
|
||||||
public function __construct(string $range = '', ?Worksheet $worksheet = null)
|
public function __construct(string $range = '', string $name = '')
|
||||||
{
|
{
|
||||||
$this->setRange($range);
|
$this->setRange($range);
|
||||||
$this->setWorksheet($worksheet);
|
$this->setName($name);
|
||||||
$this->style = new TableStyle();
|
$this->style = new TableStyle();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -86,6 +87,7 @@ class Table
|
||||||
{
|
{
|
||||||
$name = trim($name);
|
$name = trim($name);
|
||||||
|
|
||||||
|
if (!empty($name)) {
|
||||||
if (strlen($name) === 1 && in_array($name, ['C', 'c', 'R', 'r'])) {
|
if (strlen($name) === 1 && in_array($name, ['C', 'c', 'R', 'r'])) {
|
||||||
throw new PhpSpreadsheetException('The table name is invalid');
|
throw new PhpSpreadsheetException('The table name is invalid');
|
||||||
}
|
}
|
||||||
|
|
@ -105,6 +107,7 @@ class Table
|
||||||
if (!preg_match('/^[\p{L}_\\\\][\p{L}\p{M}0-9\._]+$/iu', $name)) {
|
if (!preg_match('/^[\p{L}_\\\\][\p{L}\p{M}0-9\._]+$/iu', $name)) {
|
||||||
throw new PhpSpreadsheetException('The table name contains invalid characters');
|
throw new PhpSpreadsheetException('The table name contains invalid characters');
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
$this->name = $name;
|
$this->name = $name;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -2212,7 +2212,11 @@ class Worksheet implements IComparable
|
||||||
{
|
{
|
||||||
$cellRange = Coordinate::stringFromColumnIndex($columnIndex1) . $row1 . ':' . Coordinate::stringFromColumnIndex($columnIndex2) . $row2;
|
$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;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
||||||
|
|
@ -12,7 +12,7 @@ class RemoveTableTest extends SetupTeardown
|
||||||
{
|
{
|
||||||
$sheet = $this->getSheet();
|
$sheet = $this->getSheet();
|
||||||
|
|
||||||
$table = new Table(self::INITIAL_RANGE, $sheet);
|
$table = new Table(self::INITIAL_RANGE);
|
||||||
$table->setName('Table1');
|
$table->setName('Table1');
|
||||||
$sheet->addTable($table);
|
$sheet->addTable($table);
|
||||||
|
|
||||||
|
|
@ -26,7 +26,7 @@ class RemoveTableTest extends SetupTeardown
|
||||||
{
|
{
|
||||||
$sheet = $this->getSheet();
|
$sheet = $this->getSheet();
|
||||||
|
|
||||||
$table = new Table(self::INITIAL_RANGE, $sheet);
|
$table = new Table(self::INITIAL_RANGE);
|
||||||
$table->setName('Table1');
|
$table->setName('Table1');
|
||||||
$sheet->addTable($table);
|
$sheet->addTable($table);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -11,8 +11,7 @@ class TableStyleTest extends SetupTeardown
|
||||||
|
|
||||||
public function testVariousSets(): void
|
public function testVariousSets(): void
|
||||||
{
|
{
|
||||||
$sheet = $this->getSheet();
|
$table = new Table(self::INITIAL_RANGE);
|
||||||
$table = new Table(self::INITIAL_RANGE, $sheet);
|
|
||||||
$style = $table->getStyle();
|
$style = $table->getStyle();
|
||||||
|
|
||||||
$result = $style->setTheme(TableStyle::TABLE_STYLE_DARK1);
|
$result = $style->setTheme(TableStyle::TABLE_STYLE_DARK1);
|
||||||
|
|
@ -38,8 +37,7 @@ class TableStyleTest extends SetupTeardown
|
||||||
|
|
||||||
public function testTable(): void
|
public function testTable(): void
|
||||||
{
|
{
|
||||||
$sheet = $this->getSheet();
|
$table = new Table(self::INITIAL_RANGE);
|
||||||
$table = new Table(self::INITIAL_RANGE, $sheet);
|
|
||||||
$style = new TableStyle();
|
$style = new TableStyle();
|
||||||
$style->setTable($table);
|
$style->setTable($table);
|
||||||
self::assertEquals($table, $style->getTable());
|
self::assertEquals($table, $style->getTable());
|
||||||
|
|
|
||||||
|
|
@ -14,8 +14,7 @@ class TableTest extends SetupTeardown
|
||||||
public function testToString(): void
|
public function testToString(): void
|
||||||
{
|
{
|
||||||
$expectedResult = self::INITIAL_RANGE;
|
$expectedResult = self::INITIAL_RANGE;
|
||||||
$sheet = $this->getSheet();
|
$table = new Table(self::INITIAL_RANGE);
|
||||||
$table = new Table(self::INITIAL_RANGE, $sheet);
|
|
||||||
|
|
||||||
// magic __toString should return the active table range
|
// magic __toString should return the active table range
|
||||||
$result = (string) $table;
|
$result = (string) $table;
|
||||||
|
|
@ -27,8 +26,7 @@ class TableTest extends SetupTeardown
|
||||||
*/
|
*/
|
||||||
public function testValidTableNames(string $name, string $expected): void
|
public function testValidTableNames(string $name, string $expected): void
|
||||||
{
|
{
|
||||||
$sheet = $this->getSheet();
|
$table = new Table(self::INITIAL_RANGE);
|
||||||
$table = new Table(self::INITIAL_RANGE, $sheet);
|
|
||||||
|
|
||||||
$result = $table->setName($name);
|
$result = $table->setName($name);
|
||||||
self::assertInstanceOf(Table::class, $result);
|
self::assertInstanceOf(Table::class, $result);
|
||||||
|
|
@ -38,6 +36,7 @@ class TableTest extends SetupTeardown
|
||||||
public function validTableNamesProvider(): array
|
public function validTableNamesProvider(): array
|
||||||
{
|
{
|
||||||
return [
|
return [
|
||||||
|
['', ''],
|
||||||
['Table_1', 'Table_1'],
|
['Table_1', 'Table_1'],
|
||||||
['_table_2', '_table_2'],
|
['_table_2', '_table_2'],
|
||||||
['\table_3', '\table_3'],
|
['\table_3', '\table_3'],
|
||||||
|
|
@ -52,8 +51,7 @@ class TableTest extends SetupTeardown
|
||||||
*/
|
*/
|
||||||
public function testInvalidTableNames(string $name): void
|
public function testInvalidTableNames(string $name): void
|
||||||
{
|
{
|
||||||
$sheet = $this->getSheet();
|
$table = new Table(self::INITIAL_RANGE);
|
||||||
$table = new Table(self::INITIAL_RANGE, $sheet);
|
|
||||||
|
|
||||||
$this->expectException(PhpSpreadsheetException::class);
|
$this->expectException(PhpSpreadsheetException::class);
|
||||||
|
|
||||||
|
|
@ -95,8 +93,7 @@ class TableTest extends SetupTeardown
|
||||||
|
|
||||||
public function testVariousSets(): void
|
public function testVariousSets(): void
|
||||||
{
|
{
|
||||||
$sheet = $this->getSheet();
|
$table = new Table(self::INITIAL_RANGE);
|
||||||
$table = new Table(self::INITIAL_RANGE, $sheet);
|
|
||||||
|
|
||||||
$result = $table->setShowHeaderRow(false);
|
$result = $table->setShowHeaderRow(false);
|
||||||
self::assertInstanceOf(Table::class, $result);
|
self::assertInstanceOf(Table::class, $result);
|
||||||
|
|
@ -110,15 +107,15 @@ class TableTest extends SetupTeardown
|
||||||
public function testGetWorksheet(): void
|
public function testGetWorksheet(): void
|
||||||
{
|
{
|
||||||
$sheet = $this->getSheet();
|
$sheet = $this->getSheet();
|
||||||
$table = new Table(self::INITIAL_RANGE, $sheet);
|
$table = new Table(self::INITIAL_RANGE);
|
||||||
|
$sheet->addTable($table);
|
||||||
$result = $table->getWorksheet();
|
$result = $table->getWorksheet();
|
||||||
self::assertSame($sheet, $result);
|
self::assertSame($sheet, $result);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testSetWorksheet(): void
|
public function testSetWorksheet(): void
|
||||||
{
|
{
|
||||||
$sheet = $this->getSheet();
|
$table = new Table(self::INITIAL_RANGE);
|
||||||
$table = new Table(self::INITIAL_RANGE, $sheet);
|
|
||||||
$spreadsheet = $this->getSpreadsheet();
|
$spreadsheet = $this->getSpreadsheet();
|
||||||
$sheet2 = $spreadsheet->createSheet();
|
$sheet2 = $spreadsheet->createSheet();
|
||||||
// Setters return the instance to implement the fluent interface
|
// Setters return the instance to implement the fluent interface
|
||||||
|
|
@ -129,8 +126,7 @@ class TableTest extends SetupTeardown
|
||||||
public function testGetRange(): void
|
public function testGetRange(): void
|
||||||
{
|
{
|
||||||
$expectedResult = self::INITIAL_RANGE;
|
$expectedResult = self::INITIAL_RANGE;
|
||||||
$sheet = $this->getSheet();
|
$table = new Table(self::INITIAL_RANGE);
|
||||||
$table = new Table(self::INITIAL_RANGE, $sheet);
|
|
||||||
|
|
||||||
// Result should be the active table range
|
// Result should be the active table range
|
||||||
$result = $table->getRange();
|
$result = $table->getRange();
|
||||||
|
|
@ -141,7 +137,7 @@ class TableTest extends SetupTeardown
|
||||||
{
|
{
|
||||||
$sheet = $this->getSheet();
|
$sheet = $this->getSheet();
|
||||||
$title = $sheet->getTitle();
|
$title = $sheet->getTitle();
|
||||||
$table = new Table(self::INITIAL_RANGE, $sheet);
|
$table = new Table(self::INITIAL_RANGE);
|
||||||
$ranges = [
|
$ranges = [
|
||||||
'G1:J512' => "$title!G1:J512",
|
'G1:J512' => "$title!G1:J512",
|
||||||
'K1:N20' => 'K1:N20',
|
'K1:N20' => 'K1:N20',
|
||||||
|
|
@ -161,8 +157,7 @@ class TableTest extends SetupTeardown
|
||||||
public function testClearRange(): void
|
public function testClearRange(): void
|
||||||
{
|
{
|
||||||
$expectedResult = '';
|
$expectedResult = '';
|
||||||
$sheet = $this->getSheet();
|
$table = new Table(self::INITIAL_RANGE);
|
||||||
$table = new Table(self::INITIAL_RANGE, $sheet);
|
|
||||||
|
|
||||||
// Setters return the instance to implement the fluent interface
|
// Setters return the instance to implement the fluent interface
|
||||||
$result = $table->setRange('');
|
$result = $table->setRange('');
|
||||||
|
|
@ -180,8 +175,7 @@ class TableTest extends SetupTeardown
|
||||||
{
|
{
|
||||||
$this->expectException(PhpSpreadsheetException::class);
|
$this->expectException(PhpSpreadsheetException::class);
|
||||||
|
|
||||||
$sheet = $this->getSheet();
|
new Table($range);
|
||||||
new Table($range, $sheet);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function invalidTableRangeProvider(): array
|
public function invalidTableRangeProvider(): array
|
||||||
|
|
@ -198,8 +192,7 @@ class TableTest extends SetupTeardown
|
||||||
public function testGetColumnsEmpty(): void
|
public function testGetColumnsEmpty(): void
|
||||||
{
|
{
|
||||||
// There should be no columns yet defined
|
// There should be no columns yet defined
|
||||||
$sheet = $this->getSheet();
|
$table = new Table(self::INITIAL_RANGE);
|
||||||
$table = new Table(self::INITIAL_RANGE, $sheet);
|
|
||||||
$result = $table->getColumns();
|
$result = $table->getColumns();
|
||||||
self::assertIsArray($result);
|
self::assertIsArray($result);
|
||||||
self::assertCount(0, $result);
|
self::assertCount(0, $result);
|
||||||
|
|
@ -212,8 +205,7 @@ class TableTest extends SetupTeardown
|
||||||
'K' => 3,
|
'K' => 3,
|
||||||
'M' => 5,
|
'M' => 5,
|
||||||
];
|
];
|
||||||
$sheet = $this->getSheet();
|
$table = new Table(self::INITIAL_RANGE);
|
||||||
$table = new Table(self::INITIAL_RANGE, $sheet);
|
|
||||||
|
|
||||||
// If we request a specific column by its column ID, we should get an
|
// If we request a specific column by its column ID, we should get an
|
||||||
// integer returned representing the column offset within the range
|
// integer returned representing the column offset within the range
|
||||||
|
|
@ -296,8 +288,7 @@ class TableTest extends SetupTeardown
|
||||||
public function testSetColumnWithString(): void
|
public function testSetColumnWithString(): void
|
||||||
{
|
{
|
||||||
$expectedResult = 'L';
|
$expectedResult = 'L';
|
||||||
$sheet = $this->getSheet();
|
$table = new Table(self::INITIAL_RANGE);
|
||||||
$table = new Table(self::INITIAL_RANGE, $sheet);
|
|
||||||
|
|
||||||
// Setters return the instance to implement the fluent interface
|
// Setters return the instance to implement the fluent interface
|
||||||
$result = $table->setColumn($expectedResult);
|
$result = $table->setColumn($expectedResult);
|
||||||
|
|
@ -315,8 +306,7 @@ class TableTest extends SetupTeardown
|
||||||
public function testSetInvalidColumnWithString(): void
|
public function testSetInvalidColumnWithString(): void
|
||||||
{
|
{
|
||||||
$this->expectException(PhpSpreadsheetException::class);
|
$this->expectException(PhpSpreadsheetException::class);
|
||||||
$sheet = $this->getSheet();
|
$table = new Table(self::INITIAL_RANGE);
|
||||||
$table = new Table(self::INITIAL_RANGE, $sheet);
|
|
||||||
|
|
||||||
$invalidColumn = 'A';
|
$invalidColumn = 'A';
|
||||||
$table->setColumn($invalidColumn);
|
$table->setColumn($invalidColumn);
|
||||||
|
|
@ -326,8 +316,7 @@ class TableTest extends SetupTeardown
|
||||||
{
|
{
|
||||||
$expectedResult = 'M';
|
$expectedResult = 'M';
|
||||||
$columnObject = new Column($expectedResult);
|
$columnObject = new Column($expectedResult);
|
||||||
$sheet = $this->getSheet();
|
$table = new Table(self::INITIAL_RANGE);
|
||||||
$table = new Table(self::INITIAL_RANGE, $sheet);
|
|
||||||
|
|
||||||
// Setters return the instance to implement the fluent interface
|
// Setters return the instance to implement the fluent interface
|
||||||
$result = $table->setColumn($columnObject);
|
$result = $table->setColumn($columnObject);
|
||||||
|
|
@ -347,8 +336,7 @@ class TableTest extends SetupTeardown
|
||||||
$this->expectException(PhpSpreadsheetException::class);
|
$this->expectException(PhpSpreadsheetException::class);
|
||||||
|
|
||||||
$invalidColumn = 'E';
|
$invalidColumn = 'E';
|
||||||
$sheet = $this->getSheet();
|
$table = new Table(self::INITIAL_RANGE);
|
||||||
$table = new Table(self::INITIAL_RANGE, $sheet);
|
|
||||||
$table->setColumn($invalidColumn);
|
$table->setColumn($invalidColumn);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -356,8 +344,7 @@ class TableTest extends SetupTeardown
|
||||||
{
|
{
|
||||||
$this->expectException(PhpSpreadsheetException::class);
|
$this->expectException(PhpSpreadsheetException::class);
|
||||||
|
|
||||||
$sheet = $this->getSheet();
|
$table = new Table(self::INITIAL_RANGE);
|
||||||
$table = new Table(self::INITIAL_RANGE, $sheet);
|
|
||||||
$invalidColumn = 123.456;
|
$invalidColumn = 123.456;
|
||||||
// @phpstan-ignore-next-line
|
// @phpstan-ignore-next-line
|
||||||
$table->setColumn($invalidColumn);
|
$table->setColumn($invalidColumn);
|
||||||
|
|
@ -365,8 +352,7 @@ class TableTest extends SetupTeardown
|
||||||
|
|
||||||
public function testGetColumns(): void
|
public function testGetColumns(): void
|
||||||
{
|
{
|
||||||
$sheet = $this->getSheet();
|
$table = new Table(self::INITIAL_RANGE);
|
||||||
$table = new Table(self::INITIAL_RANGE, $sheet);
|
|
||||||
|
|
||||||
$columnIndexes = ['L', 'M'];
|
$columnIndexes = ['L', 'M'];
|
||||||
|
|
||||||
|
|
@ -391,8 +377,7 @@ class TableTest extends SetupTeardown
|
||||||
|
|
||||||
public function testGetColumn(): void
|
public function testGetColumn(): void
|
||||||
{
|
{
|
||||||
$sheet = $this->getSheet();
|
$table = new Table(self::INITIAL_RANGE);
|
||||||
$table = new Table(self::INITIAL_RANGE, $sheet);
|
|
||||||
|
|
||||||
$columnIndexes = ['L', 'M'];
|
$columnIndexes = ['L', 'M'];
|
||||||
|
|
||||||
|
|
@ -410,8 +395,7 @@ class TableTest extends SetupTeardown
|
||||||
|
|
||||||
public function testGetColumnByOffset(): void
|
public function testGetColumnByOffset(): void
|
||||||
{
|
{
|
||||||
$sheet = $this->getSheet();
|
$table = new Table(self::INITIAL_RANGE);
|
||||||
$table = new Table(self::INITIAL_RANGE, $sheet);
|
|
||||||
|
|
||||||
$columnIndexes = [
|
$columnIndexes = [
|
||||||
0 => 'H',
|
0 => 'H',
|
||||||
|
|
@ -430,8 +414,7 @@ class TableTest extends SetupTeardown
|
||||||
|
|
||||||
public function testGetColumnIfNotSet(): void
|
public function testGetColumnIfNotSet(): void
|
||||||
{
|
{
|
||||||
$sheet = $this->getSheet();
|
$table = new Table(self::INITIAL_RANGE);
|
||||||
$table = new Table(self::INITIAL_RANGE, $sheet);
|
|
||||||
// If we request a specific column by its column ID, we should
|
// If we request a specific column by its column ID, we should
|
||||||
// get a \PhpOffice\PhpSpreadsheet\Worksheet\Worksheet\Table\Column object returned
|
// get a \PhpOffice\PhpSpreadsheet\Worksheet\Worksheet\Table\Column object returned
|
||||||
$result = $table->getColumn('K');
|
$result = $table->getColumn('K');
|
||||||
|
|
@ -441,8 +424,7 @@ class TableTest extends SetupTeardown
|
||||||
public function testGetColumnWithoutRangeSet(): void
|
public function testGetColumnWithoutRangeSet(): void
|
||||||
{
|
{
|
||||||
$this->expectException(\PhpOffice\PhpSpreadsheet\Exception::class);
|
$this->expectException(\PhpOffice\PhpSpreadsheet\Exception::class);
|
||||||
$sheet = $this->getSheet();
|
$table = new Table(self::INITIAL_RANGE);
|
||||||
$table = new Table(self::INITIAL_RANGE, $sheet);
|
|
||||||
|
|
||||||
// Clear the range
|
// Clear the range
|
||||||
$table->setRange('');
|
$table->setRange('');
|
||||||
|
|
@ -451,8 +433,7 @@ class TableTest extends SetupTeardown
|
||||||
|
|
||||||
public function testClearRangeWithExistingColumns(): void
|
public function testClearRangeWithExistingColumns(): void
|
||||||
{
|
{
|
||||||
$sheet = $this->getSheet();
|
$table = new Table(self::INITIAL_RANGE);
|
||||||
$table = new Table(self::INITIAL_RANGE, $sheet);
|
|
||||||
$expectedResult = '';
|
$expectedResult = '';
|
||||||
|
|
||||||
$columnIndexes = ['L', 'M', 'N'];
|
$columnIndexes = ['L', 'M', 'N'];
|
||||||
|
|
@ -476,8 +457,7 @@ class TableTest extends SetupTeardown
|
||||||
|
|
||||||
public function testSetRangeWithExistingColumns(): void
|
public function testSetRangeWithExistingColumns(): void
|
||||||
{
|
{
|
||||||
$sheet = $this->getSheet();
|
$table = new Table(self::INITIAL_RANGE);
|
||||||
$table = new Table(self::INITIAL_RANGE, $sheet);
|
|
||||||
$expectedResult = 'G1:J512';
|
$expectedResult = 'G1:J512';
|
||||||
|
|
||||||
// These columns should be retained
|
// These columns should be retained
|
||||||
|
|
@ -509,7 +489,8 @@ class TableTest extends SetupTeardown
|
||||||
public function testClone(): void
|
public function testClone(): void
|
||||||
{
|
{
|
||||||
$sheet = $this->getSheet();
|
$sheet = $this->getSheet();
|
||||||
$table = new Table(self::INITIAL_RANGE, $sheet);
|
$table = new Table(self::INITIAL_RANGE);
|
||||||
|
$sheet->addTable($table);
|
||||||
$columnIndexes = ['L', 'M'];
|
$columnIndexes = ['L', 'M'];
|
||||||
|
|
||||||
foreach ($columnIndexes as $columnIndex) {
|
foreach ($columnIndexes as $columnIndex) {
|
||||||
|
|
@ -546,8 +527,7 @@ class TableTest extends SetupTeardown
|
||||||
|
|
||||||
public function testClearColumn(): void
|
public function testClearColumn(): void
|
||||||
{
|
{
|
||||||
$sheet = $this->getSheet();
|
$table = new Table(self::INITIAL_RANGE);
|
||||||
$table = new Table(self::INITIAL_RANGE, $sheet);
|
|
||||||
$columnIndexes = ['J', 'K', 'L', 'M'];
|
$columnIndexes = ['J', 'K', 'L', 'M'];
|
||||||
|
|
||||||
foreach ($columnIndexes as $columnIndex) {
|
foreach ($columnIndexes as $columnIndex) {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue