Implement basic autofilter ranges with Gnumeric Reader (#2057)

* Load basic autofilter ranges with Gnumeric Reader
* Handle null values passed to row height/column with/merged cells/autofilters
This commit is contained in:
Mark Baker 2021-05-04 22:32:12 +02:00 committed by GitHub
parent 4be9366722
commit 5ee4fbf090
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 56 additions and 9 deletions

View File

@ -10,6 +10,7 @@ and this project adheres to [Semantic Versioning](https://semver.org).
### Added ### Added
- Implemented basic AutoFiltering for Ods Reader and Writer [PR #2053](https://github.com/PHPOffice/PhpSpreadsheet/pull/2053) - Implemented basic AutoFiltering for Ods Reader and Writer [PR #2053](https://github.com/PHPOffice/PhpSpreadsheet/pull/2053)
- Implemented basic AutoFiltering for Gnumeric Reader [PR #2055](https://github.com/PHPOffice/PhpSpreadsheet/pull/2055)
- Improved support for Row and Column ranges in formulae [Issue #1755](https://github.com/PHPOffice/PhpSpreadsheet/issues/1755) [PR #2028](https://github.com/PHPOffice/PhpSpreadsheet/pull/2028) - Improved support for Row and Column ranges in formulae [Issue #1755](https://github.com/PHPOffice/PhpSpreadsheet/issues/1755) [PR #2028](https://github.com/PHPOffice/PhpSpreadsheet/pull/2028)
- Implemented URLENCODE() Web Function - Implemented URLENCODE() Web Function
- Implemented the CHITEST(), CHISQ.DIST() and CHISQ.INV() and equivalent Statistical functions, for both left- and right-tailed distributions. - Implemented the CHITEST(), CHISQ.DIST() and CHISQ.INV() and equivalent Statistical functions, for both left- and right-tailed distributions.

View File

@ -1314,7 +1314,7 @@
<td style="text-align: center; color: orange;"></td> <td style="text-align: center; color: orange;"></td>
<td></td> <td></td>
<td style="text-align: center; color: orange;"></td> <td style="text-align: center; color: orange;"></td>
<td></td> <td style="text-align: center; color: orange;"></td>
<td></td> <td></td>
<td></td> <td></td>
<td style="text-align: center; color: orange;"></td> <td style="text-align: center; color: orange;"></td>

View File

@ -482,6 +482,7 @@ class Gnumeric extends BaseReader
$this->processColumnWidths($sheet, $maxCol); $this->processColumnWidths($sheet, $maxCol);
$this->processRowHeights($sheet, $maxRow); $this->processRowHeights($sheet, $maxRow);
$this->processMergedCells($sheet); $this->processMergedCells($sheet);
$this->processAutofilter($sheet);
++$worksheetID; ++$worksheetID;
} }
@ -514,10 +515,10 @@ class Gnumeric extends BaseReader
} }
} }
private function processMergedCells(SimpleXMLElement $sheet): void private function processMergedCells(?SimpleXMLElement $sheet): void
{ {
// Handle Merged Cells in this worksheet // Handle Merged Cells in this worksheet
if (isset($sheet->MergedRegions)) { if ($sheet !== null && isset($sheet->MergedRegions)) {
foreach ($sheet->MergedRegions->Merge as $mergeCells) { foreach ($sheet->MergedRegions->Merge as $mergeCells) {
if (strpos($mergeCells, ':') !== false) { if (strpos($mergeCells, ':') !== false) {
$this->spreadsheet->getActiveSheet()->mergeCells($mergeCells); $this->spreadsheet->getActiveSheet()->mergeCells($mergeCells);
@ -526,6 +527,20 @@ class Gnumeric extends BaseReader
} }
} }
private function processAutofilter(?SimpleXMLElement $sheet): void
{
if ($sheet !== null && isset($sheet->Filters)) {
foreach ($sheet->Filters->Filter as $autofilter) {
if ($autofilter !== null) {
$attributes = $autofilter->attributes();
if (isset($attributes['Area'])) {
$this->spreadsheet->getActiveSheet()->setAutoFilter((string) $attributes['Area']);
}
}
}
}
}
private function setColumnWidth(int $whichColumn, float $defaultWidth): void private function setColumnWidth(int $whichColumn, float $defaultWidth): void
{ {
$columnDimension = $this->spreadsheet->getActiveSheet()->getColumnDimension(Coordinate::stringFromColumnIndex($whichColumn + 1)); $columnDimension = $this->spreadsheet->getActiveSheet()->getColumnDimension(Coordinate::stringFromColumnIndex($whichColumn + 1));
@ -564,9 +579,9 @@ class Gnumeric extends BaseReader
return $whichColumn; return $whichColumn;
} }
private function processColumnWidths(SimpleXMLElement $sheet, int $maxCol): void private function processColumnWidths(?SimpleXMLElement $sheet, int $maxCol): void
{ {
if ((!$this->readDataOnly) && (isset($sheet->Cols))) { if ((!$this->readDataOnly) && $sheet !== null && (isset($sheet->Cols))) {
// Column Widths // Column Widths
$defaultWidth = 0; $defaultWidth = 0;
$columnAttributes = $sheet->Cols->attributes(); $columnAttributes = $sheet->Cols->attributes();
@ -622,9 +637,9 @@ class Gnumeric extends BaseReader
return $whichRow; return $whichRow;
} }
private function processRowHeights(SimpleXMLElement $sheet, int $maxRow): void private function processRowHeights(?SimpleXMLElement $sheet, int $maxRow): void
{ {
if ((!$this->readDataOnly) && (isset($sheet->Rows))) { if ((!$this->readDataOnly) && $sheet !== null && (isset($sheet->Rows))) {
// Row Heights // Row Heights
$defaultHeight = 0; $defaultHeight = 0;
$rowAttributes = $sheet->Rows->attributes(); $rowAttributes = $sheet->Rows->attributes();
@ -646,10 +661,10 @@ class Gnumeric extends BaseReader
} }
} }
private function processDefinedNames(SimpleXMLElement $gnmXML): void private function processDefinedNames(?SimpleXMLElement $gnmXML): void
{ {
// Loop through definedNames (global named ranges) // Loop through definedNames (global named ranges)
if (isset($gnmXML->Names)) { if ($gnmXML !== null && isset($gnmXML->Names)) {
foreach ($gnmXML->Names->Name as $definedName) { foreach ($gnmXML->Names->Name as $definedName) {
$name = (string) $definedName->name; $name = (string) $definedName->name;
$value = (string) $definedName->value; $value = (string) $definedName->value;

View File

@ -0,0 +1,31 @@
<?php
namespace PhpOffice\PhpSpreadsheetTests\Reader\Gnumeric;
use PhpOffice\PhpSpreadsheet\Reader\Gnumeric;
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PHPUnit\Framework\TestCase;
class AutoFilterTest extends TestCase
{
/**
* @var Spreadsheet
*/
private $spreadsheet;
protected function setUp(): void
{
$filename = 'tests/data/Reader/Gnumeric/Autofilter_Basic.gnumeric';
$reader = new Gnumeric();
$this->spreadsheet = $reader->load($filename);
}
public function testAutoFilterRange(): void
{
$worksheet = $this->spreadsheet->getActiveSheet();
$autoFilterRange = $worksheet->getAutoFilter()->getRange();
self::assertSame('A1:D57', $autoFilterRange);
}
}

Binary file not shown.