| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466 | 
							- <?php
 
- namespace PhpOffice\PhpSpreadsheet\Writer\Xlsx;
 
- use PhpOffice\PhpSpreadsheet\Shared\XMLWriter;
 
- use PhpOffice\PhpSpreadsheet\Spreadsheet;
 
- use PhpOffice\PhpSpreadsheet\Worksheet\MemoryDrawing;
 
- use PhpOffice\PhpSpreadsheet\Writer\Exception as WriterException;
 
- class Rels extends WriterPart
 
- {
 
-     /**
 
-      * Write relationships to XML format.
 
-      *
 
-      * @param Spreadsheet $spreadsheet
 
-      *
 
-      * @throws WriterException
 
-      *
 
-      * @return string XML Output
 
-      */
 
-     public function writeRelationships(Spreadsheet $spreadsheet)
 
-     {
 
-         // Create XML writer
 
-         $objWriter = null;
 
-         if ($this->getParentWriter()->getUseDiskCaching()) {
 
-             $objWriter = new XMLWriter(XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory());
 
-         } else {
 
-             $objWriter = new XMLWriter(XMLWriter::STORAGE_MEMORY);
 
-         }
 
-         // XML header
 
-         $objWriter->startDocument('1.0', 'UTF-8', 'yes');
 
-         // Relationships
 
-         $objWriter->startElement('Relationships');
 
-         $objWriter->writeAttribute('xmlns', 'http://schemas.openxmlformats.org/package/2006/relationships');
 
-         $customPropertyList = $spreadsheet->getProperties()->getCustomProperties();
 
-         if (!empty($customPropertyList)) {
 
-             // Relationship docProps/app.xml
 
-             $this->writeRelationship(
 
-                 $objWriter,
 
-                 4,
 
-                 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/custom-properties',
 
-                 'docProps/custom.xml'
 
-             );
 
-         }
 
-         // Relationship docProps/app.xml
 
-         $this->writeRelationship(
 
-             $objWriter,
 
-             3,
 
-             'http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties',
 
-             'docProps/app.xml'
 
-         );
 
-         // Relationship docProps/core.xml
 
-         $this->writeRelationship(
 
-             $objWriter,
 
-             2,
 
-             'http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties',
 
-             'docProps/core.xml'
 
-         );
 
-         // Relationship xl/workbook.xml
 
-         $this->writeRelationship(
 
-             $objWriter,
 
-             1,
 
-             'http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument',
 
-             'xl/workbook.xml'
 
-         );
 
-         // a custom UI in workbook ?
 
-         if ($spreadsheet->hasRibbon()) {
 
-             $this->writeRelationShip(
 
-                 $objWriter,
 
-                 5,
 
-                 'http://schemas.microsoft.com/office/2006/relationships/ui/extensibility',
 
-                 $spreadsheet->getRibbonXMLData('target')
 
-             );
 
-         }
 
-         $objWriter->endElement();
 
-         return $objWriter->getData();
 
-     }
 
-     /**
 
-      * Write workbook relationships to XML format.
 
-      *
 
-      * @param Spreadsheet $spreadsheet
 
-      *
 
-      * @throws WriterException
 
-      *
 
-      * @return string XML Output
 
-      */
 
-     public function writeWorkbookRelationships(Spreadsheet $spreadsheet)
 
-     {
 
-         // Create XML writer
 
-         $objWriter = null;
 
-         if ($this->getParentWriter()->getUseDiskCaching()) {
 
-             $objWriter = new XMLWriter(XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory());
 
-         } else {
 
-             $objWriter = new XMLWriter(XMLWriter::STORAGE_MEMORY);
 
-         }
 
-         // XML header
 
-         $objWriter->startDocument('1.0', 'UTF-8', 'yes');
 
-         // Relationships
 
-         $objWriter->startElement('Relationships');
 
-         $objWriter->writeAttribute('xmlns', 'http://schemas.openxmlformats.org/package/2006/relationships');
 
-         // Relationship styles.xml
 
-         $this->writeRelationship(
 
-             $objWriter,
 
-             1,
 
-             'http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles',
 
-             'styles.xml'
 
-         );
 
-         // Relationship theme/theme1.xml
 
-         $this->writeRelationship(
 
-             $objWriter,
 
-             2,
 
-             'http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme',
 
-             'theme/theme1.xml'
 
-         );
 
-         // Relationship sharedStrings.xml
 
-         $this->writeRelationship(
 
-             $objWriter,
 
-             3,
 
-             'http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings',
 
-             'sharedStrings.xml'
 
-         );
 
-         // Relationships with sheets
 
-         $sheetCount = $spreadsheet->getSheetCount();
 
-         for ($i = 0; $i < $sheetCount; ++$i) {
 
-             $this->writeRelationship(
 
-                 $objWriter,
 
-                 ($i + 1 + 3),
 
-                 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet',
 
-                 'worksheets/sheet' . ($i + 1) . '.xml'
 
-             );
 
-         }
 
-         // Relationships for vbaProject if needed
 
-         // id : just after the last sheet
 
-         if ($spreadsheet->hasMacros()) {
 
-             $this->writeRelationShip(
 
-                 $objWriter,
 
-                 ($i + 1 + 3),
 
-                 'http://schemas.microsoft.com/office/2006/relationships/vbaProject',
 
-                 'vbaProject.bin'
 
-             );
 
-             ++$i; //increment i if needed for an another relation
 
-         }
 
-         $objWriter->endElement();
 
-         return $objWriter->getData();
 
-     }
 
-     /**
 
-      * Write worksheet relationships to XML format.
 
-      *
 
-      * Numbering is as follows:
 
-      *     rId1                 - Drawings
 
-      *  rId_hyperlink_x     - Hyperlinks
 
-      *
 
-      * @param \PhpOffice\PhpSpreadsheet\Worksheet\Worksheet $pWorksheet
 
-      * @param int $pWorksheetId
 
-      * @param bool $includeCharts Flag indicating if we should write charts
 
-      *
 
-      * @throws WriterException
 
-      *
 
-      * @return string XML Output
 
-      */
 
-     public function writeWorksheetRelationships(\PhpOffice\PhpSpreadsheet\Worksheet\Worksheet $pWorksheet, $pWorksheetId = 1, $includeCharts = false)
 
-     {
 
-         // Create XML writer
 
-         $objWriter = null;
 
-         if ($this->getParentWriter()->getUseDiskCaching()) {
 
-             $objWriter = new XMLWriter(XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory());
 
-         } else {
 
-             $objWriter = new XMLWriter(XMLWriter::STORAGE_MEMORY);
 
-         }
 
-         // XML header
 
-         $objWriter->startDocument('1.0', 'UTF-8', 'yes');
 
-         // Relationships
 
-         $objWriter->startElement('Relationships');
 
-         $objWriter->writeAttribute('xmlns', 'http://schemas.openxmlformats.org/package/2006/relationships');
 
-         // Write drawing relationships?
 
-         $d = 0;
 
-         $drawingOriginalIds = [];
 
-         $unparsedLoadedData = $pWorksheet->getParent()->getUnparsedLoadedData();
 
-         if (isset($unparsedLoadedData['sheets'][$pWorksheet->getCodeName()]['drawingOriginalIds'])) {
 
-             $drawingOriginalIds = $unparsedLoadedData['sheets'][$pWorksheet->getCodeName()]['drawingOriginalIds'];
 
-         }
 
-         if ($includeCharts) {
 
-             $charts = $pWorksheet->getChartCollection();
 
-         } else {
 
-             $charts = [];
 
-         }
 
-         if (($pWorksheet->getDrawingCollection()->count() > 0) || (count($charts) > 0) || $drawingOriginalIds) {
 
-             $relPath = '../drawings/drawing' . $pWorksheetId . '.xml';
 
-             $rId = ++$d;
 
-             if (isset($drawingOriginalIds[$relPath])) {
 
-                 $rId = (int) (substr($drawingOriginalIds[$relPath], 3));
 
-             }
 
-             $this->writeRelationship(
 
-                 $objWriter,
 
-                 $rId,
 
-                 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/drawing',
 
-                 $relPath
 
-             );
 
-         }
 
-         // Write hyperlink relationships?
 
-         $i = 1;
 
-         foreach ($pWorksheet->getHyperlinkCollection() as $hyperlink) {
 
-             if (!$hyperlink->isInternal()) {
 
-                 $this->writeRelationship(
 
-                     $objWriter,
 
-                     '_hyperlink_' . $i,
 
-                     'http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink',
 
-                     $hyperlink->getUrl(),
 
-                     'External'
 
-                 );
 
-                 ++$i;
 
-             }
 
-         }
 
-         // Write comments relationship?
 
-         $i = 1;
 
-         if (count($pWorksheet->getComments()) > 0) {
 
-             $this->writeRelationship(
 
-                 $objWriter,
 
-                 '_comments_vml' . $i,
 
-                 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/vmlDrawing',
 
-                 '../drawings/vmlDrawing' . $pWorksheetId . '.vml'
 
-             );
 
-             $this->writeRelationship(
 
-                 $objWriter,
 
-                 '_comments' . $i,
 
-                 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/comments',
 
-                 '../comments' . $pWorksheetId . '.xml'
 
-             );
 
-         }
 
-         // Write header/footer relationship?
 
-         $i = 1;
 
-         if (count($pWorksheet->getHeaderFooter()->getImages()) > 0) {
 
-             $this->writeRelationship(
 
-                 $objWriter,
 
-                 '_headerfooter_vml' . $i,
 
-                 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/vmlDrawing',
 
-                 '../drawings/vmlDrawingHF' . $pWorksheetId . '.vml'
 
-             );
 
-         }
 
-         $this->writeUnparsedRelationship($pWorksheet, $objWriter, 'ctrlProps', 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/ctrlProp');
 
-         $this->writeUnparsedRelationship($pWorksheet, $objWriter, 'vmlDrawings', 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/vmlDrawing');
 
-         $this->writeUnparsedRelationship($pWorksheet, $objWriter, 'printerSettings', 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/printerSettings');
 
-         $objWriter->endElement();
 
-         return $objWriter->getData();
 
-     }
 
-     private function writeUnparsedRelationship(\PhpOffice\PhpSpreadsheet\Worksheet\Worksheet $pWorksheet, XMLWriter $objWriter, $relationship, $type)
 
-     {
 
-         $unparsedLoadedData = $pWorksheet->getParent()->getUnparsedLoadedData();
 
-         if (!isset($unparsedLoadedData['sheets'][$pWorksheet->getCodeName()][$relationship])) {
 
-             return;
 
-         }
 
-         foreach ($unparsedLoadedData['sheets'][$pWorksheet->getCodeName()][$relationship] as $rId => $value) {
 
-             $this->writeRelationship(
 
-                 $objWriter,
 
-                 $rId,
 
-                 $type,
 
-                 $value['relFilePath']
 
-             );
 
-         }
 
-     }
 
-     /**
 
-      * Write drawing relationships to XML format.
 
-      *
 
-      * @param \PhpOffice\PhpSpreadsheet\Worksheet\Worksheet $pWorksheet
 
-      * @param int &$chartRef Chart ID
 
-      * @param bool $includeCharts Flag indicating if we should write charts
 
-      *
 
-      * @throws WriterException
 
-      *
 
-      * @return string XML Output
 
-      */
 
-     public function writeDrawingRelationships(\PhpOffice\PhpSpreadsheet\Worksheet\Worksheet $pWorksheet, &$chartRef, $includeCharts = false)
 
-     {
 
-         // Create XML writer
 
-         $objWriter = null;
 
-         if ($this->getParentWriter()->getUseDiskCaching()) {
 
-             $objWriter = new XMLWriter(XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory());
 
-         } else {
 
-             $objWriter = new XMLWriter(XMLWriter::STORAGE_MEMORY);
 
-         }
 
-         // XML header
 
-         $objWriter->startDocument('1.0', 'UTF-8', 'yes');
 
-         // Relationships
 
-         $objWriter->startElement('Relationships');
 
-         $objWriter->writeAttribute('xmlns', 'http://schemas.openxmlformats.org/package/2006/relationships');
 
-         // Loop through images and write relationships
 
-         $i = 1;
 
-         $iterator = $pWorksheet->getDrawingCollection()->getIterator();
 
-         while ($iterator->valid()) {
 
-             if ($iterator->current() instanceof \PhpOffice\PhpSpreadsheet\Worksheet\Drawing
 
-                 || $iterator->current() instanceof MemoryDrawing) {
 
-                 // Write relationship for image drawing
 
-                 /** @var \PhpOffice\PhpSpreadsheet\Worksheet\Drawing $drawing */
 
-                 $drawing = $iterator->current();
 
-                 $this->writeRelationship(
 
-                     $objWriter,
 
-                     $i,
 
-                     'http://schemas.openxmlformats.org/officeDocument/2006/relationships/image',
 
-                     '../media/' . str_replace(' ', '', $drawing->getIndexedFilename())
 
-                 );
 
-                 $i = $this->writeDrawingHyperLink($objWriter, $drawing, $i);
 
-             }
 
-             $iterator->next();
 
-             ++$i;
 
-         }
 
-         if ($includeCharts) {
 
-             // Loop through charts and write relationships
 
-             $chartCount = $pWorksheet->getChartCount();
 
-             if ($chartCount > 0) {
 
-                 for ($c = 0; $c < $chartCount; ++$c) {
 
-                     $this->writeRelationship(
 
-                         $objWriter,
 
-                         $i++,
 
-                         'http://schemas.openxmlformats.org/officeDocument/2006/relationships/chart',
 
-                         '../charts/chart' . ++$chartRef . '.xml'
 
-                     );
 
-                 }
 
-             }
 
-         }
 
-         $objWriter->endElement();
 
-         return $objWriter->getData();
 
-     }
 
-     /**
 
-      * Write header/footer drawing relationships to XML format.
 
-      *
 
-      * @param \PhpOffice\PhpSpreadsheet\Worksheet\Worksheet $pWorksheet
 
-      *
 
-      * @throws WriterException
 
-      *
 
-      * @return string XML Output
 
-      */
 
-     public function writeHeaderFooterDrawingRelationships(\PhpOffice\PhpSpreadsheet\Worksheet\Worksheet $pWorksheet)
 
-     {
 
-         // Create XML writer
 
-         $objWriter = null;
 
-         if ($this->getParentWriter()->getUseDiskCaching()) {
 
-             $objWriter = new XMLWriter(XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory());
 
-         } else {
 
-             $objWriter = new XMLWriter(XMLWriter::STORAGE_MEMORY);
 
-         }
 
-         // XML header
 
-         $objWriter->startDocument('1.0', 'UTF-8', 'yes');
 
-         // Relationships
 
-         $objWriter->startElement('Relationships');
 
-         $objWriter->writeAttribute('xmlns', 'http://schemas.openxmlformats.org/package/2006/relationships');
 
-         // Loop through images and write relationships
 
-         foreach ($pWorksheet->getHeaderFooter()->getImages() as $key => $value) {
 
-             // Write relationship for image drawing
 
-             $this->writeRelationship(
 
-                 $objWriter,
 
-                 $key,
 
-                 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/image',
 
-                 '../media/' . $value->getIndexedFilename()
 
-             );
 
-         }
 
-         $objWriter->endElement();
 
-         return $objWriter->getData();
 
-     }
 
-     /**
 
-      * Write Override content type.
 
-      *
 
-      * @param XMLWriter $objWriter XML Writer
 
-      * @param int $pId Relationship ID. rId will be prepended!
 
-      * @param string $pType Relationship type
 
-      * @param string $pTarget Relationship target
 
-      * @param string $pTargetMode Relationship target mode
 
-      *
 
-      * @throws WriterException
 
-      */
 
-     private function writeRelationship(XMLWriter $objWriter, $pId, $pType, $pTarget, $pTargetMode = '')
 
-     {
 
-         if ($pType != '' && $pTarget != '') {
 
-             // Write relationship
 
-             $objWriter->startElement('Relationship');
 
-             $objWriter->writeAttribute('Id', 'rId' . $pId);
 
-             $objWriter->writeAttribute('Type', $pType);
 
-             $objWriter->writeAttribute('Target', $pTarget);
 
-             if ($pTargetMode != '') {
 
-                 $objWriter->writeAttribute('TargetMode', $pTargetMode);
 
-             }
 
-             $objWriter->endElement();
 
-         } else {
 
-             throw new WriterException('Invalid parameters passed.');
 
-         }
 
-     }
 
-     /**
 
-      * @param $objWriter
 
-      * @param \PhpOffice\PhpSpreadsheet\Worksheet\Drawing $drawing
 
-      * @param $i
 
-      *
 
-      * @throws WriterException
 
-      *
 
-      * @return int
 
-      */
 
-     private function writeDrawingHyperLink($objWriter, $drawing, $i)
 
-     {
 
-         if ($drawing->getHyperlink() === null) {
 
-             return $i;
 
-         }
 
-         ++$i;
 
-         $this->writeRelationship(
 
-             $objWriter,
 
-             $i,
 
-             'http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink',
 
-             $drawing->getHyperlink()->getUrl(),
 
-             $drawing->getHyperlink()->getTypeHyperlink()
 
-         );
 
-         return $i;
 
-     }
 
- }
 
 
  |