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 310 and 403] [Versions 311 and 403] [Versions 39 and 403] [Versions 400 and 403] [Versions 401 and 403] [Versions 402 and 403]

   1  <?php
   2  
   3  namespace PhpOffice\PhpSpreadsheet\Writer;
   4  
   5  use PhpOffice\PhpSpreadsheet\Spreadsheet;
   6  use PhpOffice\PhpSpreadsheet\Writer\Exception as WriterException;
   7  use PhpOffice\PhpSpreadsheet\Writer\Ods\Content;
   8  use PhpOffice\PhpSpreadsheet\Writer\Ods\Meta;
   9  use PhpOffice\PhpSpreadsheet\Writer\Ods\MetaInf;
  10  use PhpOffice\PhpSpreadsheet\Writer\Ods\Mimetype;
  11  use PhpOffice\PhpSpreadsheet\Writer\Ods\Settings;
  12  use PhpOffice\PhpSpreadsheet\Writer\Ods\Styles;
  13  use PhpOffice\PhpSpreadsheet\Writer\Ods\Thumbnails;
  14  use ZipStream\Exception\OverflowException;
  15  use ZipStream\ZipStream;
  16  
  17  class Ods extends BaseWriter
  18  {
  19      /**
  20       * Private PhpSpreadsheet.
  21       *
  22       * @var Spreadsheet
  23       */
  24      private $spreadSheet;
  25  
  26      /**
  27       * @var Content
  28       */
  29      private $writerPartContent;
  30  
  31      /**
  32       * @var Meta
  33       */
  34      private $writerPartMeta;
  35  
  36      /**
  37       * @var MetaInf
  38       */
  39      private $writerPartMetaInf;
  40  
  41      /**
  42       * @var Mimetype
  43       */
  44      private $writerPartMimetype;
  45  
  46      /**
  47       * @var Settings
  48       */
  49      private $writerPartSettings;
  50  
  51      /**
  52       * @var Styles
  53       */
  54      private $writerPartStyles;
  55  
  56      /**
  57       * @var Thumbnails
  58       */
  59      private $writerPartThumbnails;
  60  
  61      /**
  62       * Create a new Ods.
  63       */
  64      public function __construct(Spreadsheet $spreadsheet)
  65      {
  66          $this->setSpreadsheet($spreadsheet);
  67  
  68          $this->writerPartContent = new Content($this);
  69          $this->writerPartMeta = new Meta($this);
  70          $this->writerPartMetaInf = new MetaInf($this);
  71          $this->writerPartMimetype = new Mimetype($this);
  72          $this->writerPartSettings = new Settings($this);
  73          $this->writerPartStyles = new Styles($this);
  74          $this->writerPartThumbnails = new Thumbnails($this);
  75      }
  76  
  77      public function getWriterPartContent(): Content
  78      {
  79          return $this->writerPartContent;
  80      }
  81  
  82      public function getWriterPartMeta(): Meta
  83      {
  84          return $this->writerPartMeta;
  85      }
  86  
  87      public function getWriterPartMetaInf(): MetaInf
  88      {
  89          return $this->writerPartMetaInf;
  90      }
  91  
  92      public function getWriterPartMimetype(): Mimetype
  93      {
  94          return $this->writerPartMimetype;
  95      }
  96  
  97      public function getWriterPartSettings(): Settings
  98      {
  99          return $this->writerPartSettings;
 100      }
 101  
 102      public function getWriterPartStyles(): Styles
 103      {
 104          return $this->writerPartStyles;
 105      }
 106  
 107      public function getWriterPartThumbnails(): Thumbnails
 108      {
 109          return $this->writerPartThumbnails;
 110      }
 111  
 112      /**
 113       * Save PhpSpreadsheet to file.
 114       *
 115       * @param resource|string $filename
 116       */
 117      public function save($filename, int $flags = 0): void
 118      {
 119          $this->processFlags($flags);
 120  
 121          // garbage collect
 122          $this->spreadSheet->garbageCollect();
 123  
 124          $this->openFileHandle($filename);
 125  
 126          $zip = $this->createZip();
 127  
 128          $zip->addFile('META-INF/manifest.xml', $this->getWriterPartMetaInf()->write());
 129          $zip->addFile('Thumbnails/thumbnail.png', $this->getWriterPartthumbnails()->write());
 130          // Settings always need to be written before Content; Styles after Content
 131          $zip->addFile('settings.xml', $this->getWriterPartsettings()->write());
 132          $zip->addFile('content.xml', $this->getWriterPartcontent()->write());
 133          $zip->addFile('meta.xml', $this->getWriterPartmeta()->write());
 134          $zip->addFile('mimetype', $this->getWriterPartmimetype()->write());
 135          $zip->addFile('styles.xml', $this->getWriterPartstyles()->write());
 136  
 137          // Close file
 138          try {
 139              $zip->finish();
 140          } catch (OverflowException $e) {
 141              throw new WriterException('Could not close resource.');
 142          }
 143  
 144          $this->maybeCloseFileHandle();
 145      }
 146  
 147      /**
 148       * Create zip object.
 149       *
 150       * @return ZipStream
 151       */
 152      private function createZip()
 153      {
 154          // Try opening the ZIP file
 155          if (!is_resource($this->fileHandle)) {
 156              throw new WriterException('Could not open resource for writing.');
 157          }
 158  
 159          // Create new ZIP stream
 160          return ZipStream0::newZipStream($this->fileHandle);
 161      }
 162  
 163      /**
 164       * Get Spreadsheet object.
 165       *
 166       * @return Spreadsheet
 167       */
 168      public function getSpreadsheet()
 169      {
 170          return $this->spreadSheet;
 171      }
 172  
 173      /**
 174       * Set Spreadsheet object.
 175       *
 176       * @param Spreadsheet $spreadsheet PhpSpreadsheet object
 177       *
 178       * @return $this
 179       */
 180      public function setSpreadsheet(Spreadsheet $spreadsheet)
 181      {
 182          $this->spreadSheet = $spreadsheet;
 183  
 184          return $this;
 185      }
 186  }