diff --git a/CHANGELOG.md b/CHANGELOG.md
index 74773e34..fe190f74 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -14,7 +14,7 @@ and this project adheres to [Semantic Versioning](https://semver.org).
Note that a ChartSheet is still only written as a normal Worksheet containing a single chart, not as an actual ChartSheet.
-- Added Worksheet visibility in Ods Reader [PR #2851](https://github.com/PHPOffice/PhpSpreadsheet/pull/2851)
+- Added Worksheet visibility in Ods Reader [PR #2851](https://github.com/PHPOffice/PhpSpreadsheet/pull/2851) and Gnumeric Reader [PR #2853](https://github.com/PHPOffice/PhpSpreadsheet/pull/2853)
- Added Worksheet visibility in Ods Writer [PR #2850](https://github.com/PHPOffice/PhpSpreadsheet/pull/2850)
### Changed
diff --git a/docs/references/features-cross-reference.md b/docs/references/features-cross-reference.md
index 399be82e..d18c0969 100644
--- a/docs/references/features-cross-reference.md
+++ b/docs/references/features-cross-reference.md
@@ -16,7 +16,7 @@
|
XLS |
XLSX |
- Excel2003XML |
+ XML (Excel2003XML) |
Ods |
Gnumeric |
CSV |
@@ -732,12 +732,32 @@
|
|
+
+ | Hidden Worksheets |
+ ✔ |
+ ✔ |
+ |
+ ✔ |
+ ✔ |
+ N/A |
+ |
+ |
+ |
+ |
+ |
+ |
+ |
+ |
+ |
+ |
+
| Coloured Tabs |
|
|
|
|
+ |
N/A |
|
|
diff --git a/src/PhpSpreadsheet/Reader/Gnumeric.php b/src/PhpSpreadsheet/Reader/Gnumeric.php
index ee2e8d3d..ca087e61 100644
--- a/src/PhpSpreadsheet/Reader/Gnumeric.php
+++ b/src/PhpSpreadsheet/Reader/Gnumeric.php
@@ -272,6 +272,11 @@ class Gnumeric extends BaseReader
// name in line with the formula, not the reverse
$this->spreadsheet->getActiveSheet()->setTitle($worksheetName, false, false);
+ $visibility = $sheetOrNull->attributes()['Visibility'] ?? 'GNM_SHEET_VISIBILITY_VISIBLE';
+ if ((string) $visibility !== 'GNM_SHEET_VISIBILITY_VISIBLE') {
+ $this->spreadsheet->getActiveSheet()->setSheetState(Worksheet::SHEETSTATE_HIDDEN);
+ }
+
if (!$this->readDataOnly) {
(new PageSetup($this->spreadsheet))
->printInformation($sheet)
diff --git a/tests/PhpSpreadsheetTests/Reader/Gnumeric/HiddenWorksheetTest.php b/tests/PhpSpreadsheetTests/Reader/Gnumeric/HiddenWorksheetTest.php
new file mode 100644
index 00000000..ffa3b88d
--- /dev/null
+++ b/tests/PhpSpreadsheetTests/Reader/Gnumeric/HiddenWorksheetTest.php
@@ -0,0 +1,56 @@
+spreadsheet = $reader->load($filename);
+ }
+
+ public function testPageSetup(): void
+ {
+ $assertions = $this->worksheetAssertions();
+
+ foreach ($this->spreadsheet->getAllSheets() as $worksheet) {
+ if (!array_key_exists($worksheet->getTitle(), $assertions)) {
+ continue;
+ }
+
+ $sheetAssertions = $assertions[$worksheet->getTitle()];
+ foreach ($sheetAssertions as $test => $expectedResult) {
+ $actualResult = $worksheet->getSheetState();
+ self::assertSame(
+ $expectedResult,
+ $actualResult,
+ "Failed asserting sheet state {$expectedResult} for Worksheet '{$worksheet->getTitle()}' {$test}"
+ );
+ }
+ }
+ }
+
+ private function worksheetAssertions(): array
+ {
+ return [
+ 'Sheet1' => [
+ 'sheetState' => Worksheet::SHEETSTATE_VISIBLE,
+ ],
+ 'Sheet2' => [
+ 'sheetState' => Worksheet::SHEETSTATE_HIDDEN,
+ ],
+ ];
+ }
+}
diff --git a/tests/PhpSpreadsheetTests/Reader/Ods/HiddenWorksheetTest.php b/tests/PhpSpreadsheetTests/Reader/Ods/HiddenWorksheetTest.php
index 9edaa9b7..c02c8771 100644
--- a/tests/PhpSpreadsheetTests/Reader/Ods/HiddenWorksheetTest.php
+++ b/tests/PhpSpreadsheetTests/Reader/Ods/HiddenWorksheetTest.php
@@ -32,7 +32,6 @@ class HiddenWorksheetTest extends TestCase
$sheetAssertions = $assertions[$worksheet->getTitle()];
foreach ($sheetAssertions as $test => $expectedResult) {
- $testMethodName = 'get' . ucfirst($test);
$actualResult = $worksheet->getSheetState();
self::assertSame(
$expectedResult,
diff --git a/tests/PhpSpreadsheetTests/Reader/Xls/HiddenWorksheetTest.php b/tests/PhpSpreadsheetTests/Reader/Xls/HiddenWorksheetTest.php
new file mode 100644
index 00000000..82fd6e12
--- /dev/null
+++ b/tests/PhpSpreadsheetTests/Reader/Xls/HiddenWorksheetTest.php
@@ -0,0 +1,56 @@
+spreadsheet = $reader->load($filename);
+ }
+
+ public function testPageSetup(): void
+ {
+ $assertions = $this->worksheetAssertions();
+
+ foreach ($this->spreadsheet->getAllSheets() as $worksheet) {
+ if (!array_key_exists($worksheet->getTitle(), $assertions)) {
+ continue;
+ }
+
+ $sheetAssertions = $assertions[$worksheet->getTitle()];
+ foreach ($sheetAssertions as $test => $expectedResult) {
+ $actualResult = $worksheet->getSheetState();
+ self::assertSame(
+ $expectedResult,
+ $actualResult,
+ "Failed asserting sheet state {$expectedResult} for Worksheet '{$worksheet->getTitle()}' {$test}"
+ );
+ }
+ }
+ }
+
+ private function worksheetAssertions(): array
+ {
+ return [
+ 'Sheet1' => [
+ 'sheetState' => Worksheet::SHEETSTATE_VISIBLE,
+ ],
+ 'Sheet2' => [
+ 'sheetState' => Worksheet::SHEETSTATE_HIDDEN,
+ ],
+ ];
+ }
+}
diff --git a/tests/PhpSpreadsheetTests/Reader/Xlsx/HiddenWorksheetTest.php b/tests/PhpSpreadsheetTests/Reader/Xlsx/HiddenWorksheetTest.php
new file mode 100644
index 00000000..130d76a6
--- /dev/null
+++ b/tests/PhpSpreadsheetTests/Reader/Xlsx/HiddenWorksheetTest.php
@@ -0,0 +1,56 @@
+spreadsheet = $reader->load($filename);
+ }
+
+ public function testPageSetup(): void
+ {
+ $assertions = $this->worksheetAssertions();
+
+ foreach ($this->spreadsheet->getAllSheets() as $worksheet) {
+ if (!array_key_exists($worksheet->getTitle(), $assertions)) {
+ continue;
+ }
+
+ $sheetAssertions = $assertions[$worksheet->getTitle()];
+ foreach ($sheetAssertions as $test => $expectedResult) {
+ $actualResult = $worksheet->getSheetState();
+ self::assertSame(
+ $expectedResult,
+ $actualResult,
+ "Failed asserting sheet state {$expectedResult} for Worksheet '{$worksheet->getTitle()}' {$test}"
+ );
+ }
+ }
+ }
+
+ private function worksheetAssertions(): array
+ {
+ return [
+ 'Sheet1' => [
+ 'sheetState' => Worksheet::SHEETSTATE_VISIBLE,
+ ],
+ 'Sheet2' => [
+ 'sheetState' => Worksheet::SHEETSTATE_HIDDEN,
+ ],
+ ];
+ }
+}
diff --git a/tests/data/Reader/Gnumeric/HiddenSheet.gnumeric b/tests/data/Reader/Gnumeric/HiddenSheet.gnumeric
new file mode 100644
index 00000000..4f503c28
Binary files /dev/null and b/tests/data/Reader/Gnumeric/HiddenSheet.gnumeric differ
diff --git a/tests/data/Reader/XLS/HiddenSheet.xls b/tests/data/Reader/XLS/HiddenSheet.xls
new file mode 100644
index 00000000..39ced197
Binary files /dev/null and b/tests/data/Reader/XLS/HiddenSheet.xls differ
diff --git a/tests/data/Reader/XLSX/HiddenSheet.xlsx b/tests/data/Reader/XLSX/HiddenSheet.xlsx
new file mode 100644
index 00000000..6d1d56a2
Binary files /dev/null and b/tests/data/Reader/XLSX/HiddenSheet.xlsx differ