Skip to content

Commit

Permalink
Merge pull request #3992 from oleibman/issue3988
Browse files Browse the repository at this point in the history
Table Filter Buttons
  • Loading branch information
oleibman committed Apr 20, 2024
2 parents e9f03df + 98ab11c commit 3427257
Show file tree
Hide file tree
Showing 3 changed files with 105 additions and 2 deletions.
2 changes: 1 addition & 1 deletion src/PhpSpreadsheet/Worksheet/AutoFilter.php
Original file line number Diff line number Diff line change
Expand Up @@ -810,7 +810,7 @@ public function showHideRows(): static
'method' => 'filterTestInSimpleDataSet',
'arguments' => ['filterValues' => $ruleDataSet, 'blanks' => $blanks],
];
} else {
} elseif ($ruleType !== null) {
// Filter on date group values
$arguments = [
'date' => [],
Expand Down
2 changes: 1 addition & 1 deletion src/PhpSpreadsheet/Writer/Xlsx/Table.php
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,6 @@ public function writeTable(WorksheetTable $table, int $tableRef): string
if ($table->getShowHeaderRow() && $table->getAllowFilter() === true) {
$objWriter->startElement('autoFilter');
$objWriter->writeAttribute('ref', $range);
$objWriter->endElement();
foreach (range($rangeStart[0], $rangeEnd[0]) as $offset => $columnIndex) {
$column = $table->getColumnByOffset($offset);

Expand All @@ -64,6 +63,7 @@ public function writeTable(WorksheetTable $table, int $tableRef): string
AutoFilter::writeAutoFilterColumn($objWriter, $column, $offset);
}
}
$objWriter->endElement(); // autoFilter
}

// Table Columns
Expand Down
103 changes: 103 additions & 0 deletions tests/PhpSpreadsheetTests/Writer/Xlsx/Issue3988Test.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
<?php

declare(strict_types=1);

namespace PhpOffice\PhpSpreadsheetTests\Writer\Xlsx;

use PhpOffice\PhpSpreadsheet\Reader\Xlsx as XlsxReader;
use PhpOffice\PhpSpreadsheet\Shared\File;
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Worksheet\AutoFilter;
use PhpOffice\PhpSpreadsheet\Worksheet\Table;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx as XlsxWriter;
use PHPUnit\Framework\TestCase;

class Issue3988Test extends TestCase
{
public function testIssue3988(): void
{
// code liberally borrowed from samples/Table/01_Table
$spreadsheet = new Spreadsheet();
$spreadsheet->setActiveSheetIndex(0);
$spreadsheet->getActiveSheet()->setCellValue('A1', 'Year')
->setCellValue('B1', 'Quarter')
->setCellValue('C1', 'Country')
->setCellValue('D1', 'Sales');

$dataArray = [
['2010', 'Q1', 'United States', 790],
['2010', 'Q2', 'United States', 730],
['2010', 'Q3', 'United States', 860],
['2010', 'Q4', 'United States', 850],
['2011', 'Q1', 'United States', 800],
['2011', 'Q2', 'United States', 700],
['2011', 'Q3', 'United States', 900],
['2011', 'Q4', 'United States', 950],
['2010', 'Q1', 'Belgium', 380],
['2010', 'Q2', 'Belgium', 390],
['2010', 'Q3', 'Belgium', 420],
['2010', 'Q4', 'Belgium', 460],
['2011', 'Q1', 'Belgium', 400],
['2011', 'Q2', 'Belgium', 350],
['2011', 'Q3', 'Belgium', 450],
['2011', 'Q4', 'Belgium', 500],
['2010', 'Q1', 'UK', 690],
['2010', 'Q2', 'UK', 610],
['2010', 'Q3', 'UK', 620],
['2010', 'Q4', 'UK', 600],
['2011', 'Q1', 'UK', 720],
['2011', 'Q2', 'UK', 650],
['2011', 'Q3', 'UK', 580],
['2011', 'Q4', 'UK', 510],
['2010', 'Q1', 'France', 510],
['2010', 'Q2', 'France', 490],
['2010', 'Q3', 'France', 460],
['2010', 'Q4', 'France', 590],
['2011', 'Q1', 'France', 620],
['2011', 'Q2', 'France', 650],
['2011', 'Q3', 'France', 415],
['2011', 'Q4', 'France', 570],
];
$spreadsheet->getActiveSheet()->fromArray($dataArray, null, 'A2');

$table = new Table('A1:D33', 'Sales_Data');

// Create Columns
$table->getColumn('D')->setShowFilterButton(false);
$table->getAutoFilter()->getColumn('A')
->setFilterType(AutoFilter\Column::AUTOFILTER_FILTERTYPE_CUSTOMFILTER)
->createRule()
->setRule(AutoFilter\Column\Rule::AUTOFILTER_COLUMN_RULE_GREATERTHANOREQUAL, 2011)
->setRuleType(AutoFilter\Column\Rule::AUTOFILTER_RULETYPE_CUSTOMFILTER);

$spreadsheet->getActiveSheet()->addTable($table);

$outfile = File::temporaryFilename();
$writer = new XlsxWriter($spreadsheet);
$writer->save($outfile);
$spreadsheet->disconnectWorksheets();

// Make sure Reader handles row visibility properly.
$reader = new XlsxReader();
$spreadsheet2 = $reader->load($outfile);
self::assertFalse($spreadsheet2->getActiveSheet()->getRowDimension(5)->getVisible());
self::assertTrue($spreadsheet2->getActiveSheet()->getRowDimension(6)->getVisible());
$spreadsheet2->disconnectWorksheets();

// Make sure filterColumn tags are children of autoFilter.
$file = 'zip://';
$file .= $outfile;
$file .= '#xl/tables/table1.xml';
$data = file_get_contents($file);
unlink($outfile);
$expected = '<autoFilter ref="A1:D33">'
. '<filterColumn colId="0">'
. '<customFilters>'
. '<customFilter operator="greaterThanOrEqual" val="2011"/>'
. '</customFilters>'
. '</filterColumn>'
. '<filterColumn colId="3" hiddenButton="1"/>'
. '</autoFilter>';
self::assertStringContainsString($expected, $data);
}
}

0 comments on commit 3427257

Please sign in to comment.