1 |
efrain |
1 |
<?php
|
|
|
2 |
|
|
|
3 |
namespace PhpOffice\PhpSpreadsheet\Reader\Xlsx;
|
|
|
4 |
|
|
|
5 |
use PhpOffice\PhpSpreadsheet\Spreadsheet;
|
|
|
6 |
use SimpleXMLElement;
|
|
|
7 |
|
|
|
8 |
class WorkbookView
|
|
|
9 |
{
|
|
|
10 |
/**
|
|
|
11 |
* @var Spreadsheet
|
|
|
12 |
*/
|
|
|
13 |
private $spreadsheet;
|
|
|
14 |
|
|
|
15 |
public function __construct(Spreadsheet $spreadsheet)
|
|
|
16 |
{
|
|
|
17 |
$this->spreadsheet = $spreadsheet;
|
|
|
18 |
}
|
|
|
19 |
|
|
|
20 |
/**
|
|
|
21 |
* @param mixed $mainNS
|
|
|
22 |
*/
|
|
|
23 |
public function viewSettings(SimpleXMLElement $xmlWorkbook, $mainNS, array $mapSheetId, bool $readDataOnly): void
|
|
|
24 |
{
|
|
|
25 |
if ($this->spreadsheet->getSheetCount() == 0) {
|
|
|
26 |
$this->spreadsheet->createSheet();
|
|
|
27 |
}
|
|
|
28 |
// Default active sheet index to the first loaded worksheet from the file
|
|
|
29 |
$this->spreadsheet->setActiveSheetIndex(0);
|
|
|
30 |
|
|
|
31 |
$workbookView = $xmlWorkbook->children($mainNS)->bookViews->workbookView;
|
|
|
32 |
if ($readDataOnly !== true && !empty($workbookView)) {
|
|
|
33 |
$workbookViewAttributes = self::testSimpleXml(self::getAttributes($workbookView));
|
|
|
34 |
// active sheet index
|
|
|
35 |
$activeTab = (int) $workbookViewAttributes->activeTab; // refers to old sheet index
|
|
|
36 |
// keep active sheet index if sheet is still loaded, else first sheet is set as the active worksheet
|
|
|
37 |
if (isset($mapSheetId[$activeTab]) && $mapSheetId[$activeTab] !== null) {
|
|
|
38 |
$this->spreadsheet->setActiveSheetIndex($mapSheetId[$activeTab]);
|
|
|
39 |
}
|
|
|
40 |
|
|
|
41 |
$this->horizontalScroll($workbookViewAttributes);
|
|
|
42 |
$this->verticalScroll($workbookViewAttributes);
|
|
|
43 |
$this->sheetTabs($workbookViewAttributes);
|
|
|
44 |
$this->minimized($workbookViewAttributes);
|
|
|
45 |
$this->autoFilterDateGrouping($workbookViewAttributes);
|
|
|
46 |
$this->firstSheet($workbookViewAttributes);
|
|
|
47 |
$this->visibility($workbookViewAttributes);
|
|
|
48 |
$this->tabRatio($workbookViewAttributes);
|
|
|
49 |
}
|
|
|
50 |
}
|
|
|
51 |
|
|
|
52 |
/**
|
|
|
53 |
* @param mixed $value
|
|
|
54 |
*/
|
|
|
55 |
public static function testSimpleXml($value): SimpleXMLElement
|
|
|
56 |
{
|
|
|
57 |
return ($value instanceof SimpleXMLElement)
|
|
|
58 |
? $value
|
|
|
59 |
: new SimpleXMLElement('<?xml version="1.0" encoding="UTF-8"?><root></root>');
|
|
|
60 |
}
|
|
|
61 |
|
|
|
62 |
public static function getAttributes(?SimpleXMLElement $value, string $ns = ''): SimpleXMLElement
|
|
|
63 |
{
|
|
|
64 |
return self::testSimpleXml($value === null ? $value : $value->attributes($ns));
|
|
|
65 |
}
|
|
|
66 |
|
|
|
67 |
/**
|
|
|
68 |
* Convert an 'xsd:boolean' XML value to a PHP boolean value.
|
|
|
69 |
* A valid 'xsd:boolean' XML value can be one of the following
|
|
|
70 |
* four values: 'true', 'false', '1', '0'. It is case sensitive.
|
|
|
71 |
*
|
|
|
72 |
* Note that just doing '(bool) $xsdBoolean' is not safe,
|
|
|
73 |
* since '(bool) "false"' returns true.
|
|
|
74 |
*
|
|
|
75 |
* @see https://www.w3.org/TR/xmlschema11-2/#boolean
|
|
|
76 |
*
|
|
|
77 |
* @param string $xsdBoolean An XML string value of type 'xsd:boolean'
|
|
|
78 |
*
|
|
|
79 |
* @return bool Boolean value
|
|
|
80 |
*/
|
|
|
81 |
private function castXsdBooleanToBool(string $xsdBoolean): bool
|
|
|
82 |
{
|
|
|
83 |
if ($xsdBoolean === 'false') {
|
|
|
84 |
return false;
|
|
|
85 |
}
|
|
|
86 |
|
|
|
87 |
return (bool) $xsdBoolean;
|
|
|
88 |
}
|
|
|
89 |
|
|
|
90 |
private function horizontalScroll(SimpleXMLElement $workbookViewAttributes): void
|
|
|
91 |
{
|
|
|
92 |
if (isset($workbookViewAttributes->showHorizontalScroll)) {
|
|
|
93 |
$showHorizontalScroll = (string) $workbookViewAttributes->showHorizontalScroll;
|
|
|
94 |
$this->spreadsheet->setShowHorizontalScroll($this->castXsdBooleanToBool($showHorizontalScroll));
|
|
|
95 |
}
|
|
|
96 |
}
|
|
|
97 |
|
|
|
98 |
private function verticalScroll(SimpleXMLElement $workbookViewAttributes): void
|
|
|
99 |
{
|
|
|
100 |
if (isset($workbookViewAttributes->showVerticalScroll)) {
|
|
|
101 |
$showVerticalScroll = (string) $workbookViewAttributes->showVerticalScroll;
|
|
|
102 |
$this->spreadsheet->setShowVerticalScroll($this->castXsdBooleanToBool($showVerticalScroll));
|
|
|
103 |
}
|
|
|
104 |
}
|
|
|
105 |
|
|
|
106 |
private function sheetTabs(SimpleXMLElement $workbookViewAttributes): void
|
|
|
107 |
{
|
|
|
108 |
if (isset($workbookViewAttributes->showSheetTabs)) {
|
|
|
109 |
$showSheetTabs = (string) $workbookViewAttributes->showSheetTabs;
|
|
|
110 |
$this->spreadsheet->setShowSheetTabs($this->castXsdBooleanToBool($showSheetTabs));
|
|
|
111 |
}
|
|
|
112 |
}
|
|
|
113 |
|
|
|
114 |
private function minimized(SimpleXMLElement $workbookViewAttributes): void
|
|
|
115 |
{
|
|
|
116 |
if (isset($workbookViewAttributes->minimized)) {
|
|
|
117 |
$minimized = (string) $workbookViewAttributes->minimized;
|
|
|
118 |
$this->spreadsheet->setMinimized($this->castXsdBooleanToBool($minimized));
|
|
|
119 |
}
|
|
|
120 |
}
|
|
|
121 |
|
|
|
122 |
private function autoFilterDateGrouping(SimpleXMLElement $workbookViewAttributes): void
|
|
|
123 |
{
|
|
|
124 |
if (isset($workbookViewAttributes->autoFilterDateGrouping)) {
|
|
|
125 |
$autoFilterDateGrouping = (string) $workbookViewAttributes->autoFilterDateGrouping;
|
|
|
126 |
$this->spreadsheet->setAutoFilterDateGrouping($this->castXsdBooleanToBool($autoFilterDateGrouping));
|
|
|
127 |
}
|
|
|
128 |
}
|
|
|
129 |
|
|
|
130 |
private function firstSheet(SimpleXMLElement $workbookViewAttributes): void
|
|
|
131 |
{
|
|
|
132 |
if (isset($workbookViewAttributes->firstSheet)) {
|
|
|
133 |
$firstSheet = (string) $workbookViewAttributes->firstSheet;
|
|
|
134 |
$this->spreadsheet->setFirstSheetIndex((int) $firstSheet);
|
|
|
135 |
}
|
|
|
136 |
}
|
|
|
137 |
|
|
|
138 |
private function visibility(SimpleXMLElement $workbookViewAttributes): void
|
|
|
139 |
{
|
|
|
140 |
if (isset($workbookViewAttributes->visibility)) {
|
|
|
141 |
$visibility = (string) $workbookViewAttributes->visibility;
|
|
|
142 |
$this->spreadsheet->setVisibility($visibility);
|
|
|
143 |
}
|
|
|
144 |
}
|
|
|
145 |
|
|
|
146 |
private function tabRatio(SimpleXMLElement $workbookViewAttributes): void
|
|
|
147 |
{
|
|
|
148 |
if (isset($workbookViewAttributes->tabRatio)) {
|
|
|
149 |
$tabRatio = (string) $workbookViewAttributes->tabRatio;
|
|
|
150 |
$this->spreadsheet->setTabRatio((int) $tabRatio);
|
|
|
151 |
}
|
|
|
152 |
}
|
|
|
153 |
}
|