Passed
Push — develop ( b05d07...17d4a5 )
by Adrien
26:16
created

Drawing::writeHyperLinkDrawing()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 10
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 7
CRAP Score 2

Importance

Changes 0
Metric Value
cc 2
eloc 6
nc 2
nop 2
dl 0
loc 10
rs 10
c 0
b 0
f 0
ccs 7
cts 7
cp 1
crap 2
1
<?php
2
3
namespace PhpOffice\PhpSpreadsheet\Writer\Xlsx;
4
5
use PhpOffice\PhpSpreadsheet\Cell\Coordinate;
6
use PhpOffice\PhpSpreadsheet\Shared\XMLWriter;
7
use PhpOffice\PhpSpreadsheet\Spreadsheet;
8
use PhpOffice\PhpSpreadsheet\Worksheet\BaseDrawing;
9
use PhpOffice\PhpSpreadsheet\Worksheet\HeaderFooterDrawing;
10
use PhpOffice\PhpSpreadsheet\Writer\Exception as WriterException;
11
12
class Drawing extends WriterPart
13
{
14
    /**
15
     * Write drawings to XML format.
16
     *
17
     * @param \PhpOffice\PhpSpreadsheet\Worksheet\Worksheet $pWorksheet
18
     * @param bool $includeCharts Flag indicating if we should include drawing details for charts
19
     *
20
     * @throws WriterException
21
     *
22
     * @return string XML Output
23
     */
24 25
    public function writeDrawings(\PhpOffice\PhpSpreadsheet\Worksheet\Worksheet $pWorksheet, $includeCharts = false)
25
    {
26
        // Create XML writer
27 25
        $objWriter = null;
28 25
        if ($this->getParentWriter()->getUseDiskCaching()) {
29
            $objWriter = new XMLWriter(XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory());
30
        } else {
31 25
            $objWriter = new XMLWriter(XMLWriter::STORAGE_MEMORY);
32
        }
33
34
        // XML header
35 25
        $objWriter->startDocument('1.0', 'UTF-8', 'yes');
36
37
        // xdr:wsDr
38 25
        $objWriter->startElement('xdr:wsDr');
39 25
        $objWriter->writeAttribute('xmlns:xdr', 'http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing');
40 25
        $objWriter->writeAttribute('xmlns:a', 'http://schemas.openxmlformats.org/drawingml/2006/main');
41
42
        // Loop through images and write drawings
43 25
        $i = 1;
44 25
        $iterator = $pWorksheet->getDrawingCollection()->getIterator();
45 25
        while ($iterator->valid()) {
46
            /** @var BaseDrawing $pDrawing */
47 12
            $pDrawing = $iterator->current();
48 12
            $pRelationId = $i;
49 12
            $hlinkClickId = $pDrawing->getHyperlink() === null ? null : ++$i;
50
51 12
            $this->writeDrawing($objWriter, $pDrawing, $pRelationId, $hlinkClickId);
52
53 12
            $iterator->next();
54 12
            ++$i;
55
        }
56
57 25
        if ($includeCharts) {
58 13
            $chartCount = $pWorksheet->getChartCount();
59
            // Loop through charts and write the chart position
60 13
            if ($chartCount > 0) {
61 13
                for ($c = 0; $c < $chartCount; ++$c) {
62 13
                    $this->writeChart($objWriter, $pWorksheet->getChartByIndex($c), $c + $i);
1 ignored issue
show
Bug introduced by
It seems like $pWorksheet->getChartByIndex($c) can also be of type false; however, parameter $pChart of PhpOffice\PhpSpreadsheet...x\Drawing::writeChart() does only seem to accept PhpOffice\PhpSpreadsheet\Chart\Chart, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

62
                    $this->writeChart($objWriter, /** @scrutinizer ignore-type */ $pWorksheet->getChartByIndex($c), $c + $i);
Loading history...
63
                }
64
            }
65
        }
66
67
        // unparsed AlternateContent
68 25
        $unparsedLoadedData = $pWorksheet->getParent()->getUnparsedLoadedData();
69 25
        if (isset($unparsedLoadedData['sheets'][$pWorksheet->getCodeName()]['drawingAlternateContents'])) {
70 1
            foreach ($unparsedLoadedData['sheets'][$pWorksheet->getCodeName()]['drawingAlternateContents'] as $drawingAlternateContent) {
71 1
                $objWriter->writeRaw($drawingAlternateContent);
72
            }
73
        }
74
75 25
        $objWriter->endElement();
76
77
        // Return
78 25
        return $objWriter->getData();
79
    }
80
81
    /**
82
     * Write drawings to XML format.
83
     *
84
     * @param XMLWriter $objWriter XML Writer
85
     * @param \PhpOffice\PhpSpreadsheet\Chart\Chart $pChart
86
     * @param int $pRelationId
87
     */
88 13
    public function writeChart(XMLWriter $objWriter, \PhpOffice\PhpSpreadsheet\Chart\Chart $pChart, $pRelationId = -1)
89
    {
90 13
        $tl = $pChart->getTopLeftPosition();
91 13
        $tl['colRow'] = Coordinate::coordinateFromString($tl['cell']);
92 13
        $br = $pChart->getBottomRightPosition();
93 13
        $br['colRow'] = Coordinate::coordinateFromString($br['cell']);
94
95 13
        $objWriter->startElement('xdr:twoCellAnchor');
96
97 13
        $objWriter->startElement('xdr:from');
98 13
        $objWriter->writeElement('xdr:col', Coordinate::columnIndexFromString($tl['colRow'][0]) - 1);
99 13
        $objWriter->writeElement('xdr:colOff', \PhpOffice\PhpSpreadsheet\Shared\Drawing::pixelsToEMU($tl['xOffset']));
100 13
        $objWriter->writeElement('xdr:row', $tl['colRow'][1] - 1);
101 13
        $objWriter->writeElement('xdr:rowOff', \PhpOffice\PhpSpreadsheet\Shared\Drawing::pixelsToEMU($tl['yOffset']));
102 13
        $objWriter->endElement();
103 13
        $objWriter->startElement('xdr:to');
104 13
        $objWriter->writeElement('xdr:col', Coordinate::columnIndexFromString($br['colRow'][0]) - 1);
105 13
        $objWriter->writeElement('xdr:colOff', \PhpOffice\PhpSpreadsheet\Shared\Drawing::pixelsToEMU($br['xOffset']));
106 13
        $objWriter->writeElement('xdr:row', $br['colRow'][1] - 1);
107 13
        $objWriter->writeElement('xdr:rowOff', \PhpOffice\PhpSpreadsheet\Shared\Drawing::pixelsToEMU($br['yOffset']));
108 13
        $objWriter->endElement();
109
110 13
        $objWriter->startElement('xdr:graphicFrame');
111 13
        $objWriter->writeAttribute('macro', '');
112 13
        $objWriter->startElement('xdr:nvGraphicFramePr');
113 13
        $objWriter->startElement('xdr:cNvPr');
114 13
        $objWriter->writeAttribute('name', 'Chart ' . $pRelationId);
115 13
        $objWriter->writeAttribute('id', 1025 * $pRelationId);
116 13
        $objWriter->endElement();
117 13
        $objWriter->startElement('xdr:cNvGraphicFramePr');
118 13
        $objWriter->startElement('a:graphicFrameLocks');
119 13
        $objWriter->endElement();
120 13
        $objWriter->endElement();
121 13
        $objWriter->endElement();
122
123 13
        $objWriter->startElement('xdr:xfrm');
124 13
        $objWriter->startElement('a:off');
125 13
        $objWriter->writeAttribute('x', '0');
126 13
        $objWriter->writeAttribute('y', '0');
127 13
        $objWriter->endElement();
128 13
        $objWriter->startElement('a:ext');
129 13
        $objWriter->writeAttribute('cx', '0');
130 13
        $objWriter->writeAttribute('cy', '0');
131 13
        $objWriter->endElement();
132 13
        $objWriter->endElement();
133
134 13
        $objWriter->startElement('a:graphic');
135 13
        $objWriter->startElement('a:graphicData');
136 13
        $objWriter->writeAttribute('uri', 'http://schemas.openxmlformats.org/drawingml/2006/chart');
137 13
        $objWriter->startElement('c:chart');
138 13
        $objWriter->writeAttribute('xmlns:c', 'http://schemas.openxmlformats.org/drawingml/2006/chart');
139 13
        $objWriter->writeAttribute('xmlns:r', 'http://schemas.openxmlformats.org/officeDocument/2006/relationships');
140 13
        $objWriter->writeAttribute('r:id', 'rId' . $pRelationId);
141 13
        $objWriter->endElement();
142 13
        $objWriter->endElement();
143 13
        $objWriter->endElement();
144 13
        $objWriter->endElement();
145
146 13
        $objWriter->startElement('xdr:clientData');
147 13
        $objWriter->endElement();
148
149 13
        $objWriter->endElement();
150 13
    }
151
152
    /**
153
     * Write drawings to XML format.
154
     *
155
     * @param XMLWriter $objWriter XML Writer
156
     * @param BaseDrawing $pDrawing
157
     * @param int $pRelationId
158
     * @param null|int $hlinkClickId
159
     *
160
     * @throws WriterException
161
     */
162 12
    public function writeDrawing(XMLWriter $objWriter, BaseDrawing $pDrawing, $pRelationId = -1, $hlinkClickId = null)
163
    {
164 12
        if ($pRelationId >= 0) {
165
            // xdr:oneCellAnchor
166 12
            $objWriter->startElement('xdr:oneCellAnchor');
167
            // Image location
168 12
            $aCoordinates = Coordinate::coordinateFromString($pDrawing->getCoordinates());
169 12
            $aCoordinates[0] = Coordinate::columnIndexFromString($aCoordinates[0]);
170
171
            // xdr:from
172 12
            $objWriter->startElement('xdr:from');
173 12
            $objWriter->writeElement('xdr:col', $aCoordinates[0] - 1);
174 12
            $objWriter->writeElement('xdr:colOff', \PhpOffice\PhpSpreadsheet\Shared\Drawing::pixelsToEMU($pDrawing->getOffsetX()));
175 12
            $objWriter->writeElement('xdr:row', $aCoordinates[1] - 1);
176 12
            $objWriter->writeElement('xdr:rowOff', \PhpOffice\PhpSpreadsheet\Shared\Drawing::pixelsToEMU($pDrawing->getOffsetY()));
177 12
            $objWriter->endElement();
178
179
            // xdr:ext
180 12
            $objWriter->startElement('xdr:ext');
181 12
            $objWriter->writeAttribute('cx', \PhpOffice\PhpSpreadsheet\Shared\Drawing::pixelsToEMU($pDrawing->getWidth()));
182 12
            $objWriter->writeAttribute('cy', \PhpOffice\PhpSpreadsheet\Shared\Drawing::pixelsToEMU($pDrawing->getHeight()));
183 12
            $objWriter->endElement();
184
185
            // xdr:pic
186 12
            $objWriter->startElement('xdr:pic');
187
188
            // xdr:nvPicPr
189 12
            $objWriter->startElement('xdr:nvPicPr');
190
191
            // xdr:cNvPr
192 12
            $objWriter->startElement('xdr:cNvPr');
193 12
            $objWriter->writeAttribute('id', $pRelationId);
194 12
            $objWriter->writeAttribute('name', $pDrawing->getName());
195 12
            $objWriter->writeAttribute('descr', $pDrawing->getDescription());
196
197
            //a:hlinkClick
198 12
            $this->writeHyperLinkDrawing($objWriter, $hlinkClickId);
199
200 12
            $objWriter->endElement();
201
202
            // xdr:cNvPicPr
203 12
            $objWriter->startElement('xdr:cNvPicPr');
204
205
            // a:picLocks
206 12
            $objWriter->startElement('a:picLocks');
207 12
            $objWriter->writeAttribute('noChangeAspect', '1');
208 12
            $objWriter->endElement();
209
210 12
            $objWriter->endElement();
211
212 12
            $objWriter->endElement();
213
214
            // xdr:blipFill
215 12
            $objWriter->startElement('xdr:blipFill');
216
217
            // a:blip
218 12
            $objWriter->startElement('a:blip');
219 12
            $objWriter->writeAttribute('xmlns:r', 'http://schemas.openxmlformats.org/officeDocument/2006/relationships');
220 12
            $objWriter->writeAttribute('r:embed', 'rId' . $pRelationId);
221 12
            $objWriter->endElement();
222
223
            // a:stretch
224 12
            $objWriter->startElement('a:stretch');
225 12
            $objWriter->writeElement('a:fillRect', null);
226 12
            $objWriter->endElement();
227
228 12
            $objWriter->endElement();
229
230
            // xdr:spPr
231 12
            $objWriter->startElement('xdr:spPr');
232
233
            // a:xfrm
234 12
            $objWriter->startElement('a:xfrm');
235 12
            $objWriter->writeAttribute('rot', \PhpOffice\PhpSpreadsheet\Shared\Drawing::degreesToAngle($pDrawing->getRotation()));
236 12
            $objWriter->endElement();
237
238
            // a:prstGeom
239 12
            $objWriter->startElement('a:prstGeom');
240 12
            $objWriter->writeAttribute('prst', 'rect');
241
242
            // a:avLst
243 12
            $objWriter->writeElement('a:avLst', null);
244
245 12
            $objWriter->endElement();
246
247 12
            if ($pDrawing->getShadow()->getVisible()) {
248
                // a:effectLst
249 5
                $objWriter->startElement('a:effectLst');
250
251
                // a:outerShdw
252 5
                $objWriter->startElement('a:outerShdw');
253 5
                $objWriter->writeAttribute('blurRad', \PhpOffice\PhpSpreadsheet\Shared\Drawing::pixelsToEMU($pDrawing->getShadow()->getBlurRadius()));
254 5
                $objWriter->writeAttribute('dist', \PhpOffice\PhpSpreadsheet\Shared\Drawing::pixelsToEMU($pDrawing->getShadow()->getDistance()));
255 5
                $objWriter->writeAttribute('dir', \PhpOffice\PhpSpreadsheet\Shared\Drawing::degreesToAngle($pDrawing->getShadow()->getDirection()));
256 5
                $objWriter->writeAttribute('algn', $pDrawing->getShadow()->getAlignment());
257 5
                $objWriter->writeAttribute('rotWithShape', '0');
258
259
                // a:srgbClr
260 5
                $objWriter->startElement('a:srgbClr');
261 5
                $objWriter->writeAttribute('val', $pDrawing->getShadow()->getColor()->getRGB());
262
263
                // a:alpha
264 5
                $objWriter->startElement('a:alpha');
265 5
                $objWriter->writeAttribute('val', $pDrawing->getShadow()->getAlpha() * 1000);
266 5
                $objWriter->endElement();
267
268 5
                $objWriter->endElement();
269
270 5
                $objWriter->endElement();
271
272 5
                $objWriter->endElement();
273
            }
274 12
            $objWriter->endElement();
275
276 12
            $objWriter->endElement();
277
278
            // xdr:clientData
279 12
            $objWriter->writeElement('xdr:clientData', null);
280
281 12
            $objWriter->endElement();
282
        } else {
283
            throw new WriterException('Invalid parameters passed.');
284
        }
285 12
    }
286
287
    /**
288
     * Write VML header/footer images to XML format.
289
     *
290
     * @param \PhpOffice\PhpSpreadsheet\Worksheet\Worksheet $pWorksheet
291
     *
292
     * @throws WriterException
293
     *
294
     * @return string XML Output
295
     */
296 1
    public function writeVMLHeaderFooterImages(\PhpOffice\PhpSpreadsheet\Worksheet\Worksheet $pWorksheet)
297
    {
298
        // Create XML writer
299 1
        $objWriter = null;
300 1
        if ($this->getParentWriter()->getUseDiskCaching()) {
301
            $objWriter = new XMLWriter(XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory());
302
        } else {
303 1
            $objWriter = new XMLWriter(XMLWriter::STORAGE_MEMORY);
304
        }
305
306
        // XML header
307 1
        $objWriter->startDocument('1.0', 'UTF-8', 'yes');
308
309
        // Header/footer images
310 1
        $images = $pWorksheet->getHeaderFooter()->getImages();
311
312
        // xml
313 1
        $objWriter->startElement('xml');
314 1
        $objWriter->writeAttribute('xmlns:v', 'urn:schemas-microsoft-com:vml');
315 1
        $objWriter->writeAttribute('xmlns:o', 'urn:schemas-microsoft-com:office:office');
316 1
        $objWriter->writeAttribute('xmlns:x', 'urn:schemas-microsoft-com:office:excel');
317
318
        // o:shapelayout
319 1
        $objWriter->startElement('o:shapelayout');
320 1
        $objWriter->writeAttribute('v:ext', 'edit');
321
322
        // o:idmap
323 1
        $objWriter->startElement('o:idmap');
324 1
        $objWriter->writeAttribute('v:ext', 'edit');
325 1
        $objWriter->writeAttribute('data', '1');
326 1
        $objWriter->endElement();
327
328 1
        $objWriter->endElement();
329
330
        // v:shapetype
331 1
        $objWriter->startElement('v:shapetype');
332 1
        $objWriter->writeAttribute('id', '_x0000_t75');
333 1
        $objWriter->writeAttribute('coordsize', '21600,21600');
334 1
        $objWriter->writeAttribute('o:spt', '75');
335 1
        $objWriter->writeAttribute('o:preferrelative', 't');
336 1
        $objWriter->writeAttribute('path', 'm@4@5l@4@11@9@11@9@5xe');
337 1
        $objWriter->writeAttribute('filled', 'f');
338 1
        $objWriter->writeAttribute('stroked', 'f');
339
340
        // v:stroke
341 1
        $objWriter->startElement('v:stroke');
342 1
        $objWriter->writeAttribute('joinstyle', 'miter');
343 1
        $objWriter->endElement();
344
345
        // v:formulas
346 1
        $objWriter->startElement('v:formulas');
347
348
        // v:f
349 1
        $objWriter->startElement('v:f');
350 1
        $objWriter->writeAttribute('eqn', 'if lineDrawn pixelLineWidth 0');
351 1
        $objWriter->endElement();
352
353
        // v:f
354 1
        $objWriter->startElement('v:f');
355 1
        $objWriter->writeAttribute('eqn', 'sum @0 1 0');
356 1
        $objWriter->endElement();
357
358
        // v:f
359 1
        $objWriter->startElement('v:f');
360 1
        $objWriter->writeAttribute('eqn', 'sum 0 0 @1');
361 1
        $objWriter->endElement();
362
363
        // v:f
364 1
        $objWriter->startElement('v:f');
365 1
        $objWriter->writeAttribute('eqn', 'prod @2 1 2');
366 1
        $objWriter->endElement();
367
368
        // v:f
369 1
        $objWriter->startElement('v:f');
370 1
        $objWriter->writeAttribute('eqn', 'prod @3 21600 pixelWidth');
371 1
        $objWriter->endElement();
372
373
        // v:f
374 1
        $objWriter->startElement('v:f');
375 1
        $objWriter->writeAttribute('eqn', 'prod @3 21600 pixelHeight');
376 1
        $objWriter->endElement();
377
378
        // v:f
379 1
        $objWriter->startElement('v:f');
380 1
        $objWriter->writeAttribute('eqn', 'sum @0 0 1');
381 1
        $objWriter->endElement();
382
383
        // v:f
384 1
        $objWriter->startElement('v:f');
385 1
        $objWriter->writeAttribute('eqn', 'prod @6 1 2');
386 1
        $objWriter->endElement();
387
388
        // v:f
389 1
        $objWriter->startElement('v:f');
390 1
        $objWriter->writeAttribute('eqn', 'prod @7 21600 pixelWidth');
391 1
        $objWriter->endElement();
392
393
        // v:f
394 1
        $objWriter->startElement('v:f');
395 1
        $objWriter->writeAttribute('eqn', 'sum @8 21600 0');
396 1
        $objWriter->endElement();
397
398
        // v:f
399 1
        $objWriter->startElement('v:f');
400 1
        $objWriter->writeAttribute('eqn', 'prod @7 21600 pixelHeight');
401 1
        $objWriter->endElement();
402
403
        // v:f
404 1
        $objWriter->startElement('v:f');
405 1
        $objWriter->writeAttribute('eqn', 'sum @10 21600 0');
406 1
        $objWriter->endElement();
407
408 1
        $objWriter->endElement();
409
410
        // v:path
411 1
        $objWriter->startElement('v:path');
412 1
        $objWriter->writeAttribute('o:extrusionok', 'f');
413 1
        $objWriter->writeAttribute('gradientshapeok', 't');
414 1
        $objWriter->writeAttribute('o:connecttype', 'rect');
415 1
        $objWriter->endElement();
416
417
        // o:lock
418 1
        $objWriter->startElement('o:lock');
419 1
        $objWriter->writeAttribute('v:ext', 'edit');
420 1
        $objWriter->writeAttribute('aspectratio', 't');
421 1
        $objWriter->endElement();
422
423 1
        $objWriter->endElement();
424
425
        // Loop through images
426 1
        foreach ($images as $key => $value) {
427 1
            $this->writeVMLHeaderFooterImage($objWriter, $key, $value);
428
        }
429
430 1
        $objWriter->endElement();
431
432
        // Return
433 1
        return $objWriter->getData();
434
    }
435
436
    /**
437
     * Write VML comment to XML format.
438
     *
439
     * @param XMLWriter $objWriter XML Writer
440
     * @param string $pReference Reference
441
     * @param HeaderFooterDrawing $pImage Image
442
     */
443 1
    private function writeVMLHeaderFooterImage(XMLWriter $objWriter, $pReference, HeaderFooterDrawing $pImage)
444
    {
445
        // Calculate object id
446 1
        preg_match('{(\d+)}', md5($pReference), $m);
447 1
        $id = 1500 + (substr($m[1], 0, 2) * 1);
448
449
        // Calculate offset
450 1
        $width = $pImage->getWidth();
451 1
        $height = $pImage->getHeight();
452 1
        $marginLeft = $pImage->getOffsetX();
453 1
        $marginTop = $pImage->getOffsetY();
454
455
        // v:shape
456 1
        $objWriter->startElement('v:shape');
457 1
        $objWriter->writeAttribute('id', $pReference);
458 1
        $objWriter->writeAttribute('o:spid', '_x0000_s' . $id);
459 1
        $objWriter->writeAttribute('type', '#_x0000_t75');
460 1
        $objWriter->writeAttribute('style', "position:absolute;margin-left:{$marginLeft}px;margin-top:{$marginTop}px;width:{$width}px;height:{$height}px;z-index:1");
461
462
        // v:imagedata
463 1
        $objWriter->startElement('v:imagedata');
464 1
        $objWriter->writeAttribute('o:relid', 'rId' . $pReference);
465 1
        $objWriter->writeAttribute('o:title', $pImage->getName());
466 1
        $objWriter->endElement();
467
468
        // o:lock
469 1
        $objWriter->startElement('o:lock');
470 1
        $objWriter->writeAttribute('v:ext', 'edit');
471 1
        $objWriter->writeAttribute('textRotation', 't');
472 1
        $objWriter->endElement();
473
474 1
        $objWriter->endElement();
475 1
    }
476
477
    /**
478
     * Get an array of all drawings.
479
     *
480
     * @param Spreadsheet $spreadsheet
481
     *
482
     * @return \PhpOffice\PhpSpreadsheet\Worksheet\Drawing[] All drawings in PhpSpreadsheet
483
     */
484 81
    public function allDrawings(Spreadsheet $spreadsheet)
485
    {
486
        // Get an array of all drawings
487 81
        $aDrawings = [];
488
489
        // Loop through PhpSpreadsheet
490 81
        $sheetCount = $spreadsheet->getSheetCount();
491 81
        for ($i = 0; $i < $sheetCount; ++$i) {
492
            // Loop through images and add to array
493 81
            $iterator = $spreadsheet->getSheet($i)->getDrawingCollection()->getIterator();
494 81
            while ($iterator->valid()) {
495 12
                $aDrawings[] = $iterator->current();
496
497 12
                $iterator->next();
498
            }
499
        }
500
501 81
        return $aDrawings;
502
    }
503
504
    /**
505
     * @param XMLWriter $objWriter
506
     * @param null|int $hlinkClickId
507
     */
508 12
    private function writeHyperLinkDrawing(XMLWriter $objWriter, $hlinkClickId)
509
    {
510 12
        if ($hlinkClickId === null) {
511 10
            return;
512
        }
513
514 2
        $objWriter->startElement('a:hlinkClick');
515 2
        $objWriter->writeAttribute('xmlns:r', 'http://schemas.openxmlformats.org/officeDocument/2006/relationships');
516 2
        $objWriter->writeAttribute('r:id', 'rId' . $hlinkClickId);
517 2
        $objWriter->endElement();
518 2
    }
519
}
520