Modify rangeBoundaries(), rangeDimension() and getRangeBoundaries() methods to work with row/column ranges as well as with cell ranges and cells

This commit is contained in:
MarkBaker 2022-07-06 03:13:09 +02:00
parent c22c6df5b5
commit ad15232fc7
3 changed files with 87 additions and 55 deletions

View File

@ -183,12 +183,12 @@ abstract class Coordinate
/** /**
* Calculate range boundaries. * Calculate range boundaries.
* *
* @param string $range Cell range (e.g. A1:A1) * @param string $range Cell range, Single Cell, Row/Column Range (e.g. A1:A1, B2, B:C, 2:3)
* *
* @return array Range coordinates [Start Cell, End Cell] * @return array Range coordinates [Start Cell, End Cell]
* where Start Cell and End Cell are arrays (Column Number, Row Number) * where Start Cell and End Cell are arrays (Column Number, Row Number)
*/ */
public static function rangeBoundaries($range) public static function rangeBoundaries(string $range): array
{ {
// Ensure $pRange is a valid range // Ensure $pRange is a valid range
if (empty($range)) { if (empty($range)) {
@ -205,6 +205,16 @@ abstract class Coordinate
[$rangeA, $rangeB] = explode(':', $range); [$rangeA, $rangeB] = explode(':', $range);
} }
if (is_numeric($rangeA) && is_numeric($rangeB)) {
$rangeA = 'A' . $rangeA;
$rangeB = AddressRange::MAX_COLUMN . $rangeB;
}
if (ctype_alpha($rangeA) && ctype_alpha($rangeB)) {
$rangeA = $rangeA . '1';
$rangeB = $rangeB . AddressRange::MAX_ROW;
}
// Calculate range outer borders // Calculate range outer borders
$rangeStart = self::coordinateFromString($rangeA); $rangeStart = self::coordinateFromString($rangeA);
$rangeEnd = self::coordinateFromString($rangeB); $rangeEnd = self::coordinateFromString($rangeB);
@ -219,7 +229,7 @@ abstract class Coordinate
/** /**
* Calculate range dimension. * Calculate range dimension.
* *
* @param string $range Cell range (e.g. A1:A1) * @param string $range Cell range, Single Cell, Row/Column Range (e.g. A1:A1, B2, B:C, 2:3)
* *
* @return array Range dimension (width, height) * @return array Range dimension (width, height)
*/ */
@ -234,29 +244,19 @@ abstract class Coordinate
/** /**
* Calculate range boundaries. * Calculate range boundaries.
* *
* @param string $range Cell range (e.g. A1:A1) * @param string $range Cell range, Single Cell, Row/Column Range (e.g. A1:A1, B2, B:C, 2:3)
* *
* @return array Range coordinates [Start Cell, End Cell] * @return array Range coordinates [Start Cell, End Cell]
* where Start Cell and End Cell are arrays [Column ID, Row Number] * where Start Cell and End Cell are arrays [Column ID, Row Number]
*/ */
public static function getRangeBoundaries($range) public static function getRangeBoundaries($range)
{ {
// Ensure $pRange is a valid range [$rangeA, $rangeB] = self::rangeBoundaries($range);
if (empty($range)) {
$range = self::DEFAULT_RANGE;
}
// Uppercase coordinate return [
$range = strtoupper($range); [self::stringFromColumnIndex($rangeA[0]), $rangeA[1]],
[self::stringFromColumnIndex($rangeB[0]), $rangeB[1]],
// Extract range ];
if (strpos($range, ':') === false) {
$rangeA = $rangeB = $range;
} else {
[$rangeA, $rangeB] = explode(':', $range);
}
return [self::coordinateFromString($rangeA), self::coordinateFromString($rangeB)];
} }
/** /**

View File

@ -2,29 +2,45 @@
return [ return [
[ [
[ 'Cell Range' => [
[ ['B', 4],
'B', ['E', 9],
4,
],
[
'E',
9,
],
], ],
'B4:E9', 'B4:E9',
], ],
'Single Cell' => [
[ [
[ ['B', 4],
[ ['B', 4],
'B',
4,
],
[
'B',
4,
],
], ],
'B4', 'B4',
], ],
'Column Range' => [
[
['B', 1],
['C', 1048576],
],
'B:C',
],
'Single Column Range' => [
[
['B', 1],
['B', 1048576],
],
'B:B',
],
'Row Range' => [
[
['A', 2],
['XFD', 3],
],
'2:3',
],
'Single Row Range' => [
[
['A', 2],
['XFD', 2],
],
'2:2',
],
]; ];

View File

@ -1,30 +1,46 @@
<?php <?php
return [ return [
'Cell Range' => [
[ [
[ [2, 4],
[ [5, 9],
2,
4,
],
[
5,
9,
],
], ],
'B4:E9', 'B4:E9',
], ],
'Single Cell' => [
[ [
[ [2, 4],
[ [2, 4],
2,
4,
],
[
2,
4,
],
], ],
'B4', 'B4',
], ],
'Column Range' => [
[
[2, 1],
[3, 1048576],
],
'B:C',
],
'Single Column Range' => [
[
[2, 1],
[2, 1048576],
],
'B:B',
],
'Row Range' => [
[
[1, 2],
[16384, 3],
],
'2:3',
],
'Single Row Range' => [
[
[1, 2],
[16384, 2],
],
'2:2',
],
]; ];