code: public function save($pFilename)
      {
          if (!$this->spreadSheet) {
              throw new WriterException('PhpSpreadsheet object unassigned.');
          }
  
          // garbage collect
          $this->spreadSheet->garbageCollect();
  
          // If $pFilename is php://output or php://stdout, make it a temporary file...
          $originalFilename = $pFilename;
          if (strtolower($pFilename) == 'php://output' || strtolower($pFilename) == 'php://stdout') {
              $pFilename = @tempnam(File::sysGetTempDir(), 'phpxltmp');
              if ($pFilename == '') {
                  $pFilename = $originalFilename;
              }
          }
  
          $zip = $this->createZip($pFilename);
  
          $zip->addFromString('META-INF/manifest.xml', $this->getWriterPart('meta_inf')->writeManifest());
          $zip->addFromString('Thumbnails/thumbnail.png', $this->getWriterPart('thumbnails')->writeThumbnail());
          $zip->addFromString('content.xml', $this->getWriterPart('content')->write());
          $zip->addFromString('meta.xml', $this->getWriterPart('meta')->write());
          $zip->addFromString('mimetype', $this->getWriterPart('mimetype')->write());
          $zip->addFromString('settings.xml', $this->getWriterPart('settings')->write());
          $zip->addFromString('styles.xml', $this->getWriterPart('styles')->write());
  
          // Close file
          if ($zip->close() === false) {
              throw new WriterException("Could not close zip file $pFilename.");
          }
  
          // If a temporary file was used, copy it to the correct file stream
          if ($originalFilename != $pFilename) {
              if (copy($pFilename, $originalFilename) === false) {
                  throw new WriterException("Could not copy temporary zip file $pFilename to $originalFilename.");
              }
              @unlink($pFilename);
          }
      }
docs: Save PhpSpreadsheet to file.
  
  @param string $pFilename
  
  @throws WriterException