Search moodle.org's
Developer Documentation

See Release Notes

  • Bug fixes for general core bugs in 4.3.x will end 7 October 2024 (12 months).
  • Bug fixes for security issues in 4.3.x will end 21 April 2025 (18 months).
  • PHP version: minimum PHP 8.0.0 Note: minimum PHP version has increased since Moodle 4.1. PHP 8.2.x is supported too.

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

   1  <?php
   2  
   3  namespace PhpOffice\PhpSpreadsheet\Reader\Xml;
   4  
   5  use PhpOffice\PhpSpreadsheet\Reader\Xlsx\Namespaces;
   6  use PhpOffice\PhpSpreadsheet\Spreadsheet;
   7  use PhpOffice\PhpSpreadsheet\Worksheet\PageSetup;
   8  use SimpleXMLElement;
   9  use stdClass;
  10  
  11  class PageSettings
  12  {
  13      /**
  14       * @var stdClass
  15       */
  16      private $printSettings;
  17  
  18      public function __construct(SimpleXMLElement $xmlX)
  19      {
  20          $printSettings = $this->pageSetup($xmlX, $this->getPrintDefaults());
  21          $this->printSettings = $this->printSetup($xmlX, $printSettings);
  22      }
  23  
  24      public function loadPageSettings(Spreadsheet $spreadsheet): void
  25      {
  26          $spreadsheet->getActiveSheet()->getPageSetup()
  27              ->setPaperSize($this->printSettings->paperSize)
  28              ->setOrientation($this->printSettings->orientation)
  29              ->setScale($this->printSettings->scale)
  30              ->setVerticalCentered($this->printSettings->verticalCentered)
  31              ->setHorizontalCentered($this->printSettings->horizontalCentered)
  32              ->setPageOrder($this->printSettings->printOrder);
  33          $spreadsheet->getActiveSheet()->getPageMargins()
  34              ->setTop($this->printSettings->topMargin)
  35              ->setHeader($this->printSettings->headerMargin)
  36              ->setLeft($this->printSettings->leftMargin)
  37              ->setRight($this->printSettings->rightMargin)
  38              ->setBottom($this->printSettings->bottomMargin)
  39              ->setFooter($this->printSettings->footerMargin);
  40      }
  41  
  42      private function getPrintDefaults(): stdClass
  43      {
  44          return (object) [
  45              'paperSize' => 9,
  46              'orientation' => PageSetup::ORIENTATION_DEFAULT,
  47              'scale' => 100,
  48              'horizontalCentered' => false,
  49              'verticalCentered' => false,
  50              'printOrder' => PageSetup::PAGEORDER_DOWN_THEN_OVER,
  51              'topMargin' => 0.75,
  52              'headerMargin' => 0.3,
  53              'leftMargin' => 0.7,
  54              'rightMargin' => 0.7,
  55              'bottomMargin' => 0.75,
  56              'footerMargin' => 0.3,
  57          ];
  58      }
  59  
  60      private function pageSetup(SimpleXMLElement $xmlX, stdClass $printDefaults): stdClass
  61      {
  62          if (isset($xmlX->WorksheetOptions->PageSetup)) {
  63              foreach ($xmlX->WorksheetOptions->PageSetup as $pageSetupData) {
  64                  foreach ($pageSetupData as $pageSetupKey => $pageSetupValue) {
  65                      /** @scrutinizer ignore-call */
  66                      $pageSetupAttributes = $pageSetupValue->attributes(Namespaces::URN_EXCEL);
  67                      if ($pageSetupAttributes !== null) {
  68                          switch ($pageSetupKey) {
  69                              case 'Layout':
  70                                  $this->setLayout($printDefaults, $pageSetupAttributes);
  71  
  72                                  break;
  73                              case 'Header':
  74                                  $printDefaults->headerMargin = (float) $pageSetupAttributes->Margin ?: 1.0;
  75  
  76                                  break;
  77                              case 'Footer':
  78                                  $printDefaults->footerMargin = (float) $pageSetupAttributes->Margin ?: 1.0;
  79  
  80                                  break;
  81                              case 'PageMargins':
  82                                  $this->setMargins($printDefaults, $pageSetupAttributes);
  83  
  84                                  break;
  85                          }
  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  }