Search moodle.org's
Developer Documentation

See Release Notes

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

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

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