Allow single cell AutoFilter range
This commit is contained in:
parent
88bbac9849
commit
339a5933c7
|
|
@ -9,6 +9,7 @@ use PhpOffice\PhpSpreadsheet\Calculation\Functions;
|
||||||
use PhpOffice\PhpSpreadsheet\Calculation\Internal\WildcardMatch;
|
use PhpOffice\PhpSpreadsheet\Calculation\Internal\WildcardMatch;
|
||||||
use PhpOffice\PhpSpreadsheet\Cell\AddressRange;
|
use PhpOffice\PhpSpreadsheet\Cell\AddressRange;
|
||||||
use PhpOffice\PhpSpreadsheet\Cell\Coordinate;
|
use PhpOffice\PhpSpreadsheet\Cell\Coordinate;
|
||||||
|
use PhpOffice\PhpSpreadsheet\Exception;
|
||||||
use PhpOffice\PhpSpreadsheet\Exception as PhpSpreadsheetException;
|
use PhpOffice\PhpSpreadsheet\Exception as PhpSpreadsheetException;
|
||||||
use PhpOffice\PhpSpreadsheet\Shared\Date;
|
use PhpOffice\PhpSpreadsheet\Shared\Date;
|
||||||
use PhpOffice\PhpSpreadsheet\Worksheet\AutoFilter\Column\Rule;
|
use PhpOffice\PhpSpreadsheet\Worksheet\AutoFilter\Column\Rule;
|
||||||
|
|
@ -104,7 +105,7 @@ class AutoFilter
|
||||||
* Set AutoFilter Cell Range.
|
* Set AutoFilter Cell Range.
|
||||||
*
|
*
|
||||||
* @param AddressRange|array<int>|string $range
|
* @param AddressRange|array<int>|string $range
|
||||||
* A simple string containing a Cell range like 'A1:E10' is permitted
|
* A simple string containing a Cell range like 'A1:E10' or a Cell address like 'A1' is permitted
|
||||||
* or passing in an array of [$fromColumnIndex, $fromRow, $toColumnIndex, $toRow] (e.g. [3, 5, 6, 8]),
|
* or passing in an array of [$fromColumnIndex, $fromRow, $toColumnIndex, $toRow] (e.g. [3, 5, 6, 8]),
|
||||||
* or an AddressRange object.
|
* or an AddressRange object.
|
||||||
*/
|
*/
|
||||||
|
|
@ -115,6 +116,7 @@ class AutoFilter
|
||||||
if ($range !== '') {
|
if ($range !== '') {
|
||||||
[, $range] = Worksheet::extractSheetTitle(Validations::validateCellRange($range), true);
|
[, $range] = Worksheet::extractSheetTitle(Validations::validateCellRange($range), true);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (empty($range)) {
|
if (empty($range)) {
|
||||||
// Discard all column rules
|
// Discard all column rules
|
||||||
$this->columns = [];
|
$this->columns = [];
|
||||||
|
|
@ -123,8 +125,8 @@ class AutoFilter
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (strpos($range, ':') === false) {
|
if (ctype_digit($range) || ctype_alpha($range)) {
|
||||||
throw new PhpSpreadsheetException('Autofilter must be set on a range of cells.');
|
throw new Exception("{$range} is an invalid range for AutoFilter");
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->range = $range;
|
$this->range = $range;
|
||||||
|
|
|
||||||
|
|
@ -115,7 +115,9 @@ class DefinedNames
|
||||||
[, $range[0]] = Worksheet::extractSheetTitle($range[0], true);
|
[, $range[0]] = Worksheet::extractSheetTitle($range[0], true);
|
||||||
|
|
||||||
$range[0] = Coordinate::absoluteCoordinate($range[0]);
|
$range[0] = Coordinate::absoluteCoordinate($range[0]);
|
||||||
$range[1] = Coordinate::absoluteCoordinate($range[1]);
|
if (count($range) > 1) {
|
||||||
|
$range[1] = Coordinate::absoluteCoordinate($range[1]);
|
||||||
|
}
|
||||||
$range = implode(':', $range);
|
$range = implode(':', $range);
|
||||||
|
|
||||||
$this->objWriter->writeRawData('\'' . str_replace("'", "''", $worksheet->getTitle()) . '\'!' . $range);
|
$this->objWriter->writeRawData('\'' . str_replace("'", "''", $worksheet->getTitle()) . '\'!' . $range);
|
||||||
|
|
|
||||||
|
|
@ -65,6 +65,7 @@ class AutoFilterTest extends SetupTeardown
|
||||||
$ranges = [
|
$ranges = [
|
||||||
'G1:J512' => "$title!G1:J512",
|
'G1:J512' => "$title!G1:J512",
|
||||||
'K1:N20' => 'K1:N20',
|
'K1:N20' => 'K1:N20',
|
||||||
|
'B10' => 'B10',
|
||||||
];
|
];
|
||||||
|
|
||||||
foreach ($ranges as $actualRange => $fullRange) {
|
foreach ($ranges as $actualRange => $fullRange) {
|
||||||
|
|
@ -94,11 +95,22 @@ class AutoFilterTest extends SetupTeardown
|
||||||
self::assertEquals($expectedResult, $result);
|
self::assertEquals($expectedResult, $result);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testSetRangeInvalidRange(): void
|
public function testSetRangeInvalidRowRange(): void
|
||||||
{
|
{
|
||||||
$this->expectException(PhpSpreadsheetException::class);
|
$this->expectException(PhpSpreadsheetException::class);
|
||||||
|
|
||||||
$expectedResult = 'A1';
|
$expectedResult = '999';
|
||||||
|
|
||||||
|
$sheet = $this->getSheet();
|
||||||
|
$autoFilter = $sheet->getAutoFilter();
|
||||||
|
$autoFilter->setRange($expectedResult);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testSetRangeInvalidColumnRange(): void
|
||||||
|
{
|
||||||
|
$this->expectException(PhpSpreadsheetException::class);
|
||||||
|
|
||||||
|
$expectedResult = 'ABC';
|
||||||
|
|
||||||
$sheet = $this->getSheet();
|
$sheet = $this->getSheet();
|
||||||
$autoFilter = $sheet->getAutoFilter();
|
$autoFilter = $sheet->getAutoFilter();
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue