27 $this->objWriter->startElement(
'definedNames');
30 if (count($this->spreadsheet->getDefinedNames()) > 0) {
36 $sheetCount = $this->spreadsheet->getSheetCount();
37 for (
$i = 0;
$i < $sheetCount; ++
$i) {
48 $this->objWriter->endElement();
57 $definedNames = $this->spreadsheet->getDefinedNames();
58 foreach ($definedNames as $definedName) {
69 $this->objWriter->startElement(
'definedName');
70 $this->objWriter->writeAttribute(
'name', $pDefinedName->
getName());
72 $this->objWriter->writeAttribute(
80 $this->objWriter->writeRawData($definedRange);
82 $this->objWriter->endElement();
91 $autoFilterRange = $pSheet->getAutoFilter()->getRange();
92 if (!empty($autoFilterRange)) {
93 $this->objWriter->startElement(
'definedName');
94 $this->objWriter->writeAttribute(
'name',
'_xlnm._FilterDatabase');
95 $this->objWriter->writeAttribute(
'localSheetId', $pSheetId);
96 $this->objWriter->writeAttribute(
'hidden',
'1');
102 [, $range[0]] = Worksheet::extractSheetTitle($range[0],
true);
106 $range = implode(
':', $range);
108 $this->objWriter->writeRawData(
'\'' . str_replace(
"'",
"''", $pSheet->getTitle()) .
'\'!
' . $range);
110 $this->objWriter->endElement();
117 private function writeNamedRangeForPrintTitles(Worksheet $pSheet, int $pSheetId = 0): void
119 // NamedRange for PrintTitles
120 if ($pSheet->getPageSetup()->isColumnsToRepeatAtLeftSet() || $pSheet->getPageSetup()->isRowsToRepeatAtTopSet()) {
121 $this->objWriter->startElement('definedName
');
122 $this->objWriter->writeAttribute('name
', '_xlnm.Print_Titles
');
123 $this->objWriter->writeAttribute('localSheetId
', $pSheetId);
129 if ($pSheet->getPageSetup()->isColumnsToRepeatAtLeftSet()) {
130 $repeat = $pSheet->getPageSetup()->getColumnsToRepeatAtLeft();
132 $settingString .= '\
'' . str_replace(
"'",
"''", $pSheet->getTitle()) .
'\'!$
' . $repeat[0] . ':$
' . $repeat[1];
136 if ($pSheet->getPageSetup()->isRowsToRepeatAtTopSet()) {
137 if ($pSheet->getPageSetup()->isColumnsToRepeatAtLeftSet()) {
138 $settingString .= ',
';
141 $repeat = $pSheet->getPageSetup()->getRowsToRepeatAtTop();
143 $settingString .= '\
'' . str_replace(
"'",
"''", $pSheet->getTitle()) .
'\'!$
' . $repeat[0] . ':$
' . $repeat[1];
146 $this->objWriter->writeRawData($settingString);
148 $this->objWriter->endElement();
155 private function writeNamedRangeForPrintArea(Worksheet $pSheet, int $pSheetId = 0): void
157 // NamedRange for PrintArea
158 if ($pSheet->getPageSetup()->isPrintAreaSet()) {
159 $this->objWriter->startElement('definedName
');
160 $this->objWriter->writeAttribute('name
', '_xlnm.Print_Area
');
161 $this->objWriter->writeAttribute('localSheetId
', $pSheetId);
164 $printArea = Coordinate::splitRange($pSheet->getPageSetup()->getPrintArea());
167 foreach ($printArea as $printAreaRect) {
168 $printAreaRect[0] = Coordinate::absoluteReference($printAreaRect[0]);
169 $printAreaRect[1] = Coordinate::absoluteReference($printAreaRect[1]);
170 $chunks[] = '\
'' . str_replace(
"'",
"''", $pSheet->getTitle()) .
'\'!
' . implode(':
', $printAreaRect);
173 $this->objWriter->writeRawData(implode(',
', $chunks));
175 $this->objWriter->endElement();
179 private function getDefinedRange(DefinedName $pDefinedName): string
181 $definedRange = $pDefinedName->getValue();
182 $splitCount = preg_match_all(
183 '/
' . Calculation::CALCULATION_REGEXP_CELLREF_RELATIVE . '/mui
',
189 $lengths = array_map('strlen
', array_column($splitRanges[0], 0));
190 $offsets = array_column($splitRanges[0], 1);
192 $worksheets = $splitRanges[2];
193 $columns = $splitRanges[6];
194 $rows = $splitRanges[7];
196 while ($splitCount > 0) {
198 $length = $lengths[$splitCount];
199 $offset = $offsets[$splitCount];
200 $worksheet = $worksheets[$splitCount][0];
201 $column = $columns[$splitCount][0];
202 $row = $rows[$splitCount][0];
205 if (empty($worksheet)) {
206 if (($offset === 0) || ($definedRange[$offset - 1] !== ':
')) {
207 // We should have a worksheet
208 $worksheet = $pDefinedName->getWorksheet() ? $pDefinedName->getWorksheet()->getTitle() : null;
211 $worksheet = str_replace("''", "'", trim($worksheet, "'"));
214 if (!empty($worksheet)) {
215 $newRange = "'" . str_replace("'", "''", $worksheet) . "'!
";
217 $newRange = "{$newRange}{$column}{$row}
";
219 $definedRange = substr($definedRange, 0, $offset) . $newRange . substr($definedRange, $offset + $length);
222 if (substr($definedRange, 0, 1) === '=') {
223 $definedRange = substr($definedRange, 1);
226 return $definedRange;
An exception for terminatinating execution or to throw for unit testing.
Helper class to manipulate cell coordinates.
static absoluteCoordinate($pCoordinateString)
Make string coordinate absolute.
static splitRange($pRange)
Split range into coordinate strings.
getLocalOnly()
Get localOnly.
writeDefinedName(DefinedName $pDefinedName)
Write Defined Name for named range.
getDefinedRange(DefinedName $pDefinedName)
writeNamedRangeForAutofilter(Worksheet $pSheet, int $pSheetId=0)
Write Defined Name for autoFilter.
__construct(XMLWriter $objWriter, Spreadsheet $spreadsheet)
writeNamedRangeForPrintTitles(Worksheet $pSheet, int $pSheetId=0)
Write Defined Name for PrintTitles.
writeNamedRangesAndFormulae()
Write defined names.
writeNamedRangeForPrintArea(Worksheet $pSheet, int $pSheetId=0)
Write Defined Name for PrintTitles.