Search moodle.org's
Developer Documentation

See Release Notes

  • Bug fixes for general core bugs in 4.0.x will end 8 May 2023 (12 months).
  • Bug fixes for security issues in 4.0.x will end 13 November 2023 (18 months).
  • PHP version: minimum PHP 7.3.0 Note: the minimum PHP version has increased since Moodle 3.10. PHP 7.4.x is also supported.

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

   1  <?php
   2  
   3  namespace PhpOffice\PhpSpreadsheet\Reader\Xml;
   4  
   5  use PhpOffice\PhpSpreadsheet\Spreadsheet;
   6  use PhpOffice\PhpSpreadsheet\Worksheet\PageSetup;
   7  use SimpleXMLElement;
   8  use stdClass;
   9  
  10  class PageSettings
  11  {
  12      /**
  13       * @var stdClass
  14       */
  15      private $printSettings;
  16  
  17      public function __construct(SimpleXMLElement $xmlX, array $namespaces)
  18      {
  19          $printSettings = $this->pageSetup($xmlX, $namespaces, $this->getPrintDefaults());
  20          $this->printSettings = $this->printSetup($xmlX, $printSettings);
  21      }
  22  
  23      public function loadPageSettings(Spreadsheet $spreadsheet): void
  24      {
  25          $spreadsheet->getActiveSheet()->getPageSetup()
  26              ->setPaperSize($this->printSettings->paperSize)
  27              ->setOrientation($this->printSettings->orientation)
  28              ->setScale($this->printSettings->scale)
  29              ->setVerticalCentered($this->printSettings->verticalCentered)
  30              ->setHorizontalCentered($this->printSettings->horizontalCentered)
  31              ->setPageOrder($this->printSettings->printOrder);
  32          $spreadsheet->getActiveSheet()->getPageMargins()
  33              ->setTop($this->printSettings->topMargin)
  34              ->setHeader($this->printSettings->headerMargin)
  35              ->setLeft($this->printSettings->leftMargin)
  36              ->setRight($this->printSettings->rightMargin)
  37              ->setBottom($this->printSettings->bottomMargin)
  38              ->setFooter($this->printSettings->footerMargin);
  39      }
  40  
  41      private function getPrintDefaults(): stdClass
  42      {
  43          return (object) [
  44              'paperSize' => 9,
  45              'orientation' => PageSetup::ORIENTATION_DEFAULT,
  46              'scale' => 100,
  47              'horizontalCentered' => false,
  48              'verticalCentered' => false,
  49              'printOrder' => PageSetup::PAGEORDER_DOWN_THEN_OVER,
  50              'topMargin' => 0.75,
  51              'headerMargin' => 0.3,
  52              'leftMargin' => 0.7,
  53              'rightMargin' => 0.7,
  54              'bottomMargin' => 0.75,
  55              'footerMargin' => 0.3,
  56          ];
  57      }
  58  
  59      private function pageSetup(SimpleXMLElement $xmlX, array $namespaces, stdClass $printDefaults): stdClass
  60      {
  61          if (isset($xmlX->WorksheetOptions->PageSetup)) {
  62              foreach ($xmlX->WorksheetOptions->PageSetup as $pageSetupData) {
  63                  foreach ($pageSetupData as $pageSetupKey => $pageSetupValue) {
  64                      $pageSetupAttributes = $pageSetupValue->attributes($namespaces['x']);
  65                      if (!$pageSetupAttributes) {
  66                          continue;
  67                      }
  68  
  69                      switch ($pageSetupKey) {
  70                          case 'Layout':
  71                              $this->setLayout($printDefaults, $pageSetupAttributes);
  72  
  73                              break;
  74                          case 'Header':
  75                              $printDefaults->headerMargin = (float) $pageSetupAttributes->Margin ?: 1.0;
  76  
  77                              break;
  78                          case 'Footer':
  79                              $printDefaults->footerMargin = (float) $pageSetupAttributes->Margin ?: 1.0;
  80  
  81                              break;
  82                          case 'PageMargins':
  83                              $this->setMargins($printDefaults, $pageSetupAttributes);
  84  
  85                              break;
  86                      }
  87                  }
  88              }
  89          }
  90  
  91          return $printDefaults;
  92      }
  93  
  94      private function printSetup(SimpleXMLElement $xmlX, stdClass $printDefaults): stdClass
  95      {
  96          if (isset($xmlX->WorksheetOptions->Print)) {
  97              foreach ($xmlX->WorksheetOptions->Print as $printData) {
  98                  foreach ($printData as $printKey => $printValue) {
  99                      switch ($printKey) {
 100                          case 'LeftToRight':
 101                              $printDefaults->printOrder = PageSetup::PAGEORDER_OVER_THEN_DOWN;
 102  
 103                              break;
 104                          case 'PaperSizeIndex':
 105                              $printDefaults->paperSize = (int) $printValue ?: 9;
 106  
 107                              break;
 108                          case 'Scale':
 109                              $printDefaults->scale = (int) $printValue ?: 100;
 110  
 111                              break;
 112                      }
 113                  }
 114              }
 115          }
 116  
 117          return $printDefaults;
 118      }
 119  
 120      private function setLayout(stdClass $printDefaults, SimpleXMLElement $pageSetupAttributes): void
 121      {
 122          $printDefaults->orientation = (string) strtolower($pageSetupAttributes->Orientation ?? '') ?: PageSetup::ORIENTATION_PORTRAIT;
 123          $printDefaults->horizontalCentered = (bool) $pageSetupAttributes->CenterHorizontal ?: false;
 124          $printDefaults->verticalCentered = (bool) $pageSetupAttributes->CenterVertical ?: false;
 125      }
 126  
 127      private function setMargins(stdClass $printDefaults, SimpleXMLElement $pageSetupAttributes): void
 128      {
 129          $printDefaults->leftMargin = (float) $pageSetupAttributes->Left ?: 1.0;
 130          $printDefaults->rightMargin = (float) $pageSetupAttributes->Right ?: 1.0;
 131          $printDefaults->topMargin = (float) $pageSetupAttributes->Top ?: 1.0;
 132          $printDefaults->bottomMargin = (float) $pageSetupAttributes->Bottom ?: 1.0;
 133      }
 134  }