composer package updates
[openemr.git] / vendor / phpoffice / phpspreadsheet / src / PhpSpreadsheet / Writer / Xlsx / Rels.php
blobe60ce5e752f18ca4289209d07fdffae02841298a
1 <?php
3 namespace PhpOffice\PhpSpreadsheet\Writer\Xlsx;
5 use PhpOffice\PhpSpreadsheet\Shared\XMLWriter;
6 use PhpOffice\PhpSpreadsheet\Spreadsheet;
7 use PhpOffice\PhpSpreadsheet\Worksheet\MemoryDrawing;
8 use PhpOffice\PhpSpreadsheet\Writer\Exception as WriterException;
10 class Rels extends WriterPart
12 /**
13 * Write relationships to XML format.
15 * @param Spreadsheet $spreadsheet
17 * @throws WriterException
19 * @return string XML Output
21 public function writeRelationships(Spreadsheet $spreadsheet)
23 // Create XML writer
24 $objWriter = null;
25 if ($this->getParentWriter()->getUseDiskCaching()) {
26 $objWriter = new XMLWriter(XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory());
27 } else {
28 $objWriter = new XMLWriter(XMLWriter::STORAGE_MEMORY);
31 // XML header
32 $objWriter->startDocument('1.0', 'UTF-8', 'yes');
34 // Relationships
35 $objWriter->startElement('Relationships');
36 $objWriter->writeAttribute('xmlns', 'http://schemas.openxmlformats.org/package/2006/relationships');
38 $customPropertyList = $spreadsheet->getProperties()->getCustomProperties();
39 if (!empty($customPropertyList)) {
40 // Relationship docProps/app.xml
41 $this->writeRelationship(
42 $objWriter,
44 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/custom-properties',
45 'docProps/custom.xml'
49 // Relationship docProps/app.xml
50 $this->writeRelationship(
51 $objWriter,
53 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties',
54 'docProps/app.xml'
57 // Relationship docProps/core.xml
58 $this->writeRelationship(
59 $objWriter,
61 'http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties',
62 'docProps/core.xml'
65 // Relationship xl/workbook.xml
66 $this->writeRelationship(
67 $objWriter,
69 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument',
70 'xl/workbook.xml'
72 // a custom UI in workbook ?
73 if ($spreadsheet->hasRibbon()) {
74 $this->writeRelationShip(
75 $objWriter,
77 'http://schemas.microsoft.com/office/2006/relationships/ui/extensibility',
78 $spreadsheet->getRibbonXMLData('target')
82 $objWriter->endElement();
84 return $objWriter->getData();
87 /**
88 * Write workbook relationships to XML format.
90 * @param Spreadsheet $spreadsheet
92 * @throws WriterException
94 * @return string XML Output
96 public function writeWorkbookRelationships(Spreadsheet $spreadsheet)
98 // Create XML writer
99 $objWriter = null;
100 if ($this->getParentWriter()->getUseDiskCaching()) {
101 $objWriter = new XMLWriter(XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory());
102 } else {
103 $objWriter = new XMLWriter(XMLWriter::STORAGE_MEMORY);
106 // XML header
107 $objWriter->startDocument('1.0', 'UTF-8', 'yes');
109 // Relationships
110 $objWriter->startElement('Relationships');
111 $objWriter->writeAttribute('xmlns', 'http://schemas.openxmlformats.org/package/2006/relationships');
113 // Relationship styles.xml
114 $this->writeRelationship(
115 $objWriter,
117 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles',
118 'styles.xml'
121 // Relationship theme/theme1.xml
122 $this->writeRelationship(
123 $objWriter,
125 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme',
126 'theme/theme1.xml'
129 // Relationship sharedStrings.xml
130 $this->writeRelationship(
131 $objWriter,
133 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings',
134 'sharedStrings.xml'
137 // Relationships with sheets
138 $sheetCount = $spreadsheet->getSheetCount();
139 for ($i = 0; $i < $sheetCount; ++$i) {
140 $this->writeRelationship(
141 $objWriter,
142 ($i + 1 + 3),
143 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet',
144 'worksheets/sheet' . ($i + 1) . '.xml'
147 // Relationships for vbaProject if needed
148 // id : just after the last sheet
149 if ($spreadsheet->hasMacros()) {
150 $this->writeRelationShip(
151 $objWriter,
152 ($i + 1 + 3),
153 'http://schemas.microsoft.com/office/2006/relationships/vbaProject',
154 'vbaProject.bin'
156 ++$i; //increment i if needed for an another relation
159 $objWriter->endElement();
161 return $objWriter->getData();
165 * Write worksheet relationships to XML format.
167 * Numbering is as follows:
168 * rId1 - Drawings
169 * rId_hyperlink_x - Hyperlinks
171 * @param \PhpOffice\PhpSpreadsheet\Worksheet\Worksheet $pWorksheet
172 * @param int $pWorksheetId
173 * @param bool $includeCharts Flag indicating if we should write charts
175 * @throws WriterException
177 * @return string XML Output
179 public function writeWorksheetRelationships(\PhpOffice\PhpSpreadsheet\Worksheet\Worksheet $pWorksheet, $pWorksheetId = 1, $includeCharts = false)
181 // Create XML writer
182 $objWriter = null;
183 if ($this->getParentWriter()->getUseDiskCaching()) {
184 $objWriter = new XMLWriter(XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory());
185 } else {
186 $objWriter = new XMLWriter(XMLWriter::STORAGE_MEMORY);
189 // XML header
190 $objWriter->startDocument('1.0', 'UTF-8', 'yes');
192 // Relationships
193 $objWriter->startElement('Relationships');
194 $objWriter->writeAttribute('xmlns', 'http://schemas.openxmlformats.org/package/2006/relationships');
196 // Write drawing relationships?
197 $d = 0;
198 $drawingOriginalIds = [];
199 $unparsedLoadedData = $pWorksheet->getParent()->getUnparsedLoadedData();
200 if (isset($unparsedLoadedData['sheets'][$pWorksheet->getCodeName()]['drawingOriginalIds'])) {
201 $drawingOriginalIds = $unparsedLoadedData['sheets'][$pWorksheet->getCodeName()]['drawingOriginalIds'];
204 if ($includeCharts) {
205 $charts = $pWorksheet->getChartCollection();
206 } else {
207 $charts = [];
210 if (($pWorksheet->getDrawingCollection()->count() > 0) || (count($charts) > 0) || $drawingOriginalIds) {
211 $relPath = '../drawings/drawing' . $pWorksheetId . '.xml';
212 $rId = ++$d;
214 if (isset($drawingOriginalIds[$relPath])) {
215 $rId = (int) (substr($drawingOriginalIds[$relPath], 3));
218 $this->writeRelationship(
219 $objWriter,
220 $rId,
221 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/drawing',
222 $relPath
226 // Write hyperlink relationships?
227 $i = 1;
228 foreach ($pWorksheet->getHyperlinkCollection() as $hyperlink) {
229 if (!$hyperlink->isInternal()) {
230 $this->writeRelationship(
231 $objWriter,
232 '_hyperlink_' . $i,
233 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink',
234 $hyperlink->getUrl(),
235 'External'
238 ++$i;
242 // Write comments relationship?
243 $i = 1;
244 if (count($pWorksheet->getComments()) > 0) {
245 $this->writeRelationship(
246 $objWriter,
247 '_comments_vml' . $i,
248 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/vmlDrawing',
249 '../drawings/vmlDrawing' . $pWorksheetId . '.vml'
252 $this->writeRelationship(
253 $objWriter,
254 '_comments' . $i,
255 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/comments',
256 '../comments' . $pWorksheetId . '.xml'
260 // Write header/footer relationship?
261 $i = 1;
262 if (count($pWorksheet->getHeaderFooter()->getImages()) > 0) {
263 $this->writeRelationship(
264 $objWriter,
265 '_headerfooter_vml' . $i,
266 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/vmlDrawing',
267 '../drawings/vmlDrawingHF' . $pWorksheetId . '.vml'
271 $this->writeUnparsedRelationship($pWorksheet, $objWriter, 'ctrlProps', 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/ctrlProp');
272 $this->writeUnparsedRelationship($pWorksheet, $objWriter, 'vmlDrawings', 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/vmlDrawing');
273 $this->writeUnparsedRelationship($pWorksheet, $objWriter, 'printerSettings', 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/printerSettings');
275 $objWriter->endElement();
277 return $objWriter->getData();
280 private function writeUnparsedRelationship(\PhpOffice\PhpSpreadsheet\Worksheet\Worksheet $pWorksheet, XMLWriter $objWriter, $relationship, $type)
282 $unparsedLoadedData = $pWorksheet->getParent()->getUnparsedLoadedData();
283 if (!isset($unparsedLoadedData['sheets'][$pWorksheet->getCodeName()][$relationship])) {
284 return;
287 foreach ($unparsedLoadedData['sheets'][$pWorksheet->getCodeName()][$relationship] as $rId => $value) {
288 $this->writeRelationship(
289 $objWriter,
290 $rId,
291 $type,
292 $value['relFilePath']
298 * Write drawing relationships to XML format.
300 * @param \PhpOffice\PhpSpreadsheet\Worksheet\Worksheet $pWorksheet
301 * @param int &$chartRef Chart ID
302 * @param bool $includeCharts Flag indicating if we should write charts
304 * @throws WriterException
306 * @return string XML Output
308 public function writeDrawingRelationships(\PhpOffice\PhpSpreadsheet\Worksheet\Worksheet $pWorksheet, &$chartRef, $includeCharts = false)
310 // Create XML writer
311 $objWriter = null;
312 if ($this->getParentWriter()->getUseDiskCaching()) {
313 $objWriter = new XMLWriter(XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory());
314 } else {
315 $objWriter = new XMLWriter(XMLWriter::STORAGE_MEMORY);
318 // XML header
319 $objWriter->startDocument('1.0', 'UTF-8', 'yes');
321 // Relationships
322 $objWriter->startElement('Relationships');
323 $objWriter->writeAttribute('xmlns', 'http://schemas.openxmlformats.org/package/2006/relationships');
325 // Loop through images and write relationships
326 $i = 1;
327 $iterator = $pWorksheet->getDrawingCollection()->getIterator();
328 while ($iterator->valid()) {
329 if ($iterator->current() instanceof \PhpOffice\PhpSpreadsheet\Worksheet\Drawing
330 || $iterator->current() instanceof MemoryDrawing) {
331 // Write relationship for image drawing
332 $this->writeRelationship(
333 $objWriter,
335 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/image',
336 '../media/' . str_replace(' ', '', $iterator->current()->getIndexedFilename())
340 $iterator->next();
341 ++$i;
344 if ($includeCharts) {
345 // Loop through charts and write relationships
346 $chartCount = $pWorksheet->getChartCount();
347 if ($chartCount > 0) {
348 for ($c = 0; $c < $chartCount; ++$c) {
349 $this->writeRelationship(
350 $objWriter,
351 $i++,
352 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/chart',
353 '../charts/chart' . ++$chartRef . '.xml'
359 $objWriter->endElement();
361 return $objWriter->getData();
365 * Write header/footer drawing relationships to XML format.
367 * @param \PhpOffice\PhpSpreadsheet\Worksheet\Worksheet $pWorksheet
369 * @throws WriterException
371 * @return string XML Output
373 public function writeHeaderFooterDrawingRelationships(\PhpOffice\PhpSpreadsheet\Worksheet\Worksheet $pWorksheet)
375 // Create XML writer
376 $objWriter = null;
377 if ($this->getParentWriter()->getUseDiskCaching()) {
378 $objWriter = new XMLWriter(XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory());
379 } else {
380 $objWriter = new XMLWriter(XMLWriter::STORAGE_MEMORY);
383 // XML header
384 $objWriter->startDocument('1.0', 'UTF-8', 'yes');
386 // Relationships
387 $objWriter->startElement('Relationships');
388 $objWriter->writeAttribute('xmlns', 'http://schemas.openxmlformats.org/package/2006/relationships');
390 // Loop through images and write relationships
391 foreach ($pWorksheet->getHeaderFooter()->getImages() as $key => $value) {
392 // Write relationship for image drawing
393 $this->writeRelationship(
394 $objWriter,
395 $key,
396 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/image',
397 '../media/' . $value->getIndexedFilename()
401 $objWriter->endElement();
403 return $objWriter->getData();
407 * Write Override content type.
409 * @param XMLWriter $objWriter XML Writer
410 * @param int $pId Relationship ID. rId will be prepended!
411 * @param string $pType Relationship type
412 * @param string $pTarget Relationship target
413 * @param string $pTargetMode Relationship target mode
415 * @throws WriterException
417 private function writeRelationship(XMLWriter $objWriter, $pId, $pType, $pTarget, $pTargetMode = '')
419 if ($pType != '' && $pTarget != '') {
420 // Write relationship
421 $objWriter->startElement('Relationship');
422 $objWriter->writeAttribute('Id', 'rId' . $pId);
423 $objWriter->writeAttribute('Type', $pType);
424 $objWriter->writeAttribute('Target', $pTarget);
426 if ($pTargetMode != '') {
427 $objWriter->writeAttribute('TargetMode', $pTargetMode);
430 $objWriter->endElement();
431 } else {
432 throw new WriterException('Invalid parameters passed.');