Search moodle.org's
Developer Documentation

See Release Notes

  • Bug fixes for general core bugs in 3.10.x will end 8 November 2021 (12 months).
  • Bug fixes for security issues in 3.10.x will end 9 May 2022 (18 months).
  • PHP version: minimum PHP 7.2.0 Note: minimum PHP version has increased since Moodle 3.8. PHP 7.3.x and 7.4.x are supported too.

Differences Between: [Versions 310 and 311] [Versions 310 and 400] [Versions 310 and 401] [Versions 310 and 402] [Versions 310 and 403]

   1  <?php
   2  
   3  namespace PhpOffice\PhpSpreadsheet\Reader\Xlsx;
   4  
   5  use PhpOffice\PhpSpreadsheet\Cell\Coordinate;
   6  use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet;
   7  
   8  class PageSetup extends BaseParserClass
   9  {
  10      private $worksheet;
  11  
  12      private $worksheetXml;
  13  
  14      public function __construct(Worksheet $workSheet, \SimpleXMLElement $worksheetXml = null)
  15      {
  16          $this->worksheet = $workSheet;
  17          $this->worksheetXml = $worksheetXml;
  18      }
  19  
  20      public function load(array $unparsedLoadedData)
  21      {
  22          if (!$this->worksheetXml) {
  23              return $unparsedLoadedData;
  24          }
  25  
  26          $this->margins($this->worksheetXml, $this->worksheet);
  27          $unparsedLoadedData = $this->pageSetup($this->worksheetXml, $this->worksheet, $unparsedLoadedData);
  28          $this->headerFooter($this->worksheetXml, $this->worksheet);
  29          $this->pageBreaks($this->worksheetXml, $this->worksheet);
  30  
  31          return $unparsedLoadedData;
  32      }
  33  
  34      private function margins(\SimpleXMLElement $xmlSheet, Worksheet $worksheet)
  35      {
  36          if ($xmlSheet->pageMargins) {
  37              $docPageMargins = $worksheet->getPageMargins();
  38              $docPageMargins->setLeft((float) ($xmlSheet->pageMargins['left']));
  39              $docPageMargins->setRight((float) ($xmlSheet->pageMargins['right']));
  40              $docPageMargins->setTop((float) ($xmlSheet->pageMargins['top']));
  41              $docPageMargins->setBottom((float) ($xmlSheet->pageMargins['bottom']));
  42              $docPageMargins->setHeader((float) ($xmlSheet->pageMargins['header']));
  43              $docPageMargins->setFooter((float) ($xmlSheet->pageMargins['footer']));
  44          }
  45      }
  46  
  47      private function pageSetup(\SimpleXMLElement $xmlSheet, Worksheet $worksheet, array $unparsedLoadedData)
  48      {
  49          if ($xmlSheet->pageSetup) {
  50              $docPageSetup = $worksheet->getPageSetup();
  51  
  52              if (isset($xmlSheet->pageSetup['orientation'])) {
  53                  $docPageSetup->setOrientation((string) $xmlSheet->pageSetup['orientation']);
  54              }
  55              if (isset($xmlSheet->pageSetup['paperSize'])) {
  56                  $docPageSetup->setPaperSize((int) ($xmlSheet->pageSetup['paperSize']));
  57              }
  58              if (isset($xmlSheet->pageSetup['scale'])) {
  59                  $docPageSetup->setScale((int) ($xmlSheet->pageSetup['scale']), false);
  60              }
  61              if (isset($xmlSheet->pageSetup['fitToHeight']) && (int) ($xmlSheet->pageSetup['fitToHeight']) >= 0) {
  62                  $docPageSetup->setFitToHeight((int) ($xmlSheet->pageSetup['fitToHeight']), false);
  63              }
  64              if (isset($xmlSheet->pageSetup['fitToWidth']) && (int) ($xmlSheet->pageSetup['fitToWidth']) >= 0) {
  65                  $docPageSetup->setFitToWidth((int) ($xmlSheet->pageSetup['fitToWidth']), false);
  66              }
  67              if (isset($xmlSheet->pageSetup['firstPageNumber'], $xmlSheet->pageSetup['useFirstPageNumber']) &&
  68                  self::boolean((string) $xmlSheet->pageSetup['useFirstPageNumber'])) {
  69                  $docPageSetup->setFirstPageNumber((int) ($xmlSheet->pageSetup['firstPageNumber']));
  70              }
  71  
  72              $relAttributes = $xmlSheet->pageSetup->attributes('http://schemas.openxmlformats.org/officeDocument/2006/relationships');
  73              if (isset($relAttributes['id'])) {
  74                  $unparsedLoadedData['sheets'][$worksheet->getCodeName()]['pageSetupRelId'] = (string) $relAttributes['id'];
  75              }
  76          }
  77  
  78          return $unparsedLoadedData;
  79      }
  80  
  81      private function headerFooter(\SimpleXMLElement $xmlSheet, Worksheet $worksheet)
  82      {
  83          if ($xmlSheet->headerFooter) {
  84              $docHeaderFooter = $worksheet->getHeaderFooter();
  85  
  86              if (isset($xmlSheet->headerFooter['differentOddEven']) &&
  87                  self::boolean((string) $xmlSheet->headerFooter['differentOddEven'])) {
  88                  $docHeaderFooter->setDifferentOddEven(true);
  89              } else {
  90                  $docHeaderFooter->setDifferentOddEven(false);
  91              }
  92              if (isset($xmlSheet->headerFooter['differentFirst']) &&
  93                  self::boolean((string) $xmlSheet->headerFooter['differentFirst'])) {
  94                  $docHeaderFooter->setDifferentFirst(true);
  95              } else {
  96                  $docHeaderFooter->setDifferentFirst(false);
  97              }
  98              if (isset($xmlSheet->headerFooter['scaleWithDoc']) &&
  99                  !self::boolean((string) $xmlSheet->headerFooter['scaleWithDoc'])) {
 100                  $docHeaderFooter->setScaleWithDocument(false);
 101              } else {
 102                  $docHeaderFooter->setScaleWithDocument(true);
 103              }
 104              if (isset($xmlSheet->headerFooter['alignWithMargins']) &&
 105                  !self::boolean((string) $xmlSheet->headerFooter['alignWithMargins'])) {
 106                  $docHeaderFooter->setAlignWithMargins(false);
 107              } else {
 108                  $docHeaderFooter->setAlignWithMargins(true);
 109              }
 110  
 111              $docHeaderFooter->setOddHeader((string) $xmlSheet->headerFooter->oddHeader);
 112              $docHeaderFooter->setOddFooter((string) $xmlSheet->headerFooter->oddFooter);
 113              $docHeaderFooter->setEvenHeader((string) $xmlSheet->headerFooter->evenHeader);
 114              $docHeaderFooter->setEvenFooter((string) $xmlSheet->headerFooter->evenFooter);
 115              $docHeaderFooter->setFirstHeader((string) $xmlSheet->headerFooter->firstHeader);
 116              $docHeaderFooter->setFirstFooter((string) $xmlSheet->headerFooter->firstFooter);
 117          }
 118      }
 119  
 120      private function pageBreaks(\SimpleXMLElement $xmlSheet, Worksheet $worksheet)
 121      {
 122          if ($xmlSheet->rowBreaks && $xmlSheet->rowBreaks->brk) {
 123              $this->rowBreaks($xmlSheet, $worksheet);
 124          }
 125          if ($xmlSheet->colBreaks && $xmlSheet->colBreaks->brk) {
 126              $this->columnBreaks($xmlSheet, $worksheet);
 127          }
 128      }
 129  
 130      private function rowBreaks(\SimpleXMLElement $xmlSheet, Worksheet $worksheet)
 131      {
 132          foreach ($xmlSheet->rowBreaks->brk as $brk) {
 133              if ($brk['man']) {
 134                  $worksheet->setBreak("A{$brk['id']}", Worksheet::BREAK_ROW);
 135              }
 136          }
 137      }
 138  
 139      private function columnBreaks(\SimpleXMLElement $xmlSheet, Worksheet $worksheet)
 140      {
 141          foreach ($xmlSheet->colBreaks->brk as $brk) {
 142              if ($brk['man']) {
 143                  $worksheet->setBreak(
 144                      Coordinate::stringFromColumnIndex(((int) $brk['id']) + 1) . '1',
 145                      Worksheet::BREAK_COLUMN
 146                  );
 147              }
 148          }
 149      }
 150  }