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
13 * Write relationships to XML format.
15 * @param Spreadsheet $spreadsheet
17 * @throws WriterException
19 * @return string XML Output
21 public function writeRelationships(Spreadsheet
$spreadsheet)
25 if ($this->getParentWriter()->getUseDiskCaching()) {
26 $objWriter = new XMLWriter(XMLWriter
::STORAGE_DISK
, $this->getParentWriter()->getDiskCachingDirectory());
28 $objWriter = new XMLWriter(XMLWriter
::STORAGE_MEMORY
);
32 $objWriter->startDocument('1.0', 'UTF-8', 'yes');
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(
44 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/custom-properties',
49 // Relationship docProps/app.xml
50 $this->writeRelationship(
53 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties',
57 // Relationship docProps/core.xml
58 $this->writeRelationship(
61 'http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties',
65 // Relationship xl/workbook.xml
66 $this->writeRelationship(
69 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument',
72 // a custom UI in workbook ?
73 if ($spreadsheet->hasRibbon()) {
74 $this->writeRelationShip(
77 'http://schemas.microsoft.com/office/2006/relationships/ui/extensibility',
78 $spreadsheet->getRibbonXMLData('target')
82 $objWriter->endElement();
84 return $objWriter->getData();
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)
100 if ($this->getParentWriter()->getUseDiskCaching()) {
101 $objWriter = new XMLWriter(XMLWriter
::STORAGE_DISK
, $this->getParentWriter()->getDiskCachingDirectory());
103 $objWriter = new XMLWriter(XMLWriter
::STORAGE_MEMORY
);
107 $objWriter->startDocument('1.0', 'UTF-8', 'yes');
110 $objWriter->startElement('Relationships');
111 $objWriter->writeAttribute('xmlns', 'http://schemas.openxmlformats.org/package/2006/relationships');
113 // Relationship styles.xml
114 $this->writeRelationship(
117 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles',
121 // Relationship theme/theme1.xml
122 $this->writeRelationship(
125 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme',
129 // Relationship sharedStrings.xml
130 $this->writeRelationship(
133 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings',
137 // Relationships with sheets
138 $sheetCount = $spreadsheet->getSheetCount();
139 for ($i = 0; $i < $sheetCount; ++
$i) {
140 $this->writeRelationship(
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(
153 'http://schemas.microsoft.com/office/2006/relationships/vbaProject',
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:
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)
183 if ($this->getParentWriter()->getUseDiskCaching()) {
184 $objWriter = new XMLWriter(XMLWriter
::STORAGE_DISK
, $this->getParentWriter()->getDiskCachingDirectory());
186 $objWriter = new XMLWriter(XMLWriter
::STORAGE_MEMORY
);
190 $objWriter->startDocument('1.0', 'UTF-8', 'yes');
193 $objWriter->startElement('Relationships');
194 $objWriter->writeAttribute('xmlns', 'http://schemas.openxmlformats.org/package/2006/relationships');
196 // Write drawing relationships?
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();
210 if (($pWorksheet->getDrawingCollection()->count() > 0) ||
(count($charts) > 0) ||
$drawingOriginalIds) {
211 $relPath = '../drawings/drawing' . $pWorksheetId . '.xml';
214 if (isset($drawingOriginalIds[$relPath])) {
215 $rId = (int) (substr($drawingOriginalIds[$relPath], 3));
218 $this->writeRelationship(
221 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/drawing',
226 // Write hyperlink relationships?
228 foreach ($pWorksheet->getHyperlinkCollection() as $hyperlink) {
229 if (!$hyperlink->isInternal()) {
230 $this->writeRelationship(
233 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink',
234 $hyperlink->getUrl(),
242 // Write comments relationship?
244 if (count($pWorksheet->getComments()) > 0) {
245 $this->writeRelationship(
247 '_comments_vml' . $i,
248 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/vmlDrawing',
249 '../drawings/vmlDrawing' . $pWorksheetId . '.vml'
252 $this->writeRelationship(
255 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/comments',
256 '../comments' . $pWorksheetId . '.xml'
260 // Write header/footer relationship?
262 if (count($pWorksheet->getHeaderFooter()->getImages()) > 0) {
263 $this->writeRelationship(
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])) {
287 foreach ($unparsedLoadedData['sheets'][$pWorksheet->getCodeName()][$relationship] as $rId => $value) {
288 $this->writeRelationship(
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)
312 if ($this->getParentWriter()->getUseDiskCaching()) {
313 $objWriter = new XMLWriter(XMLWriter
::STORAGE_DISK
, $this->getParentWriter()->getDiskCachingDirectory());
315 $objWriter = new XMLWriter(XMLWriter
::STORAGE_MEMORY
);
319 $objWriter->startDocument('1.0', 'UTF-8', 'yes');
322 $objWriter->startElement('Relationships');
323 $objWriter->writeAttribute('xmlns', 'http://schemas.openxmlformats.org/package/2006/relationships');
325 // Loop through images and write relationships
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(
335 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/image',
336 '../media/' . str_replace(' ', '', $iterator->current()->getIndexedFilename())
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(
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)
377 if ($this->getParentWriter()->getUseDiskCaching()) {
378 $objWriter = new XMLWriter(XMLWriter
::STORAGE_DISK
, $this->getParentWriter()->getDiskCachingDirectory());
380 $objWriter = new XMLWriter(XMLWriter
::STORAGE_MEMORY
);
384 $objWriter->startDocument('1.0', 'UTF-8', 'yes');
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(
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();
432 throw new WriterException('Invalid parameters passed.');