You are here

public function PHPExcel_Writer_Excel2007::save in Loft Data Grids 6.2

Same name and namespace in other branches
  1. 7.2 vendor/phpoffice/phpexcel/Classes/PHPExcel/Writer/Excel2007.php \PHPExcel_Writer_Excel2007::save()

* Save PHPExcel to file * *

Parameters

string $pFilename: * @throws PHPExcel_Writer_Exception

Overrides PHPExcel_Writer_IWriter::save

File

vendor/phpoffice/phpexcel/Classes/PHPExcel/Writer/Excel2007.php, line 188

Class

PHPExcel_Writer_Excel2007
PHPExcel_Writer_Excel2007

Code

public function save($pFilename = null) {
  if ($this->_spreadSheet !== NULL) {

    // 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(PHPExcel_Shared_File::sys_get_temp_dir(), 'phpxltmp');
      if ($pFilename == '') {
        $pFilename = $originalFilename;
      }
    }
    $saveDebugLog = PHPExcel_Calculation::getInstance($this->_spreadSheet)
      ->getDebugLog()
      ->getWriteDebugLog();
    PHPExcel_Calculation::getInstance($this->_spreadSheet)
      ->getDebugLog()
      ->setWriteDebugLog(FALSE);
    $saveDateReturnType = PHPExcel_Calculation_Functions::getReturnDateType();
    PHPExcel_Calculation_Functions::setReturnDateType(PHPExcel_Calculation_Functions::RETURNDATE_EXCEL);

    // Create string lookup table
    $this->_stringTable = array();
    for ($i = 0; $i < $this->_spreadSheet
      ->getSheetCount(); ++$i) {
      $this->_stringTable = $this
        ->getWriterPart('StringTable')
        ->createStringTable($this->_spreadSheet
        ->getSheet($i), $this->_stringTable);
    }

    // Create styles dictionaries
    $this->_styleHashTable
      ->addFromSource($this
      ->getWriterPart('Style')
      ->allStyles($this->_spreadSheet));
    $this->_stylesConditionalHashTable
      ->addFromSource($this
      ->getWriterPart('Style')
      ->allConditionalStyles($this->_spreadSheet));
    $this->_fillHashTable
      ->addFromSource($this
      ->getWriterPart('Style')
      ->allFills($this->_spreadSheet));
    $this->_fontHashTable
      ->addFromSource($this
      ->getWriterPart('Style')
      ->allFonts($this->_spreadSheet));
    $this->_bordersHashTable
      ->addFromSource($this
      ->getWriterPart('Style')
      ->allBorders($this->_spreadSheet));
    $this->_numFmtHashTable
      ->addFromSource($this
      ->getWriterPart('Style')
      ->allNumberFormats($this->_spreadSheet));

    // Create drawing dictionary
    $this->_drawingHashTable
      ->addFromSource($this
      ->getWriterPart('Drawing')
      ->allDrawings($this->_spreadSheet));

    // Create new ZIP file and open it for writing
    $zipClass = PHPExcel_Settings::getZipClass();
    $objZip = new $zipClass();

    //	Retrieve OVERWRITE and CREATE constants from the instantiated zip class
    //	This method of accessing constant values from a dynamic class should work with all appropriate versions of PHP
    $ro = new ReflectionObject($objZip);
    $zipOverWrite = $ro
      ->getConstant('OVERWRITE');
    $zipCreate = $ro
      ->getConstant('CREATE');
    if (file_exists($pFilename)) {
      unlink($pFilename);
    }

    // Try opening the ZIP file
    if ($objZip
      ->open($pFilename, $zipOverWrite) !== true) {
      if ($objZip
        ->open($pFilename, $zipCreate) !== true) {
        throw new PHPExcel_Writer_Exception("Could not open " . $pFilename . " for writing.");
      }
    }

    // Add [Content_Types].xml to ZIP file
    $objZip
      ->addFromString('[Content_Types].xml', $this
      ->getWriterPart('ContentTypes')
      ->writeContentTypes($this->_spreadSheet, $this->_includeCharts));

    //if hasMacros, add the vbaProject.bin file, Certificate file(if exists)
    if ($this->_spreadSheet
      ->hasMacros()) {
      $macrosCode = $this->_spreadSheet
        ->getMacrosCode();
      if (!is_null($macrosCode)) {

        // we have the code ?
        $objZip
          ->addFromString('xl/vbaProject.bin', $macrosCode);

        //allways in 'xl', allways named vbaProject.bin
        if ($this->_spreadSheet
          ->hasMacrosCertificate()) {

          //signed macros ?

          // Yes : add the certificate file and the related rels file
          $objZip
            ->addFromString('xl/vbaProjectSignature.bin', $this->_spreadSheet
            ->getMacrosCertificate());
          $objZip
            ->addFromString('xl/_rels/vbaProject.bin.rels', $this
            ->getWriterPart('RelsVBA')
            ->writeVBARelationships($this->_spreadSheet));
        }
      }
    }

    //a custom UI in this workbook ? add it ("base" xml and additional objects (pictures) and rels)
    if ($this->_spreadSheet
      ->hasRibbon()) {
      $tmpRibbonTarget = $this->_spreadSheet
        ->getRibbonXMLData('target');
      $objZip
        ->addFromString($tmpRibbonTarget, $this->_spreadSheet
        ->getRibbonXMLData('data'));
      if ($this->_spreadSheet
        ->hasRibbonBinObjects()) {
        $tmpRootPath = dirname($tmpRibbonTarget) . '/';
        $ribbonBinObjects = $this->_spreadSheet
          ->getRibbonBinObjects('data');

        //the files to write
        foreach ($ribbonBinObjects as $aPath => $aContent) {
          $objZip
            ->addFromString($tmpRootPath . $aPath, $aContent);
        }

        //the rels for files
        $objZip
          ->addFromString($tmpRootPath . '_rels/' . basename($tmpRibbonTarget) . '.rels', $this
          ->getWriterPart('RelsRibbonObjects')
          ->writeRibbonRelationships($this->_spreadSheet));
      }
    }

    // Add relationships to ZIP file
    $objZip
      ->addFromString('_rels/.rels', $this
      ->getWriterPart('Rels')
      ->writeRelationships($this->_spreadSheet));
    $objZip
      ->addFromString('xl/_rels/workbook.xml.rels', $this
      ->getWriterPart('Rels')
      ->writeWorkbookRelationships($this->_spreadSheet));

    // Add document properties to ZIP file
    $objZip
      ->addFromString('docProps/app.xml', $this
      ->getWriterPart('DocProps')
      ->writeDocPropsApp($this->_spreadSheet));
    $objZip
      ->addFromString('docProps/core.xml', $this
      ->getWriterPart('DocProps')
      ->writeDocPropsCore($this->_spreadSheet));
    $customPropertiesPart = $this
      ->getWriterPart('DocProps')
      ->writeDocPropsCustom($this->_spreadSheet);
    if ($customPropertiesPart !== NULL) {
      $objZip
        ->addFromString('docProps/custom.xml', $customPropertiesPart);
    }

    // Add theme to ZIP file
    $objZip
      ->addFromString('xl/theme/theme1.xml', $this
      ->getWriterPart('Theme')
      ->writeTheme($this->_spreadSheet));

    // Add string table to ZIP file
    $objZip
      ->addFromString('xl/sharedStrings.xml', $this
      ->getWriterPart('StringTable')
      ->writeStringTable($this->_stringTable));

    // Add styles to ZIP file
    $objZip
      ->addFromString('xl/styles.xml', $this
      ->getWriterPart('Style')
      ->writeStyles($this->_spreadSheet));

    // Add workbook to ZIP file
    $objZip
      ->addFromString('xl/workbook.xml', $this
      ->getWriterPart('Workbook')
      ->writeWorkbook($this->_spreadSheet, $this->_preCalculateFormulas));
    $chartCount = 0;

    // Add worksheets
    for ($i = 0; $i < $this->_spreadSheet
      ->getSheetCount(); ++$i) {
      $objZip
        ->addFromString('xl/worksheets/sheet' . ($i + 1) . '.xml', $this
        ->getWriterPart('Worksheet')
        ->writeWorksheet($this->_spreadSheet
        ->getSheet($i), $this->_stringTable, $this->_includeCharts));
      if ($this->_includeCharts) {
        $charts = $this->_spreadSheet
          ->getSheet($i)
          ->getChartCollection();
        if (count($charts) > 0) {
          foreach ($charts as $chart) {
            $objZip
              ->addFromString('xl/charts/chart' . ($chartCount + 1) . '.xml', $this
              ->getWriterPart('Chart')
              ->writeChart($chart));
            $chartCount++;
          }
        }
      }
    }
    $chartRef1 = $chartRef2 = 0;

    // Add worksheet relationships (drawings, ...)
    for ($i = 0; $i < $this->_spreadSheet
      ->getSheetCount(); ++$i) {

      // Add relationships
      $objZip
        ->addFromString('xl/worksheets/_rels/sheet' . ($i + 1) . '.xml.rels', $this
        ->getWriterPart('Rels')
        ->writeWorksheetRelationships($this->_spreadSheet
        ->getSheet($i), $i + 1, $this->_includeCharts));
      $drawings = $this->_spreadSheet
        ->getSheet($i)
        ->getDrawingCollection();
      $drawingCount = count($drawings);
      if ($this->_includeCharts) {
        $chartCount = $this->_spreadSheet
          ->getSheet($i)
          ->getChartCount();
      }

      // Add drawing and image relationship parts
      if ($drawingCount > 0 || $chartCount > 0) {

        // Drawing relationships
        $objZip
          ->addFromString('xl/drawings/_rels/drawing' . ($i + 1) . '.xml.rels', $this
          ->getWriterPart('Rels')
          ->writeDrawingRelationships($this->_spreadSheet
          ->getSheet($i), $chartRef1, $this->_includeCharts));

        // Drawings
        $objZip
          ->addFromString('xl/drawings/drawing' . ($i + 1) . '.xml', $this
          ->getWriterPart('Drawing')
          ->writeDrawings($this->_spreadSheet
          ->getSheet($i), $chartRef2, $this->_includeCharts));
      }

      // Add comment relationship parts
      if (count($this->_spreadSheet
        ->getSheet($i)
        ->getComments()) > 0) {

        // VML Comments
        $objZip
          ->addFromString('xl/drawings/vmlDrawing' . ($i + 1) . '.vml', $this
          ->getWriterPart('Comments')
          ->writeVMLComments($this->_spreadSheet
          ->getSheet($i)));

        // Comments
        $objZip
          ->addFromString('xl/comments' . ($i + 1) . '.xml', $this
          ->getWriterPart('Comments')
          ->writeComments($this->_spreadSheet
          ->getSheet($i)));
      }

      // Add header/footer relationship parts
      if (count($this->_spreadSheet
        ->getSheet($i)
        ->getHeaderFooter()
        ->getImages()) > 0) {

        // VML Drawings
        $objZip
          ->addFromString('xl/drawings/vmlDrawingHF' . ($i + 1) . '.vml', $this
          ->getWriterPart('Drawing')
          ->writeVMLHeaderFooterImages($this->_spreadSheet
          ->getSheet($i)));

        // VML Drawing relationships
        $objZip
          ->addFromString('xl/drawings/_rels/vmlDrawingHF' . ($i + 1) . '.vml.rels', $this
          ->getWriterPart('Rels')
          ->writeHeaderFooterDrawingRelationships($this->_spreadSheet
          ->getSheet($i)));

        // Media
        foreach ($this->_spreadSheet
          ->getSheet($i)
          ->getHeaderFooter()
          ->getImages() as $image) {
          $objZip
            ->addFromString('xl/media/' . $image
            ->getIndexedFilename(), file_get_contents($image
            ->getPath()));
        }
      }
    }

    // Add media
    for ($i = 0; $i < $this
      ->getDrawingHashTable()
      ->count(); ++$i) {
      if ($this
        ->getDrawingHashTable()
        ->getByIndex($i) instanceof PHPExcel_Worksheet_Drawing) {
        $imageContents = null;
        $imagePath = $this
          ->getDrawingHashTable()
          ->getByIndex($i)
          ->getPath();
        if (strpos($imagePath, 'zip://') !== false) {
          $imagePath = substr($imagePath, 6);
          $imagePathSplitted = explode('#', $imagePath);
          $imageZip = new ZipArchive();
          $imageZip
            ->open($imagePathSplitted[0]);
          $imageContents = $imageZip
            ->getFromName($imagePathSplitted[1]);
          $imageZip
            ->close();
          unset($imageZip);
        }
        else {
          $imageContents = file_get_contents($imagePath);
        }
        $objZip
          ->addFromString('xl/media/' . str_replace(' ', '_', $this
          ->getDrawingHashTable()
          ->getByIndex($i)
          ->getIndexedFilename()), $imageContents);
      }
      else {
        if ($this
          ->getDrawingHashTable()
          ->getByIndex($i) instanceof PHPExcel_Worksheet_MemoryDrawing) {
          ob_start();
          call_user_func($this
            ->getDrawingHashTable()
            ->getByIndex($i)
            ->getRenderingFunction(), $this
            ->getDrawingHashTable()
            ->getByIndex($i)
            ->getImageResource());
          $imageContents = ob_get_contents();
          ob_end_clean();
          $objZip
            ->addFromString('xl/media/' . str_replace(' ', '_', $this
            ->getDrawingHashTable()
            ->getByIndex($i)
            ->getIndexedFilename()), $imageContents);
        }
      }
    }
    PHPExcel_Calculation_Functions::setReturnDateType($saveDateReturnType);
    PHPExcel_Calculation::getInstance($this->_spreadSheet)
      ->getDebugLog()
      ->setWriteDebugLog($saveDebugLog);

    // Close file
    if ($objZip
      ->close() === false) {
      throw new PHPExcel_Writer_Exception("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 PHPExcel_Writer_Exception("Could not copy temporary zip file {$pFilename} to {$originalFilename}.");
      }
      @unlink($pFilename);
    }
  }
  else {
    throw new PHPExcel_Writer_Exception("PHPExcel object unassigned.");
  }
}