1: <?php
2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26:
27:
28:
29: 30: 31: 32: 33: 34: 35:
36: class PHPExcel_Writer_Excel2007_Drawing extends PHPExcel_Writer_Excel2007_WriterPart
37: {
38: 39: 40: 41: 42: 43: 44: 45: 46:
47: public function writeDrawings(PHPExcel_Worksheet $pWorksheet = null, &$chartRef, $includeCharts = FALSE)
48: {
49:
50: $objWriter = null;
51: if ($this->getParentWriter()->getUseDiskCaching()) {
52: $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory());
53: } else {
54: $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_MEMORY);
55: }
56:
57:
58: $objWriter->startDocument('1.0','UTF-8','yes');
59:
60:
61: $objWriter->startElement('xdr:wsDr');
62: $objWriter->writeAttribute('xmlns:xdr', 'http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing');
63: $objWriter->writeAttribute('xmlns:a', 'http://schemas.openxmlformats.org/drawingml/2006/main');
64:
65:
66: $i = 1;
67: $iterator = $pWorksheet->getDrawingCollection()->getIterator();
68: while ($iterator->valid()) {
69: $this->_writeDrawing($objWriter, $iterator->current(), $i);
70:
71: $iterator->next();
72: ++$i;
73: }
74:
75: if ($includeCharts) {
76: $chartCount = $pWorksheet->getChartCount();
77:
78: if ($chartCount > 0) {
79: for ($c = 0; $c < $chartCount; ++$c) {
80: $this->_writeChart($objWriter, $pWorksheet->getChartByIndex($c), $c+$i);
81: }
82: }
83: }
84:
85:
86: $objWriter->endElement();
87:
88:
89: return $objWriter->getData();
90: }
91:
92: 93: 94: 95: 96: 97: 98: 99:
100: public function _writeChart(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Chart $pChart = null, $pRelationId = -1)
101: {
102: $tl = $pChart->getTopLeftPosition();
103: $tl['colRow'] = PHPExcel_Cell::coordinateFromString($tl['cell']);
104: $br = $pChart->getBottomRightPosition();
105: $br['colRow'] = PHPExcel_Cell::coordinateFromString($br['cell']);
106:
107: $objWriter->startElement('xdr:twoCellAnchor');
108:
109: $objWriter->startElement('xdr:from');
110: $objWriter->writeElement('xdr:col', PHPExcel_Cell::columnIndexFromString($tl['colRow'][0]) - 1);
111: $objWriter->writeElement('xdr:colOff', PHPExcel_Shared_Drawing::pixelsToEMU($tl['xOffset']));
112: $objWriter->writeElement('xdr:row', $tl['colRow'][1] - 1);
113: $objWriter->writeElement('xdr:rowOff', PHPExcel_Shared_Drawing::pixelsToEMU($tl['yOffset']));
114: $objWriter->endElement();
115: $objWriter->startElement('xdr:to');
116: $objWriter->writeElement('xdr:col', PHPExcel_Cell::columnIndexFromString($br['colRow'][0]) - 1);
117: $objWriter->writeElement('xdr:colOff', PHPExcel_Shared_Drawing::pixelsToEMU($br['xOffset']));
118: $objWriter->writeElement('xdr:row', $br['colRow'][1] - 1);
119: $objWriter->writeElement('xdr:rowOff', PHPExcel_Shared_Drawing::pixelsToEMU($br['yOffset']));
120: $objWriter->endElement();
121:
122: $objWriter->startElement('xdr:graphicFrame');
123: $objWriter->writeAttribute('macro', '');
124: $objWriter->startElement('xdr:nvGraphicFramePr');
125: $objWriter->startElement('xdr:cNvPr');
126: $objWriter->writeAttribute('name', 'Chart '.$pRelationId);
127: $objWriter->writeAttribute('id', 1025 * $pRelationId);
128: $objWriter->endElement();
129: $objWriter->startElement('xdr:cNvGraphicFramePr');
130: $objWriter->startElement('a:graphicFrameLocks');
131: $objWriter->endElement();
132: $objWriter->endElement();
133: $objWriter->endElement();
134:
135: $objWriter->startElement('xdr:xfrm');
136: $objWriter->startElement('a:off');
137: $objWriter->writeAttribute('x', '0');
138: $objWriter->writeAttribute('y', '0');
139: $objWriter->endElement();
140: $objWriter->startElement('a:ext');
141: $objWriter->writeAttribute('cx', '0');
142: $objWriter->writeAttribute('cy', '0');
143: $objWriter->endElement();
144: $objWriter->endElement();
145:
146: $objWriter->startElement('a:graphic');
147: $objWriter->startElement('a:graphicData');
148: $objWriter->writeAttribute('uri', 'http://schemas.openxmlformats.org/drawingml/2006/chart');
149: $objWriter->startElement('c:chart');
150: $objWriter->writeAttribute('xmlns:c', 'http://schemas.openxmlformats.org/drawingml/2006/chart');
151: $objWriter->writeAttribute('xmlns:r', 'http://schemas.openxmlformats.org/officeDocument/2006/relationships');
152: $objWriter->writeAttribute('r:id', 'rId'.$pRelationId);
153: $objWriter->endElement();
154: $objWriter->endElement();
155: $objWriter->endElement();
156: $objWriter->endElement();
157:
158: $objWriter->startElement('xdr:clientData');
159: $objWriter->endElement();
160:
161: $objWriter->endElement();
162: }
163:
164: 165: 166: 167: 168: 169: 170: 171:
172: public function _writeDrawing(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet_BaseDrawing $pDrawing = null, $pRelationId = -1)
173: {
174: if ($pRelationId >= 0) {
175:
176: $objWriter->startElement('xdr:oneCellAnchor');
177:
178: $aCoordinates = PHPExcel_Cell::coordinateFromString($pDrawing->getCoordinates());
179: $aCoordinates[0] = PHPExcel_Cell::columnIndexFromString($aCoordinates[0]);
180:
181:
182: $objWriter->startElement('xdr:from');
183: $objWriter->writeElement('xdr:col', $aCoordinates[0] - 1);
184: $objWriter->writeElement('xdr:colOff', PHPExcel_Shared_Drawing::pixelsToEMU($pDrawing->getOffsetX()));
185: $objWriter->writeElement('xdr:row', $aCoordinates[1] - 1);
186: $objWriter->writeElement('xdr:rowOff', PHPExcel_Shared_Drawing::pixelsToEMU($pDrawing->getOffsetY()));
187: $objWriter->endElement();
188:
189:
190: $objWriter->startElement('xdr:ext');
191: $objWriter->writeAttribute('cx', PHPExcel_Shared_Drawing::pixelsToEMU($pDrawing->getWidth()));
192: $objWriter->writeAttribute('cy', PHPExcel_Shared_Drawing::pixelsToEMU($pDrawing->getHeight()));
193: $objWriter->endElement();
194:
195:
196: $objWriter->startElement('xdr:pic');
197:
198:
199: $objWriter->startElement('xdr:nvPicPr');
200:
201:
202: $objWriter->startElement('xdr:cNvPr');
203: $objWriter->writeAttribute('id', $pRelationId);
204: $objWriter->writeAttribute('name', $pDrawing->getName());
205: $objWriter->writeAttribute('descr', $pDrawing->getDescription());
206: $objWriter->endElement();
207:
208:
209: $objWriter->startElement('xdr:cNvPicPr');
210:
211:
212: $objWriter->startElement('a:picLocks');
213: $objWriter->writeAttribute('noChangeAspect', '1');
214: $objWriter->endElement();
215:
216: $objWriter->endElement();
217:
218: $objWriter->endElement();
219:
220:
221: $objWriter->startElement('xdr:blipFill');
222:
223:
224: $objWriter->startElement('a:blip');
225: $objWriter->writeAttribute('xmlns:r', 'http://schemas.openxmlformats.org/officeDocument/2006/relationships');
226: $objWriter->writeAttribute('r:embed', 'rId' . $pRelationId);
227: $objWriter->endElement();
228:
229:
230: $objWriter->startElement('a:stretch');
231: $objWriter->writeElement('a:fillRect', null);
232: $objWriter->endElement();
233:
234: $objWriter->endElement();
235:
236:
237: $objWriter->startElement('xdr:spPr');
238:
239:
240: $objWriter->startElement('a:xfrm');
241: $objWriter->writeAttribute('rot', PHPExcel_Shared_Drawing::degreesToAngle($pDrawing->getRotation()));
242: $objWriter->endElement();
243:
244:
245: $objWriter->startElement('a:prstGeom');
246: $objWriter->writeAttribute('prst', 'rect');
247:
248:
249: $objWriter->writeElement('a:avLst', null);
250:
251: $objWriter->endElement();
252:
253:
254:
255:
256:
257:
258:
259:
260:
261:
262:
263:
264:
265:
266:
267:
268:
269:
270: 271: 272: 273: 274: 275: 276: 277: 278: 279: 280: 281: 282: 283: 284: 285: 286: 287: 288: 289: 290: 291: 292:
293:
294: if ($pDrawing->getShadow()->getVisible()) {
295:
296: $objWriter->startElement('a:effectLst');
297:
298:
299: $objWriter->startElement('a:outerShdw');
300: $objWriter->writeAttribute('blurRad', PHPExcel_Shared_Drawing::pixelsToEMU($pDrawing->getShadow()->getBlurRadius()));
301: $objWriter->writeAttribute('dist', PHPExcel_Shared_Drawing::pixelsToEMU($pDrawing->getShadow()->getDistance()));
302: $objWriter->writeAttribute('dir', PHPExcel_Shared_Drawing::degreesToAngle($pDrawing->getShadow()->getDirection()));
303: $objWriter->writeAttribute('algn', $pDrawing->getShadow()->getAlignment());
304: $objWriter->writeAttribute('rotWithShape', '0');
305:
306:
307: $objWriter->startElement('a:srgbClr');
308: $objWriter->writeAttribute('val', $pDrawing->getShadow()->getColor()->getRGB());
309:
310:
311: $objWriter->startElement('a:alpha');
312: $objWriter->writeAttribute('val', $pDrawing->getShadow()->getAlpha() * 1000);
313: $objWriter->endElement();
314:
315: $objWriter->endElement();
316:
317: $objWriter->endElement();
318:
319: $objWriter->endElement();
320: }
321: 322: 323: 324: 325: 326: 327: 328: 329: 330: 331: 332: 333: 334: 335: 336: 337: 338: 339: 340: 341: 342: 343: 344: 345: 346:
347: 348: 349: 350: 351: 352: 353: 354: 355: 356: 357: 358: 359: 360: 361: 362: 363: 364: 365: 366: 367: 368:
369: $objWriter->endElement();
370:
371: $objWriter->endElement();
372:
373:
374: $objWriter->writeElement('xdr:clientData', null);
375:
376: $objWriter->endElement();
377: } else {
378: throw new PHPExcel_Writer_Exception("Invalid parameters passed.");
379: }
380: }
381:
382: 383: 384: 385: 386: 387: 388:
389: public function writeVMLHeaderFooterImages(PHPExcel_Worksheet $pWorksheet = null)
390: {
391:
392: $objWriter = null;
393: if ($this->getParentWriter()->getUseDiskCaching()) {
394: $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory());
395: } else {
396: $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_MEMORY);
397: }
398:
399:
400: $objWriter->startDocument('1.0','UTF-8','yes');
401:
402:
403: $images = $pWorksheet->getHeaderFooter()->getImages();
404:
405:
406: $objWriter->startElement('xml');
407: $objWriter->writeAttribute('xmlns:v', 'urn:schemas-microsoft-com:vml');
408: $objWriter->writeAttribute('xmlns:o', 'urn:schemas-microsoft-com:office:office');
409: $objWriter->writeAttribute('xmlns:x', 'urn:schemas-microsoft-com:office:excel');
410:
411:
412: $objWriter->startElement('o:shapelayout');
413: $objWriter->writeAttribute('v:ext', 'edit');
414:
415:
416: $objWriter->startElement('o:idmap');
417: $objWriter->writeAttribute('v:ext', 'edit');
418: $objWriter->writeAttribute('data', '1');
419: $objWriter->endElement();
420:
421: $objWriter->endElement();
422:
423:
424: $objWriter->startElement('v:shapetype');
425: $objWriter->writeAttribute('id', '_x0000_t75');
426: $objWriter->writeAttribute('coordsize', '21600,21600');
427: $objWriter->writeAttribute('o:spt', '75');
428: $objWriter->writeAttribute('o:preferrelative', 't');
429: $objWriter->writeAttribute('path', 'm@4@5l@4@11@9@11@9@5xe');
430: $objWriter->writeAttribute('filled', 'f');
431: $objWriter->writeAttribute('stroked', 'f');
432:
433:
434: $objWriter->startElement('v:stroke');
435: $objWriter->writeAttribute('joinstyle', 'miter');
436: $objWriter->endElement();
437:
438:
439: $objWriter->startElement('v:formulas');
440:
441:
442: $objWriter->startElement('v:f');
443: $objWriter->writeAttribute('eqn', 'if lineDrawn pixelLineWidth 0');
444: $objWriter->endElement();
445:
446:
447: $objWriter->startElement('v:f');
448: $objWriter->writeAttribute('eqn', 'sum @0 1 0');
449: $objWriter->endElement();
450:
451:
452: $objWriter->startElement('v:f');
453: $objWriter->writeAttribute('eqn', 'sum 0 0 @1');
454: $objWriter->endElement();
455:
456:
457: $objWriter->startElement('v:f');
458: $objWriter->writeAttribute('eqn', 'prod @2 1 2');
459: $objWriter->endElement();
460:
461:
462: $objWriter->startElement('v:f');
463: $objWriter->writeAttribute('eqn', 'prod @3 21600 pixelWidth');
464: $objWriter->endElement();
465:
466:
467: $objWriter->startElement('v:f');
468: $objWriter->writeAttribute('eqn', 'prod @3 21600 pixelHeight');
469: $objWriter->endElement();
470:
471:
472: $objWriter->startElement('v:f');
473: $objWriter->writeAttribute('eqn', 'sum @0 0 1');
474: $objWriter->endElement();
475:
476:
477: $objWriter->startElement('v:f');
478: $objWriter->writeAttribute('eqn', 'prod @6 1 2');
479: $objWriter->endElement();
480:
481:
482: $objWriter->startElement('v:f');
483: $objWriter->writeAttribute('eqn', 'prod @7 21600 pixelWidth');
484: $objWriter->endElement();
485:
486:
487: $objWriter->startElement('v:f');
488: $objWriter->writeAttribute('eqn', 'sum @8 21600 0');
489: $objWriter->endElement();
490:
491:
492: $objWriter->startElement('v:f');
493: $objWriter->writeAttribute('eqn', 'prod @7 21600 pixelHeight');
494: $objWriter->endElement();
495:
496:
497: $objWriter->startElement('v:f');
498: $objWriter->writeAttribute('eqn', 'sum @10 21600 0');
499: $objWriter->endElement();
500:
501: $objWriter->endElement();
502:
503:
504: $objWriter->startElement('v:path');
505: $objWriter->writeAttribute('o:extrusionok', 'f');
506: $objWriter->writeAttribute('gradientshapeok', 't');
507: $objWriter->writeAttribute('o:connecttype', 'rect');
508: $objWriter->endElement();
509:
510:
511: $objWriter->startElement('o:lock');
512: $objWriter->writeAttribute('v:ext', 'edit');
513: $objWriter->writeAttribute('aspectratio', 't');
514: $objWriter->endElement();
515:
516: $objWriter->endElement();
517:
518:
519: foreach ($images as $key => $value) {
520: $this->_writeVMLHeaderFooterImage($objWriter, $key, $value);
521: }
522:
523: $objWriter->endElement();
524:
525:
526: return $objWriter->getData();
527: }
528:
529: 530: 531: 532: 533: 534: 535: 536:
537: public function _writeVMLHeaderFooterImage(PHPExcel_Shared_XMLWriter $objWriter = null, $pReference = '', PHPExcel_Worksheet_HeaderFooterDrawing $pImage = null)
538: {
539:
540: preg_match('{(\d+)}', md5($pReference), $m);
541: $id = 1500 + (substr($m[1], 0, 2) * 1);
542:
543:
544: $width = $pImage->getWidth();
545: $height = $pImage->getHeight();
546: $marginLeft = $pImage->getOffsetX();
547: $marginTop = $pImage->getOffsetY();
548:
549:
550: $objWriter->startElement('v:shape');
551: $objWriter->writeAttribute('id', $pReference);
552: $objWriter->writeAttribute('o:spid', '_x0000_s' . $id);
553: $objWriter->writeAttribute('type', '#_x0000_t75');
554: $objWriter->writeAttribute('style', "position:absolute;margin-left:{$marginLeft}px;margin-top:{$marginTop}px;width:{$width}px;height:{$height}px;z-index:1");
555:
556:
557: $objWriter->startElement('v:imagedata');
558: $objWriter->writeAttribute('o:relid', 'rId' . $pReference);
559: $objWriter->writeAttribute('o:title', $pImage->getName());
560: $objWriter->endElement();
561:
562:
563: $objWriter->startElement('o:lock');
564: $objWriter->writeAttribute('v:ext', 'edit');
565: $objWriter->writeAttribute('rotation', 't');
566: $objWriter->endElement();
567:
568: $objWriter->endElement();
569: }
570:
571:
572: 573: 574: 575: 576: 577: 578:
579: public function allDrawings(PHPExcel $pPHPExcel = null)
580: {
581:
582: $aDrawings = array();
583:
584:
585: $sheetCount = $pPHPExcel->getSheetCount();
586: for ($i = 0; $i < $sheetCount; ++$i) {
587:
588: $iterator = $pPHPExcel->getSheet($i)->getDrawingCollection()->getIterator();
589: while ($iterator->valid()) {
590: $aDrawings[] = $iterator->current();
591:
592: $iterator->next();
593: }
594: }
595:
596: return $aDrawings;
597: }
598: }
599: