Merge branch 'master' into Ods-Writer-Worksheet-Visibility
This commit is contained in:
commit
2de58d4164
|
|
@ -14,6 +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.
|
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 Writer [PR #2850](https://github.com/PHPOffice/PhpSpreadsheet/pull/2850)
|
- Added Worksheet visibility in Ods Writer [PR #2850](https://github.com/PHPOffice/PhpSpreadsheet/pull/2850)
|
||||||
|
|
||||||
### Changed
|
### Changed
|
||||||
|
|
@ -34,7 +35,7 @@ and this project adheres to [Semantic Versioning](https://semver.org).
|
||||||
|
|
||||||
- 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)
|
- 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)
|
||||||
- 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)
|
- 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)
|
||||||
|
- 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)
|
||||||
|
|
||||||
## 1.23.0 - 2022-04-24
|
## 1.23.0 - 2022-04-24
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1945,36 +1945,11 @@ parameters:
|
||||||
count: 6
|
count: 6
|
||||||
path: src/PhpSpreadsheet/Reader/Ods/PageSettings.php
|
path: src/PhpSpreadsheet/Reader/Ods/PageSettings.php
|
||||||
|
|
||||||
-
|
|
||||||
message: "#^Property PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Ods\\\\PageSettings\\:\\:\\$masterPrintStylesCrossReference has no type specified\\.$#"
|
|
||||||
count: 1
|
|
||||||
path: src/PhpSpreadsheet/Reader/Ods/PageSettings.php
|
|
||||||
|
|
||||||
-
|
|
||||||
message: "#^Property PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Ods\\\\PageSettings\\:\\:\\$masterStylesCrossReference has no type specified\\.$#"
|
|
||||||
count: 1
|
|
||||||
path: src/PhpSpreadsheet/Reader/Ods/PageSettings.php
|
|
||||||
|
|
||||||
-
|
|
||||||
message: "#^Property PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Ods\\\\PageSettings\\:\\:\\$officeNs has no type specified\\.$#"
|
|
||||||
count: 1
|
|
||||||
path: src/PhpSpreadsheet/Reader/Ods/PageSettings.php
|
|
||||||
|
|
||||||
-
|
-
|
||||||
message: "#^Property PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Ods\\\\PageSettings\\:\\:\\$pageLayoutStyles has no type specified\\.$#"
|
message: "#^Property PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Ods\\\\PageSettings\\:\\:\\$pageLayoutStyles has no type specified\\.$#"
|
||||||
count: 1
|
count: 1
|
||||||
path: src/PhpSpreadsheet/Reader/Ods/PageSettings.php
|
path: src/PhpSpreadsheet/Reader/Ods/PageSettings.php
|
||||||
|
|
||||||
-
|
|
||||||
message: "#^Property PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Ods\\\\PageSettings\\:\\:\\$stylesFo has no type specified\\.$#"
|
|
||||||
count: 1
|
|
||||||
path: src/PhpSpreadsheet/Reader/Ods/PageSettings.php
|
|
||||||
|
|
||||||
-
|
|
||||||
message: "#^Property PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Ods\\\\PageSettings\\:\\:\\$stylesNs has no type specified\\.$#"
|
|
||||||
count: 1
|
|
||||||
path: src/PhpSpreadsheet/Reader/Ods/PageSettings.php
|
|
||||||
|
|
||||||
-
|
-
|
||||||
message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Ods\\\\Properties\\:\\:load\\(\\) has parameter \\$namespacesMeta with no type specified\\.$#"
|
message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Ods\\\\Properties\\:\\:load\\(\\) has parameter \\$namespacesMeta with no type specified\\.$#"
|
||||||
count: 1
|
count: 1
|
||||||
|
|
|
||||||
|
|
@ -588,6 +588,7 @@ class Ods extends BaseReader
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
$pageSettings->setVisibilityForWorksheet($spreadsheet->getActiveSheet(), $worksheetStyleName);
|
||||||
$pageSettings->setPrintSettingsForWorksheet($spreadsheet->getActiveSheet(), $worksheetStyleName);
|
$pageSettings->setPrintSettingsForWorksheet($spreadsheet->getActiveSheet(), $worksheetStyleName);
|
||||||
++$worksheetID;
|
++$worksheetID;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -8,16 +8,41 @@ use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet;
|
||||||
|
|
||||||
class PageSettings
|
class PageSettings
|
||||||
{
|
{
|
||||||
|
/**
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
private $officeNs;
|
private $officeNs;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
private $stylesNs;
|
private $stylesNs;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
private $stylesFo;
|
private $stylesFo;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
private $tableNs;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var string[]
|
||||||
|
*/
|
||||||
|
private $tableStylesCrossReference = [];
|
||||||
|
|
||||||
private $pageLayoutStyles = [];
|
private $pageLayoutStyles = [];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var string[]
|
||||||
|
*/
|
||||||
private $masterStylesCrossReference = [];
|
private $masterStylesCrossReference = [];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var string[]
|
||||||
|
*/
|
||||||
private $masterPrintStylesCrossReference = [];
|
private $masterPrintStylesCrossReference = [];
|
||||||
|
|
||||||
public function __construct(DOMDocument $styleDom)
|
public function __construct(DOMDocument $styleDom)
|
||||||
|
|
@ -32,6 +57,7 @@ class PageSettings
|
||||||
$this->officeNs = $styleDom->lookupNamespaceUri('office');
|
$this->officeNs = $styleDom->lookupNamespaceUri('office');
|
||||||
$this->stylesNs = $styleDom->lookupNamespaceUri('style');
|
$this->stylesNs = $styleDom->lookupNamespaceUri('style');
|
||||||
$this->stylesFo = $styleDom->lookupNamespaceUri('fo');
|
$this->stylesFo = $styleDom->lookupNamespaceUri('fo');
|
||||||
|
$this->tableNs = $styleDom->lookupNamespaceUri('table');
|
||||||
}
|
}
|
||||||
|
|
||||||
private function readPageSettingStyles(DOMDocument $styleDom): void
|
private function readPageSettingStyles(DOMDocument $styleDom): void
|
||||||
|
|
@ -98,12 +124,33 @@ class PageSettings
|
||||||
foreach ($styleXReferences as $styleXreferenceSet) {
|
foreach ($styleXReferences as $styleXreferenceSet) {
|
||||||
$styleXRefName = $styleXreferenceSet->getAttributeNS($this->stylesNs, 'name');
|
$styleXRefName = $styleXreferenceSet->getAttributeNS($this->stylesNs, 'name');
|
||||||
$stylePageLayoutName = $styleXreferenceSet->getAttributeNS($this->stylesNs, 'master-page-name');
|
$stylePageLayoutName = $styleXreferenceSet->getAttributeNS($this->stylesNs, 'master-page-name');
|
||||||
|
$styleFamilyName = $styleXreferenceSet->getAttributeNS($this->stylesNs, 'family');
|
||||||
|
if (!empty($styleFamilyName) && $styleFamilyName === 'table') {
|
||||||
|
$styleVisibility = 'true';
|
||||||
|
foreach ($styleXreferenceSet->getElementsByTagNameNS($this->stylesNs, 'table-properties') as $tableProperties) {
|
||||||
|
$styleVisibility = $tableProperties->getAttributeNS($this->tableNs, 'display');
|
||||||
|
}
|
||||||
|
$this->tableStylesCrossReference[$styleXRefName] = $styleVisibility;
|
||||||
|
}
|
||||||
if (!empty($stylePageLayoutName)) {
|
if (!empty($stylePageLayoutName)) {
|
||||||
$this->masterStylesCrossReference[$styleXRefName] = $stylePageLayoutName;
|
$this->masterStylesCrossReference[$styleXRefName] = $stylePageLayoutName;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function setVisibilityForWorksheet(Worksheet $worksheet, string $styleName): void
|
||||||
|
{
|
||||||
|
if (!array_key_exists($styleName, $this->tableStylesCrossReference)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$worksheet->setSheetState(
|
||||||
|
$this->tableStylesCrossReference[$styleName] === 'false'
|
||||||
|
? Worksheet::SHEETSTATE_HIDDEN
|
||||||
|
: Worksheet::SHEETSTATE_VISIBLE
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
public function setPrintSettingsForWorksheet(Worksheet $worksheet, string $styleName): void
|
public function setPrintSettingsForWorksheet(Worksheet $worksheet, string $styleName): void
|
||||||
{
|
{
|
||||||
if (!array_key_exists($styleName, $this->masterStylesCrossReference)) {
|
if (!array_key_exists($styleName, $this->masterStylesCrossReference)) {
|
||||||
|
|
|
||||||
|
|
@ -1530,13 +1530,18 @@ class Xlsx extends BaseReader
|
||||||
$rangeSets = preg_split("/('?(?:.*?)'?(?:![A-Z0-9]+:[A-Z0-9]+)),?/", $extractedRange, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);
|
$rangeSets = preg_split("/('?(?:.*?)'?(?:![A-Z0-9]+:[A-Z0-9]+)),?/", $extractedRange, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);
|
||||||
$newRangeSets = [];
|
$newRangeSets = [];
|
||||||
foreach ($rangeSets as $rangeSet) {
|
foreach ($rangeSets as $rangeSet) {
|
||||||
[$sheetName, $rangeSet] = Worksheet::extractSheetTitle($rangeSet, true);
|
[, $rangeSet] = Worksheet::extractSheetTitle($rangeSet, true);
|
||||||
|
if (empty($rangeSet)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
if (strpos($rangeSet, ':') === false) {
|
if (strpos($rangeSet, ':') === false) {
|
||||||
$rangeSet = $rangeSet . ':' . $rangeSet;
|
$rangeSet = $rangeSet . ':' . $rangeSet;
|
||||||
}
|
}
|
||||||
$newRangeSets[] = str_replace('$', '', $rangeSet);
|
$newRangeSets[] = str_replace('$', '', $rangeSet);
|
||||||
}
|
}
|
||||||
|
if (count($newRangeSets) > 0) {
|
||||||
$docSheet->getPageSetup()->setPrintArea(implode(',', $newRangeSets));
|
$docSheet->getPageSetup()->setPrintArea(implode(',', $newRangeSets));
|
||||||
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,57 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace PhpOffice\PhpSpreadsheetTests\Reader\Ods;
|
||||||
|
|
||||||
|
use PhpOffice\PhpSpreadsheet\Reader\Ods;
|
||||||
|
use PhpOffice\PhpSpreadsheet\Spreadsheet;
|
||||||
|
use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet;
|
||||||
|
use PHPUnit\Framework\TestCase;
|
||||||
|
|
||||||
|
class HiddenWorksheetTest extends TestCase
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @var Spreadsheet
|
||||||
|
*/
|
||||||
|
private $spreadsheet;
|
||||||
|
|
||||||
|
protected function setup(): void
|
||||||
|
{
|
||||||
|
$filename = 'tests/data/Reader/Ods/HiddenSheet.ods';
|
||||||
|
$reader = new Ods();
|
||||||
|
$this->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) {
|
||||||
|
$testMethodName = 'get' . ucfirst($test);
|
||||||
|
$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,
|
||||||
|
],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
||||||
Binary file not shown.
Loading…
Reference in New Issue