コード例 #1
0
 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'));
 }
コード例 #2
0
 /**
  * @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();
     }
 }