public function testLoopData() { $loopData = new LoopData(); $this->settings->addLoop('index', $loopData); $this->assertInstanceOf('\\XLSXTemplate\\LoopData', $this->settings->getLoopData('index')); $this->assertFalse($this->settings->getLoopData('nonExistentIndex')); }
/** * @param PHPExcel_Worksheet_RowIterator $rowIterator * @param PHPExcel_Worksheet $worksheet * @param string $cellValue */ private function replaceRowsСontentInLoop($rowIterator, $worksheet, $cellValue) { $loopKey = $this->extractLoopKey($cellValue); $loopData = $this->settings->getLoopData($loopKey); if ($loopData === false) { return; } $rowIterator->next(); $etalonRow = $rowIterator->current(); $cellIterator = $etalonRow->getCellIterator(); $cellIterator->setIterateOnlyExistingCells(true); $loopVariables = []; /** @var \PHPExcel_Cell $cell */ foreach ($cellIterator as $cell) { array_push($loopVariables, $cell->getValue()); } if ($loopData->count() > 1) { $worksheet->insertNewRowBefore($rowIterator->key() + 1, $loopData->count() - 1); } $loopDataMap = $loopData->getMap(); $rowNumber = 1; $needToMerge = []; foreach ($loopData->getSource() as $dataSource) { $row = $rowIterator->current(); $cellIterator = $row->getCellIterator(); $cellIterator->setIterateOnlyExistingCells(true); $cellIndex = 0; /** @var \PHPExcel_Cell $cell */ foreach ($cellIterator as $cell) { $pCoordinate = $cell->getColumn() . $cell->getRow(); if ($rowNumber == 1) { $range = $cell->getMergeRange(); if ($range && !isset($needToMerge[$range])) { $needToMerge[$range] = null; } /*$worksheet->duplicateStyle( $worksheet->getStyle($cell->getColumn().($etalonRow->getRowIndex() - 1)), $cell->getColumn().($cell->getRow() - 1) );*/ //print_r('copy '.$cell->getColumn().($etalonRow->getRowIndex()-1).' to '.$cell->getColumn().($cell->getRow() - 1).PHP_EOL); } $this->replaceСontentInLoop($worksheet, $pCoordinate, $loopVariables[$cellIndex], $dataSource, $loopDataMap, $rowNumber); $cellIndex++; } if ($rowNumber > 1 && $needToMerge) { foreach (array_keys($needToMerge) as $range) { $worksheet->mergeCells(preg_replace('/\\d+/', $row->getRowIndex(), $range)); } } $rowNumber++; $rowIterator->next(); } for ($i = 0; $i <= $rowNumber; $i++) { $rowIterator->prev(); } }