Allow single cell AutoFilter range

This commit is contained in:
MarkBaker 2022-10-08 12:42:01 +02:00
parent 88bbac9849
commit 339a5933c7
3 changed files with 22 additions and 6 deletions

View File

@ -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;

View File

@ -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]);
if (count($range) > 1) {
$range[1] = Coordinate::absoluteCoordinate($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);

View File

@ -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();