Skip to content

Commit 2de58d4

Browse files
authored
Merge branch 'master' into Ods-Writer-Worksheet-Visibility
2 parents 2e5ebea + 6569f72 commit 2de58d4

File tree

7 files changed

+114
-28
lines changed

7 files changed

+114
-28
lines changed

CHANGELOG.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ and this project adheres to [Semantic Versioning](https://semver.org).
1414

1515
Note that a ChartSheet is still only written as a normal Worksheet containing a single chart, not as an actual ChartSheet.
1616

17+
- Added Worksheet visibility in Ods Reader [PR #2851](https://github.com/PHPOffice/PhpSpreadsheet/pull/2851)
1718
- Added Worksheet visibility in Ods Writer [PR #2850](https://github.com/PHPOffice/PhpSpreadsheet/pull/2850)
1819

1920
### Changed
@@ -34,7 +35,7 @@ and this project adheres to [Semantic Versioning](https://semver.org).
3435

3536
- Xls Reader resolving absolute named ranges to relative ranges [Issue #2826](https://github.com/PHPOffice/PhpSpreadsheet/issues/2826) [PR #2827](https://github.com/PHPOffice/PhpSpreadsheet/pull/2827)
3637
- Null value handling in the Excel Math/Trig PRODUCT() function [Issue #2833](https://github.com/PHPOffice/PhpSpreadsheet/issues/2833) [PR #2834](https://github.com/PHPOffice/PhpSpreadsheet/pull/2834)
37-
38+
- Invalid Print Area defined in Xlsx corrupts internal storage of print area [Issue #2848](https://github.com/PHPOffice/PhpSpreadsheet/issues/2848) [PR #2849](https://github.com/PHPOffice/PhpSpreadsheet/pull/2849)
3839

3940
## 1.23.0 - 2022-04-24
4041

phpstan-baseline.neon

Lines changed: 0 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1945,36 +1945,11 @@ parameters:
19451945
count: 6
19461946
path: src/PhpSpreadsheet/Reader/Ods/PageSettings.php
19471947

1948-
-
1949-
message: "#^Property PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Ods\\\\PageSettings\\:\\:\\$masterPrintStylesCrossReference has no type specified\\.$#"
1950-
count: 1
1951-
path: src/PhpSpreadsheet/Reader/Ods/PageSettings.php
1952-
1953-
-
1954-
message: "#^Property PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Ods\\\\PageSettings\\:\\:\\$masterStylesCrossReference has no type specified\\.$#"
1955-
count: 1
1956-
path: src/PhpSpreadsheet/Reader/Ods/PageSettings.php
1957-
1958-
-
1959-
message: "#^Property PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Ods\\\\PageSettings\\:\\:\\$officeNs has no type specified\\.$#"
1960-
count: 1
1961-
path: src/PhpSpreadsheet/Reader/Ods/PageSettings.php
1962-
19631948
-
19641949
message: "#^Property PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Ods\\\\PageSettings\\:\\:\\$pageLayoutStyles has no type specified\\.$#"
19651950
count: 1
19661951
path: src/PhpSpreadsheet/Reader/Ods/PageSettings.php
19671952

1968-
-
1969-
message: "#^Property PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Ods\\\\PageSettings\\:\\:\\$stylesFo has no type specified\\.$#"
1970-
count: 1
1971-
path: src/PhpSpreadsheet/Reader/Ods/PageSettings.php
1972-
1973-
-
1974-
message: "#^Property PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Ods\\\\PageSettings\\:\\:\\$stylesNs has no type specified\\.$#"
1975-
count: 1
1976-
path: src/PhpSpreadsheet/Reader/Ods/PageSettings.php
1977-
19781953
-
19791954
message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Ods\\\\Properties\\:\\:load\\(\\) has parameter \\$namespacesMeta with no type specified\\.$#"
19801955
count: 1

src/PhpSpreadsheet/Reader/Ods.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -588,6 +588,7 @@ public function loadIntoExisting($filename, Spreadsheet $spreadsheet)
588588
break;
589589
}
590590
}
591+
$pageSettings->setVisibilityForWorksheet($spreadsheet->getActiveSheet(), $worksheetStyleName);
591592
$pageSettings->setPrintSettingsForWorksheet($spreadsheet->getActiveSheet(), $worksheetStyleName);
592593
++$worksheetID;
593594
}

src/PhpSpreadsheet/Reader/Ods/PageSettings.php

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,16 +8,41 @@
88

99
class PageSettings
1010
{
11+
/**
12+
* @var string
13+
*/
1114
private $officeNs;
1215

16+
/**
17+
* @var string
18+
*/
1319
private $stylesNs;
1420

21+
/**
22+
* @var string
23+
*/
1524
private $stylesFo;
1625

26+
/**
27+
* @var string
28+
*/
29+
private $tableNs;
30+
31+
/**
32+
* @var string[]
33+
*/
34+
private $tableStylesCrossReference = [];
35+
1736
private $pageLayoutStyles = [];
1837

38+
/**
39+
* @var string[]
40+
*/
1941
private $masterStylesCrossReference = [];
2042

43+
/**
44+
* @var string[]
45+
*/
2146
private $masterPrintStylesCrossReference = [];
2247

2348
public function __construct(DOMDocument $styleDom)
@@ -32,6 +57,7 @@ private function setDomNameSpaces(DOMDocument $styleDom): void
3257
$this->officeNs = $styleDom->lookupNamespaceUri('office');
3358
$this->stylesNs = $styleDom->lookupNamespaceUri('style');
3459
$this->stylesFo = $styleDom->lookupNamespaceUri('fo');
60+
$this->tableNs = $styleDom->lookupNamespaceUri('table');
3561
}
3662

3763
private function readPageSettingStyles(DOMDocument $styleDom): void
@@ -98,12 +124,33 @@ public function readStyleCrossReferences(DOMDocument $contentDom): void
98124
foreach ($styleXReferences as $styleXreferenceSet) {
99125
$styleXRefName = $styleXreferenceSet->getAttributeNS($this->stylesNs, 'name');
100126
$stylePageLayoutName = $styleXreferenceSet->getAttributeNS($this->stylesNs, 'master-page-name');
127+
$styleFamilyName = $styleXreferenceSet->getAttributeNS($this->stylesNs, 'family');
128+
if (!empty($styleFamilyName) && $styleFamilyName === 'table') {
129+
$styleVisibility = 'true';
130+
foreach ($styleXreferenceSet->getElementsByTagNameNS($this->stylesNs, 'table-properties') as $tableProperties) {
131+
$styleVisibility = $tableProperties->getAttributeNS($this->tableNs, 'display');
132+
}
133+
$this->tableStylesCrossReference[$styleXRefName] = $styleVisibility;
134+
}
101135
if (!empty($stylePageLayoutName)) {
102136
$this->masterStylesCrossReference[$styleXRefName] = $stylePageLayoutName;
103137
}
104138
}
105139
}
106140

141+
public function setVisibilityForWorksheet(Worksheet $worksheet, string $styleName): void
142+
{
143+
if (!array_key_exists($styleName, $this->tableStylesCrossReference)) {
144+
return;
145+
}
146+
147+
$worksheet->setSheetState(
148+
$this->tableStylesCrossReference[$styleName] === 'false'
149+
? Worksheet::SHEETSTATE_HIDDEN
150+
: Worksheet::SHEETSTATE_VISIBLE
151+
);
152+
}
153+
107154
public function setPrintSettingsForWorksheet(Worksheet $worksheet, string $styleName): void
108155
{
109156
if (!array_key_exists($styleName, $this->masterStylesCrossReference)) {

src/PhpSpreadsheet/Reader/Xlsx.php

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1530,13 +1530,18 @@ protected function loadSpreadsheetFromFile(string $filename): Spreadsheet
15301530
$rangeSets = preg_split("/('?(?:.*?)'?(?:![A-Z0-9]+:[A-Z0-9]+)),?/", $extractedRange, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);
15311531
$newRangeSets = [];
15321532
foreach ($rangeSets as $rangeSet) {
1533-
[$sheetName, $rangeSet] = Worksheet::extractSheetTitle($rangeSet, true);
1533+
[, $rangeSet] = Worksheet::extractSheetTitle($rangeSet, true);
1534+
if (empty($rangeSet)) {
1535+
continue;
1536+
}
15341537
if (strpos($rangeSet, ':') === false) {
15351538
$rangeSet = $rangeSet . ':' . $rangeSet;
15361539
}
15371540
$newRangeSets[] = str_replace('$', '', $rangeSet);
15381541
}
1539-
$docSheet->getPageSetup()->setPrintArea(implode(',', $newRangeSets));
1542+
if (count($newRangeSets) > 0) {
1543+
$docSheet->getPageSetup()->setPrintArea(implode(',', $newRangeSets));
1544+
}
15401545

15411546
break;
15421547
default:
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
<?php
2+
3+
namespace PhpOffice\PhpSpreadsheetTests\Reader\Ods;
4+
5+
use PhpOffice\PhpSpreadsheet\Reader\Ods;
6+
use PhpOffice\PhpSpreadsheet\Spreadsheet;
7+
use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet;
8+
use PHPUnit\Framework\TestCase;
9+
10+
class HiddenWorksheetTest extends TestCase
11+
{
12+
/**
13+
* @var Spreadsheet
14+
*/
15+
private $spreadsheet;
16+
17+
protected function setup(): void
18+
{
19+
$filename = 'tests/data/Reader/Ods/HiddenSheet.ods';
20+
$reader = new Ods();
21+
$this->spreadsheet = $reader->load($filename);
22+
}
23+
24+
public function testPageSetup(): void
25+
{
26+
$assertions = $this->worksheetAssertions();
27+
28+
foreach ($this->spreadsheet->getAllSheets() as $worksheet) {
29+
if (!array_key_exists($worksheet->getTitle(), $assertions)) {
30+
continue;
31+
}
32+
33+
$sheetAssertions = $assertions[$worksheet->getTitle()];
34+
foreach ($sheetAssertions as $test => $expectedResult) {
35+
$testMethodName = 'get' . ucfirst($test);
36+
$actualResult = $worksheet->getSheetState();
37+
self::assertSame(
38+
$expectedResult,
39+
$actualResult,
40+
"Failed asserting sheet state {$expectedResult} for Worksheet '{$worksheet->getTitle()}' {$test}"
41+
);
42+
}
43+
}
44+
}
45+
46+
private function worksheetAssertions(): array
47+
{
48+
return [
49+
'Sheet1' => [
50+
'sheetState' => Worksheet::SHEETSTATE_VISIBLE,
51+
],
52+
'Sheet2' => [
53+
'sheetState' => Worksheet::SHEETSTATE_HIDDEN,
54+
],
55+
];
56+
}
57+
}

tests/data/Reader/Ods/HiddenSheet.ods

2.75 KB
Binary file not shown.

0 commit comments

Comments
 (0)