3 namespace PhpOffice\PhpSpreadsheet\Writer\Xlsx
;
5 use PhpOffice\PhpSpreadsheet\Shared\XMLWriter
;
6 use PhpOffice\PhpSpreadsheet\Spreadsheet
;
9 * @category PhpSpreadsheet
11 * @copyright Copyright (c) 2006 - 2016 PhpSpreadsheet (https://github.com/PHPOffice/PhpSpreadsheet)
13 class Theme
extends WriterPart
16 * Map of Major fonts to write.
18 * @var array of string
20 private static $majorFonts = [
25 'Arab' => 'Times New Roman',
26 'Hebr' => 'Times New Roman',
31 'Khmr' => 'MoolBoran',
35 'Cher' => 'Plantagenet Cherokee',
36 'Yiii' => 'Microsoft Yi Baiti',
37 'Tibt' => 'Microsoft Himalaya',
42 'Syrc' => 'Estrangelo Edessa',
45 'Laoo' => 'DokChampa',
46 'Sinh' => 'Iskoola Pota',
47 'Mong' => 'Mongolian Baiti',
48 'Viet' => 'Times New Roman',
49 'Uigh' => 'Microsoft Uighur',
54 * Map of Minor fonts to write.
56 * @var array of string
58 private static $minorFonts = [
73 'Cher' => 'Plantagenet Cherokee',
74 'Yiii' => 'Microsoft Yi Baiti',
75 'Tibt' => 'Microsoft Himalaya',
80 'Syrc' => 'Estrangelo Edessa',
83 'Laoo' => 'DokChampa',
84 'Sinh' => 'Iskoola Pota',
85 'Mong' => 'Mongolian Baiti',
87 'Uigh' => 'Microsoft Uighur',
92 * Map of core colours.
94 * @var array of string
96 private static $colourScheme = [
99 'accent1' => '4F81BD',
100 'accent2' => 'C0504D',
101 'accent3' => '9BBB59',
102 'accent4' => '8064A2',
103 'accent5' => '4BACC6',
104 'accent6' => 'F79646',
106 'folHlink' => '800080',
110 * Write theme to XML format.
112 * @param Spreadsheet $spreadsheet
114 * @throws \PhpOffice\PhpSpreadsheet\Writer\Exception
116 * @return string XML Output
118 public function writeTheme(Spreadsheet
$spreadsheet)
122 if ($this->getParentWriter()->getUseDiskCaching()) {
123 $objWriter = new XMLWriter(XMLWriter
::STORAGE_DISK
, $this->getParentWriter()->getDiskCachingDirectory());
125 $objWriter = new XMLWriter(XMLWriter
::STORAGE_MEMORY
);
129 $objWriter->startDocument('1.0', 'UTF-8', 'yes');
132 $objWriter->startElement('a:theme');
133 $objWriter->writeAttribute('xmlns:a', 'http://schemas.openxmlformats.org/drawingml/2006/main');
134 $objWriter->writeAttribute('name', 'Office Theme');
137 $objWriter->startElement('a:themeElements');
140 $objWriter->startElement('a:clrScheme');
141 $objWriter->writeAttribute('name', 'Office');
144 $objWriter->startElement('a:dk1');
147 $objWriter->startElement('a:sysClr');
148 $objWriter->writeAttribute('val', 'windowText');
149 $objWriter->writeAttribute('lastClr', '000000');
150 $objWriter->endElement();
152 $objWriter->endElement();
155 $objWriter->startElement('a:lt1');
158 $objWriter->startElement('a:sysClr');
159 $objWriter->writeAttribute('val', 'window');
160 $objWriter->writeAttribute('lastClr', 'FFFFFF');
161 $objWriter->endElement();
163 $objWriter->endElement();
166 $this->writeColourScheme($objWriter);
168 $objWriter->endElement();
171 $objWriter->startElement('a:fontScheme');
172 $objWriter->writeAttribute('name', 'Office');
175 $objWriter->startElement('a:majorFont');
176 $this->writeFonts($objWriter, 'Cambria', self
::$majorFonts);
177 $objWriter->endElement();
180 $objWriter->startElement('a:minorFont');
181 $this->writeFonts($objWriter, 'Calibri', self
::$minorFonts);
182 $objWriter->endElement();
184 $objWriter->endElement();
187 $objWriter->startElement('a:fmtScheme');
188 $objWriter->writeAttribute('name', 'Office');
191 $objWriter->startElement('a:fillStyleLst');
194 $objWriter->startElement('a:solidFill');
197 $objWriter->startElement('a:schemeClr');
198 $objWriter->writeAttribute('val', 'phClr');
199 $objWriter->endElement();
201 $objWriter->endElement();
204 $objWriter->startElement('a:gradFill');
205 $objWriter->writeAttribute('rotWithShape', '1');
208 $objWriter->startElement('a:gsLst');
211 $objWriter->startElement('a:gs');
212 $objWriter->writeAttribute('pos', '0');
215 $objWriter->startElement('a:schemeClr');
216 $objWriter->writeAttribute('val', 'phClr');
219 $objWriter->startElement('a:tint');
220 $objWriter->writeAttribute('val', '50000');
221 $objWriter->endElement();
224 $objWriter->startElement('a:satMod');
225 $objWriter->writeAttribute('val', '300000');
226 $objWriter->endElement();
228 $objWriter->endElement();
230 $objWriter->endElement();
233 $objWriter->startElement('a:gs');
234 $objWriter->writeAttribute('pos', '35000');
237 $objWriter->startElement('a:schemeClr');
238 $objWriter->writeAttribute('val', 'phClr');
241 $objWriter->startElement('a:tint');
242 $objWriter->writeAttribute('val', '37000');
243 $objWriter->endElement();
246 $objWriter->startElement('a:satMod');
247 $objWriter->writeAttribute('val', '300000');
248 $objWriter->endElement();
250 $objWriter->endElement();
252 $objWriter->endElement();
255 $objWriter->startElement('a:gs');
256 $objWriter->writeAttribute('pos', '100000');
259 $objWriter->startElement('a:schemeClr');
260 $objWriter->writeAttribute('val', 'phClr');
263 $objWriter->startElement('a:tint');
264 $objWriter->writeAttribute('val', '15000');
265 $objWriter->endElement();
268 $objWriter->startElement('a:satMod');
269 $objWriter->writeAttribute('val', '350000');
270 $objWriter->endElement();
272 $objWriter->endElement();
274 $objWriter->endElement();
276 $objWriter->endElement();
279 $objWriter->startElement('a:lin');
280 $objWriter->writeAttribute('ang', '16200000');
281 $objWriter->writeAttribute('scaled', '1');
282 $objWriter->endElement();
284 $objWriter->endElement();
287 $objWriter->startElement('a:gradFill');
288 $objWriter->writeAttribute('rotWithShape', '1');
291 $objWriter->startElement('a:gsLst');
294 $objWriter->startElement('a:gs');
295 $objWriter->writeAttribute('pos', '0');
298 $objWriter->startElement('a:schemeClr');
299 $objWriter->writeAttribute('val', 'phClr');
302 $objWriter->startElement('a:shade');
303 $objWriter->writeAttribute('val', '51000');
304 $objWriter->endElement();
307 $objWriter->startElement('a:satMod');
308 $objWriter->writeAttribute('val', '130000');
309 $objWriter->endElement();
311 $objWriter->endElement();
313 $objWriter->endElement();
316 $objWriter->startElement('a:gs');
317 $objWriter->writeAttribute('pos', '80000');
320 $objWriter->startElement('a:schemeClr');
321 $objWriter->writeAttribute('val', 'phClr');
324 $objWriter->startElement('a:shade');
325 $objWriter->writeAttribute('val', '93000');
326 $objWriter->endElement();
329 $objWriter->startElement('a:satMod');
330 $objWriter->writeAttribute('val', '130000');
331 $objWriter->endElement();
333 $objWriter->endElement();
335 $objWriter->endElement();
338 $objWriter->startElement('a:gs');
339 $objWriter->writeAttribute('pos', '100000');
342 $objWriter->startElement('a:schemeClr');
343 $objWriter->writeAttribute('val', 'phClr');
346 $objWriter->startElement('a:shade');
347 $objWriter->writeAttribute('val', '94000');
348 $objWriter->endElement();
351 $objWriter->startElement('a:satMod');
352 $objWriter->writeAttribute('val', '135000');
353 $objWriter->endElement();
355 $objWriter->endElement();
357 $objWriter->endElement();
359 $objWriter->endElement();
362 $objWriter->startElement('a:lin');
363 $objWriter->writeAttribute('ang', '16200000');
364 $objWriter->writeAttribute('scaled', '0');
365 $objWriter->endElement();
367 $objWriter->endElement();
369 $objWriter->endElement();
372 $objWriter->startElement('a:lnStyleLst');
375 $objWriter->startElement('a:ln');
376 $objWriter->writeAttribute('w', '9525');
377 $objWriter->writeAttribute('cap', 'flat');
378 $objWriter->writeAttribute('cmpd', 'sng');
379 $objWriter->writeAttribute('algn', 'ctr');
382 $objWriter->startElement('a:solidFill');
385 $objWriter->startElement('a:schemeClr');
386 $objWriter->writeAttribute('val', 'phClr');
389 $objWriter->startElement('a:shade');
390 $objWriter->writeAttribute('val', '95000');
391 $objWriter->endElement();
394 $objWriter->startElement('a:satMod');
395 $objWriter->writeAttribute('val', '105000');
396 $objWriter->endElement();
398 $objWriter->endElement();
400 $objWriter->endElement();
403 $objWriter->startElement('a:prstDash');
404 $objWriter->writeAttribute('val', 'solid');
405 $objWriter->endElement();
407 $objWriter->endElement();
410 $objWriter->startElement('a:ln');
411 $objWriter->writeAttribute('w', '25400');
412 $objWriter->writeAttribute('cap', 'flat');
413 $objWriter->writeAttribute('cmpd', 'sng');
414 $objWriter->writeAttribute('algn', 'ctr');
417 $objWriter->startElement('a:solidFill');
420 $objWriter->startElement('a:schemeClr');
421 $objWriter->writeAttribute('val', 'phClr');
422 $objWriter->endElement();
424 $objWriter->endElement();
427 $objWriter->startElement('a:prstDash');
428 $objWriter->writeAttribute('val', 'solid');
429 $objWriter->endElement();
431 $objWriter->endElement();
434 $objWriter->startElement('a:ln');
435 $objWriter->writeAttribute('w', '38100');
436 $objWriter->writeAttribute('cap', 'flat');
437 $objWriter->writeAttribute('cmpd', 'sng');
438 $objWriter->writeAttribute('algn', 'ctr');
441 $objWriter->startElement('a:solidFill');
444 $objWriter->startElement('a:schemeClr');
445 $objWriter->writeAttribute('val', 'phClr');
446 $objWriter->endElement();
448 $objWriter->endElement();
451 $objWriter->startElement('a:prstDash');
452 $objWriter->writeAttribute('val', 'solid');
453 $objWriter->endElement();
455 $objWriter->endElement();
457 $objWriter->endElement();
460 $objWriter->startElement('a:effectStyleLst');
463 $objWriter->startElement('a:effectStyle');
466 $objWriter->startElement('a:effectLst');
469 $objWriter->startElement('a:outerShdw');
470 $objWriter->writeAttribute('blurRad', '40000');
471 $objWriter->writeAttribute('dist', '20000');
472 $objWriter->writeAttribute('dir', '5400000');
473 $objWriter->writeAttribute('rotWithShape', '0');
476 $objWriter->startElement('a:srgbClr');
477 $objWriter->writeAttribute('val', '000000');
480 $objWriter->startElement('a:alpha');
481 $objWriter->writeAttribute('val', '38000');
482 $objWriter->endElement();
484 $objWriter->endElement();
486 $objWriter->endElement();
488 $objWriter->endElement();
490 $objWriter->endElement();
493 $objWriter->startElement('a:effectStyle');
496 $objWriter->startElement('a:effectLst');
499 $objWriter->startElement('a:outerShdw');
500 $objWriter->writeAttribute('blurRad', '40000');
501 $objWriter->writeAttribute('dist', '23000');
502 $objWriter->writeAttribute('dir', '5400000');
503 $objWriter->writeAttribute('rotWithShape', '0');
506 $objWriter->startElement('a:srgbClr');
507 $objWriter->writeAttribute('val', '000000');
510 $objWriter->startElement('a:alpha');
511 $objWriter->writeAttribute('val', '35000');
512 $objWriter->endElement();
514 $objWriter->endElement();
516 $objWriter->endElement();
518 $objWriter->endElement();
520 $objWriter->endElement();
523 $objWriter->startElement('a:effectStyle');
526 $objWriter->startElement('a:effectLst');
529 $objWriter->startElement('a:outerShdw');
530 $objWriter->writeAttribute('blurRad', '40000');
531 $objWriter->writeAttribute('dist', '23000');
532 $objWriter->writeAttribute('dir', '5400000');
533 $objWriter->writeAttribute('rotWithShape', '0');
536 $objWriter->startElement('a:srgbClr');
537 $objWriter->writeAttribute('val', '000000');
540 $objWriter->startElement('a:alpha');
541 $objWriter->writeAttribute('val', '35000');
542 $objWriter->endElement();
544 $objWriter->endElement();
546 $objWriter->endElement();
548 $objWriter->endElement();
551 $objWriter->startElement('a:scene3d');
554 $objWriter->startElement('a:camera');
555 $objWriter->writeAttribute('prst', 'orthographicFront');
558 $objWriter->startElement('a:rot');
559 $objWriter->writeAttribute('lat', '0');
560 $objWriter->writeAttribute('lon', '0');
561 $objWriter->writeAttribute('rev', '0');
562 $objWriter->endElement();
564 $objWriter->endElement();
567 $objWriter->startElement('a:lightRig');
568 $objWriter->writeAttribute('rig', 'threePt');
569 $objWriter->writeAttribute('dir', 't');
572 $objWriter->startElement('a:rot');
573 $objWriter->writeAttribute('lat', '0');
574 $objWriter->writeAttribute('lon', '0');
575 $objWriter->writeAttribute('rev', '1200000');
576 $objWriter->endElement();
578 $objWriter->endElement();
580 $objWriter->endElement();
583 $objWriter->startElement('a:sp3d');
586 $objWriter->startElement('a:bevelT');
587 $objWriter->writeAttribute('w', '63500');
588 $objWriter->writeAttribute('h', '25400');
589 $objWriter->endElement();
591 $objWriter->endElement();
593 $objWriter->endElement();
595 $objWriter->endElement();
598 $objWriter->startElement('a:bgFillStyleLst');
601 $objWriter->startElement('a:solidFill');
604 $objWriter->startElement('a:schemeClr');
605 $objWriter->writeAttribute('val', 'phClr');
606 $objWriter->endElement();
608 $objWriter->endElement();
611 $objWriter->startElement('a:gradFill');
612 $objWriter->writeAttribute('rotWithShape', '1');
615 $objWriter->startElement('a:gsLst');
618 $objWriter->startElement('a:gs');
619 $objWriter->writeAttribute('pos', '0');
622 $objWriter->startElement('a:schemeClr');
623 $objWriter->writeAttribute('val', 'phClr');
626 $objWriter->startElement('a:tint');
627 $objWriter->writeAttribute('val', '40000');
628 $objWriter->endElement();
631 $objWriter->startElement('a:satMod');
632 $objWriter->writeAttribute('val', '350000');
633 $objWriter->endElement();
635 $objWriter->endElement();
637 $objWriter->endElement();
640 $objWriter->startElement('a:gs');
641 $objWriter->writeAttribute('pos', '40000');
644 $objWriter->startElement('a:schemeClr');
645 $objWriter->writeAttribute('val', 'phClr');
648 $objWriter->startElement('a:tint');
649 $objWriter->writeAttribute('val', '45000');
650 $objWriter->endElement();
653 $objWriter->startElement('a:shade');
654 $objWriter->writeAttribute('val', '99000');
655 $objWriter->endElement();
658 $objWriter->startElement('a:satMod');
659 $objWriter->writeAttribute('val', '350000');
660 $objWriter->endElement();
662 $objWriter->endElement();
664 $objWriter->endElement();
667 $objWriter->startElement('a:gs');
668 $objWriter->writeAttribute('pos', '100000');
671 $objWriter->startElement('a:schemeClr');
672 $objWriter->writeAttribute('val', 'phClr');
675 $objWriter->startElement('a:shade');
676 $objWriter->writeAttribute('val', '20000');
677 $objWriter->endElement();
680 $objWriter->startElement('a:satMod');
681 $objWriter->writeAttribute('val', '255000');
682 $objWriter->endElement();
684 $objWriter->endElement();
686 $objWriter->endElement();
688 $objWriter->endElement();
691 $objWriter->startElement('a:path');
692 $objWriter->writeAttribute('path', 'circle');
695 $objWriter->startElement('a:fillToRect');
696 $objWriter->writeAttribute('l', '50000');
697 $objWriter->writeAttribute('t', '-80000');
698 $objWriter->writeAttribute('r', '50000');
699 $objWriter->writeAttribute('b', '180000');
700 $objWriter->endElement();
702 $objWriter->endElement();
704 $objWriter->endElement();
707 $objWriter->startElement('a:gradFill');
708 $objWriter->writeAttribute('rotWithShape', '1');
711 $objWriter->startElement('a:gsLst');
714 $objWriter->startElement('a:gs');
715 $objWriter->writeAttribute('pos', '0');
718 $objWriter->startElement('a:schemeClr');
719 $objWriter->writeAttribute('val', 'phClr');
722 $objWriter->startElement('a:tint');
723 $objWriter->writeAttribute('val', '80000');
724 $objWriter->endElement();
727 $objWriter->startElement('a:satMod');
728 $objWriter->writeAttribute('val', '300000');
729 $objWriter->endElement();
731 $objWriter->endElement();
733 $objWriter->endElement();
736 $objWriter->startElement('a:gs');
737 $objWriter->writeAttribute('pos', '100000');
740 $objWriter->startElement('a:schemeClr');
741 $objWriter->writeAttribute('val', 'phClr');
744 $objWriter->startElement('a:shade');
745 $objWriter->writeAttribute('val', '30000');
746 $objWriter->endElement();
749 $objWriter->startElement('a:satMod');
750 $objWriter->writeAttribute('val', '200000');
751 $objWriter->endElement();
753 $objWriter->endElement();
755 $objWriter->endElement();
757 $objWriter->endElement();
760 $objWriter->startElement('a:path');
761 $objWriter->writeAttribute('path', 'circle');
764 $objWriter->startElement('a:fillToRect');
765 $objWriter->writeAttribute('l', '50000');
766 $objWriter->writeAttribute('t', '50000');
767 $objWriter->writeAttribute('r', '50000');
768 $objWriter->writeAttribute('b', '50000');
769 $objWriter->endElement();
771 $objWriter->endElement();
773 $objWriter->endElement();
775 $objWriter->endElement();
777 $objWriter->endElement();
779 $objWriter->endElement();
782 $objWriter->writeElement('a:objectDefaults', null);
784 // a:extraClrSchemeLst
785 $objWriter->writeElement('a:extraClrSchemeLst', null);
787 $objWriter->endElement();
790 return $objWriter->getData();
794 * Write fonts to XML format.
796 * @param XMLWriter $objWriter
797 * @param string $latinFont
798 * @param array of string $fontSet
800 * @return string XML Output
802 private function writeFonts($objWriter, $latinFont, $fontSet)
805 $objWriter->startElement('a:latin');
806 $objWriter->writeAttribute('typeface', $latinFont);
807 $objWriter->endElement();
810 $objWriter->startElement('a:ea');
811 $objWriter->writeAttribute('typeface', '');
812 $objWriter->endElement();
815 $objWriter->startElement('a:cs');
816 $objWriter->writeAttribute('typeface', '');
817 $objWriter->endElement();
819 foreach ($fontSet as $fontScript => $typeface) {
820 $objWriter->startElement('a:font');
821 $objWriter->writeAttribute('script', $fontScript);
822 $objWriter->writeAttribute('typeface', $typeface);
823 $objWriter->endElement();
828 * Write colour scheme to XML format.
830 * @param XMLWriter $objWriter
832 * @return string XML Output
834 private function writeColourScheme($objWriter)
836 foreach (self
::$colourScheme as $colourName => $colourValue) {
837 $objWriter->startElement('a:' . $colourName);
839 $objWriter->startElement('a:srgbClr');
840 $objWriter->writeAttribute('val', $colourValue);
841 $objWriter->endElement();
843 $objWriter->endElement();