You are here

private function PHPExcel_Writer_Excel5::_buildWorksheetEschers in Loft Data Grids 6.2

Same name and namespace in other branches
  1. 7.2 vendor/phpoffice/phpexcel/Classes/PHPExcel/Writer/Excel5.php \PHPExcel_Writer_Excel5::_buildWorksheetEschers()

* Build the Worksheet Escher objects *

1 call to PHPExcel_Writer_Excel5::_buildWorksheetEschers()
PHPExcel_Writer_Excel5::save in vendor/phpoffice/phpexcel/Classes/PHPExcel/Writer/Excel5.php
* Save PHPExcel to file * *

File

vendor/phpoffice/phpexcel/Classes/PHPExcel/Writer/Excel5.php, line 248

Class

PHPExcel_Writer_Excel5
PHPExcel_Writer_Excel5

Code

private function _buildWorksheetEschers() {

  // 1-based index to BstoreContainer
  $blipIndex = 0;
  $lastReducedSpId = 0;
  $lastSpId = 0;
  foreach ($this->_phpExcel
    ->getAllsheets() as $sheet) {

    // sheet index
    $sheetIndex = $sheet
      ->getParent()
      ->getIndex($sheet);
    $escher = null;

    // check if there are any shapes for this sheet
    $filterRange = $sheet
      ->getAutoFilter()
      ->getRange();
    if (count($sheet
      ->getDrawingCollection()) == 0 && empty($filterRange)) {
      continue;
    }

    // create intermediate Escher object
    $escher = new PHPExcel_Shared_Escher();

    // dgContainer
    $dgContainer = new PHPExcel_Shared_Escher_DgContainer();

    // set the drawing index (we use sheet index + 1)
    $dgId = $sheet
      ->getParent()
      ->getIndex($sheet) + 1;
    $dgContainer
      ->setDgId($dgId);
    $escher
      ->setDgContainer($dgContainer);

    // spgrContainer
    $spgrContainer = new PHPExcel_Shared_Escher_DgContainer_SpgrContainer();
    $dgContainer
      ->setSpgrContainer($spgrContainer);

    // add one shape which is the group shape
    $spContainer = new PHPExcel_Shared_Escher_DgContainer_SpgrContainer_SpContainer();
    $spContainer
      ->setSpgr(true);
    $spContainer
      ->setSpType(0);
    $spContainer
      ->setSpId($sheet
      ->getParent()
      ->getIndex($sheet) + 1 << 10);
    $spgrContainer
      ->addChild($spContainer);

    // add the shapes
    $countShapes[$sheetIndex] = 0;

    // count number of shapes (minus group shape), in sheet
    foreach ($sheet
      ->getDrawingCollection() as $drawing) {
      ++$blipIndex;
      ++$countShapes[$sheetIndex];

      // add the shape
      $spContainer = new PHPExcel_Shared_Escher_DgContainer_SpgrContainer_SpContainer();

      // set the shape type
      $spContainer
        ->setSpType(0x4b);

      // set the shape flag
      $spContainer
        ->setSpFlag(0x2);

      // set the shape index (we combine 1-based sheet index and $countShapes to create unique shape index)
      $reducedSpId = $countShapes[$sheetIndex];
      $spId = $reducedSpId | $sheet
        ->getParent()
        ->getIndex($sheet) + 1 << 10;
      $spContainer
        ->setSpId($spId);

      // keep track of last reducedSpId
      $lastReducedSpId = $reducedSpId;

      // keep track of last spId
      $lastSpId = $spId;

      // set the BLIP index
      $spContainer
        ->setOPT(0x4104, $blipIndex);

      // set coordinates and offsets, client anchor
      $coordinates = $drawing
        ->getCoordinates();
      $offsetX = $drawing
        ->getOffsetX();
      $offsetY = $drawing
        ->getOffsetY();
      $width = $drawing
        ->getWidth();
      $height = $drawing
        ->getHeight();
      $twoAnchor = PHPExcel_Shared_Excel5::oneAnchor2twoAnchor($sheet, $coordinates, $offsetX, $offsetY, $width, $height);
      $spContainer
        ->setStartCoordinates($twoAnchor['startCoordinates']);
      $spContainer
        ->setStartOffsetX($twoAnchor['startOffsetX']);
      $spContainer
        ->setStartOffsetY($twoAnchor['startOffsetY']);
      $spContainer
        ->setEndCoordinates($twoAnchor['endCoordinates']);
      $spContainer
        ->setEndOffsetX($twoAnchor['endOffsetX']);
      $spContainer
        ->setEndOffsetY($twoAnchor['endOffsetY']);
      $spgrContainer
        ->addChild($spContainer);
    }

    // AutoFilters
    if (!empty($filterRange)) {
      $rangeBounds = PHPExcel_Cell::rangeBoundaries($filterRange);
      $iNumColStart = $rangeBounds[0][0];
      $iNumColEnd = $rangeBounds[1][0];
      $iInc = $iNumColStart;
      while ($iInc <= $iNumColEnd) {
        ++$countShapes[$sheetIndex];

        // create an Drawing Object for the dropdown
        $oDrawing = new PHPExcel_Worksheet_BaseDrawing();

        // get the coordinates of drawing
        $cDrawing = PHPExcel_Cell::stringFromColumnIndex($iInc - 1) . $rangeBounds[0][1];
        $oDrawing
          ->setCoordinates($cDrawing);
        $oDrawing
          ->setWorksheet($sheet);

        // add the shape
        $spContainer = new PHPExcel_Shared_Escher_DgContainer_SpgrContainer_SpContainer();

        // set the shape type
        $spContainer
          ->setSpType(0xc9);

        // set the shape flag
        $spContainer
          ->setSpFlag(0x1);

        // set the shape index (we combine 1-based sheet index and $countShapes to create unique shape index)
        $reducedSpId = $countShapes[$sheetIndex];
        $spId = $reducedSpId | $sheet
          ->getParent()
          ->getIndex($sheet) + 1 << 10;
        $spContainer
          ->setSpId($spId);

        // keep track of last reducedSpId
        $lastReducedSpId = $reducedSpId;

        // keep track of last spId
        $lastSpId = $spId;
        $spContainer
          ->setOPT(0x7f, 0x1040104);

        // Protection -> fLockAgainstGrouping
        $spContainer
          ->setOPT(0xbf, 0x80008);

        // Text -> fFitTextToShape
        $spContainer
          ->setOPT(0x1bf, 0x10000);

        // Fill Style -> fNoFillHitTest
        $spContainer
          ->setOPT(0x1ff, 0x80000);

        // Line Style -> fNoLineDrawDash
        $spContainer
          ->setOPT(0x3bf, 0xa0000);

        // Group Shape -> fPrint
        // set coordinates and offsets, client anchor
        $endCoordinates = PHPExcel_Cell::stringFromColumnIndex(PHPExcel_Cell::stringFromColumnIndex($iInc - 1));
        $endCoordinates .= $rangeBounds[0][1] + 1;
        $spContainer
          ->setStartCoordinates($cDrawing);
        $spContainer
          ->setStartOffsetX(0);
        $spContainer
          ->setStartOffsetY(0);
        $spContainer
          ->setEndCoordinates($endCoordinates);
        $spContainer
          ->setEndOffsetX(0);
        $spContainer
          ->setEndOffsetY(0);
        $spgrContainer
          ->addChild($spContainer);
        $iInc++;
      }
    }

    // identifier clusters, used for workbook Escher object
    $this->_IDCLs[$dgId] = $lastReducedSpId;

    // set last shape index
    $dgContainer
      ->setLastSpId($lastSpId);

    // set the Escher object
    $this->_writerWorksheets[$sheetIndex]
      ->setEscher($escher);
  }
}