Vendor/phpspreadsheet/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xls.php
private function buildWorksheetEschers()
    {
        // 1-based index to BstoreContainer
        $blipIndex = 0;
        $lastReducedSpId = 0;
        $lastSpId = 0;

        foreach ($this->spreadsheet->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 Escher();

            // dgContainer
            $dgContainer = new 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 SpgrContainer();
            $dgContainer->setSpgrContainer($spgrContainer);

            // add one shape which is the group shape
            $spContainer = new 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 SpContainer();

                // set the shape type
                $spContainer->setSpType(0x004B);
                // set the shape flag
                $spContainer->setSpFlag(0x02);

                // 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 = \PhpOffice\PhpSpreadsheet\Shared\Xls::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 = Coordinate::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 BaseDrawing();
                    // get the coordinates of drawing
                    $cDrawing = Coordinate::stringFromColumnIndex($iInc) . $rangeBounds[0][1];
                    $oDrawing->setCoordinates($cDrawing);
                    $oDrawing->setWorksheet($sheet);

                    // add the shape
                    $spContainer = new SpContainer();
                    // set the shape type
                    $spContainer->setSpType(0x00C9);
                    // set the shape flag
                    $spContainer->setSpFlag(0x01);

                    // 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(0x007F, 0x01040104); // Protection -> fLockAgainstGrouping
                    $spContainer->setOPT(0x00BF, 0x00080008); // Text -> fFitTextToShape
                    $spContainer->setOPT(0x01BF, 0x00010000); // Fill Style -> fNoFillHitTest
                    $spContainer->setOPT(0x01FF, 0x00080000); // Line Style -> fNoLineDrawDash
                    $spContainer->setOPT(0x03BF, 0x000A0000); // Group Shape -> fPrint

                    // set coordinates and offsets, client anchor
                    $endCoordinates = Coordinate::stringFromColumnIndex($iInc);
                    $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);
        }
    }
private function buildWorksheetEschers()
    {
        // 1-based index to BstoreContainer
        $blipIndex = 0;
        $lastReducedSpId = 0;
        $lastSpId = 0;

        foreach ($this->spreadsheet->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 Escher();

            // dgContainer
            $dgContainer = new 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 SpgrContainer();
            $dgContainer->setSpgrContainer($spgrContainer);

            // add one shape which is the group shape
            $spContainer = new 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 SpContainer();

                // set the shape type
                $spContainer->setSpType(0x004B);
                // set the shape flag
                $spContainer->setSpFlag(0x02);

                // 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 = \PhpOffice\PhpSpreadsheet\Shared\Xls::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 = Coordinate::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 BaseDrawing();
                    // get the coordinates of drawing
                    $cDrawing = Coordinate::stringFromColumnIndex($iInc) . $rangeBounds[0][1];
                    $oDrawing->setCoordinates($cDrawing);
                    $oDrawing->setWorksheet($sheet);

                    // add the shape
                    $spContainer = new SpContainer();
                    // set the shape type
                    $spContainer->setSpType(0x00C9);
                    // set the shape flag
                    $spContainer->setSpFlag(0x01);

                    // 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(0x007F, 0x01040104); // Protection -> fLockAgainstGrouping
                    $spContainer->setOPT(0x00BF, 0x00080008); // Text -> fFitTextToShape
                    $spContainer->setOPT(0x01BF, 0x00010000); // Fill Style -> fNoFillHitTest
                    $spContainer->setOPT(0x01FF, 0x00080000); // Line Style -> fNoLineDrawDash
                    $spContainer->setOPT(0x03BF, 0x000A0000); // Group Shape -> fPrint

                    // set coordinates and offsets, client anchor
                    $endCoordinates = Coordinate::stringFromColumnIndex($iInc);
                    $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);
        }
    }
private function buildWorksheetEschers ( ) { // 1-based index to BstoreContainer $ blipIndex = 0 ; $ lastReducedSpId = 0 ; $ lastSpId = 0 ; foreach ( $ this -> spreadsheet -> 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 Escher ( ) ; // dgContainer $ dgContainer = new 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 SpgrContainer ( ) ; $ dgContainer -> setSpgrContainer ( $ spgrContainer ) ; // add one shape which is the group shape $ spContainer = new 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 SpContainer ( ) ; // set the shape type $ spContainer -> setSpType ( 0x004B ) ; // set the shape flag $ spContainer -> setSpFlag ( 0x02 ) ; // 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 = \ PhpOffice \ PhpSpreadsheet \ Shared \ Xls :: 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 = Coordinate :: 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 BaseDrawing ( ) ; // get the coordinates of drawing $ cDrawing = Coordinate :: stringFromColumnIndex ( $ iInc ) . $ rangeBounds [ 0 ] [ 1 ] ; $ oDrawing -> setCoordinates ( $ cDrawing ) ; $ oDrawing -> setWorksheet ( $ sheet ) ; // add the shape $ spContainer = new SpContainer ( ) ; // set the shape type $ spContainer -> setSpType ( 0x00C9 ) ; // set the shape flag $ spContainer -> setSpFlag ( 0x01 ) ; // 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 ( 0x007F , 0x01040104 ) ; // Protection -> fLockAgainstGrouping $ spContainer -> setOPT ( 0x00BF , 0x00080008 ) ; // Text -> fFitTextToShape $ spContainer -> setOPT ( 0x01BF , 0x00010000 ) ; // Fill Style -> fNoFillHitTest $ spContainer -> setOPT ( 0x01FF , 0x00080000 ) ; // Line Style -> fNoLineDrawDash $ spContainer -> setOPT ( 0x03BF , 0x000A0000 ) ; // Group Shape -> fPrint // set coordinates and offsets, client anchor $ endCoordinates = Coordinate :: stringFromColumnIndex ( $ iInc ) ; $ 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 ) ; } }
Build the Worksheet Escher objects.
Build the Worksheet Escher objects .