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\Cell\AddressRange;
|
||||
use PhpOffice\PhpSpreadsheet\Cell\Coordinate;
|
||||
use PhpOffice\PhpSpreadsheet\Exception;
|
||||
use PhpOffice\PhpSpreadsheet\Exception as PhpSpreadsheetException;
|
||||
use PhpOffice\PhpSpreadsheet\Shared\Date;
|
||||
use PhpOffice\PhpSpreadsheet\Worksheet\AutoFilter\Column\Rule;
|
||||
|
|
@ -104,7 +105,7 @@ class AutoFilter
|
|||
* Set AutoFilter Cell 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 an AddressRange object.
|
||||
*/
|
||||
|
|
@ -115,6 +116,7 @@ class AutoFilter
|
|||
if ($range !== '') {
|
||||
[, $range] = Worksheet::extractSheetTitle(Validations::validateCellRange($range), true);
|
||||
}
|
||||
|
||||
if (empty($range)) {
|
||||
// Discard all column rules
|
||||
$this->columns = [];
|
||||
|
|
@ -123,8 +125,8 @@ class AutoFilter
|
|||
return $this;
|
||||
}
|
||||
|
||||
if (strpos($range, ':') === false) {
|
||||
throw new PhpSpreadsheetException('Autofilter must be set on a range of cells.');
|
||||
if (ctype_digit($range) || ctype_alpha($range)) {
|
||||
throw new Exception("{$range} is an invalid range for AutoFilter");
|
||||
}
|
||||
|
||||
$this->range = $range;
|
||||
|
|
|
|||
|
|
@ -115,7 +115,9 @@ class DefinedNames
|
|||
[, $range[0]] = Worksheet::extractSheetTitle($range[0], true);
|
||||
|
||||
$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);
|
||||
|
||||
$this->objWriter->writeRawData('\'' . str_replace("'", "''", $worksheet->getTitle()) . '\'!' . $range);
|
||||
|
|
|
|||
|
|
@ -65,6 +65,7 @@ class AutoFilterTest extends SetupTeardown
|
|||
$ranges = [
|
||||
'G1:J512' => "$title!G1:J512",
|
||||
'K1:N20' => 'K1:N20',
|
||||
'B10' => 'B10',
|
||||
];
|
||||
|
||||
foreach ($ranges as $actualRange => $fullRange) {
|
||||
|
|
@ -94,11 +95,22 @@ class AutoFilterTest extends SetupTeardown
|
|||
self::assertEquals($expectedResult, $result);
|
||||
}
|
||||
|
||||
public function testSetRangeInvalidRange(): void
|
||||
public function testSetRangeInvalidRowRange(): void
|
||||
{
|
||||
$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();
|
||||
$autoFilter = $sheet->getAutoFilter();
|
||||
|
|
|
|||
Loading…
Reference in New Issue