ExcelNamedRangeTemplatePopulator::populate()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 4

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

Changes 0
Metric Value
dl 0
loc 4
ccs 0
cts 4
cp 0
rs 10
c 0
b 0
f 0
cc 1
nc 1
nop 1
crap 2
1
<?php
2
namespace Mathielen\ReportWriteEngine\Output\Excel\Template;
3
4
use Mathielen\ReportWriteEngine\Engine\Template\TemplatePopulatorInterface;
5
use Psr\Log\LoggerInterface;
6
use Psr\Log\NullLogger;
7
8
class ExcelNamedRangeTemplatePopulator implements TemplatePopulatorInterface
9
{
10
11
    /**
12
     * @var LoggerInterface
13
     */
14
    private $logger;
15
16
    public function __construct(LoggerInterface $logger = null)
17
    {
18
        $this->logger = $logger ? $logger : new NullLogger();
19
    }
20
21
    public function populate($templateSheet)
22
    {
23
        return $this->populateNamedRanges($templateSheet);
24
    }
25
26
    private function populateNamedRanges(\PHPExcel_Worksheet $templateSheet)
27
    {
28
        $template = $templateSheet->getParent();
29
30
        $excelNamedRanges = array_change_key_case($template->getNamedRanges(), CASE_UPPER);
31
        if (!isset($excelNamedRanges['ROOT'])) {
32
            throw new \InvalidArgumentException("Missing Named-Range: 'ROOT'");
33
        }
34
35
        $namedRanges = [];
36
37
        /** @var \PHPExcel_NamedRange $excelNamedRange */
38
        foreach ($excelNamedRanges as $name => $excelNamedRange) {
39
            $namedRanges[$name] = [];
40
41
            foreach ($templateSheet->rangeToArray($excelNamedRange->getRange(), null, false, true, true) as $rowNum => $row) {
42
                $namedRanges[$name][$rowNum - 1] = [];
43
44
                foreach ($row as $col => $cellValue) {
45
                    $colNum = \PHPExcel_Cell::columnIndexFromString($col);
46
47
                    $templateCor = $col.$rowNum;
48
                    $style = $this->getStyleOfCell($templateSheet, $templateCor);
49
50
                    $namedRanges[$name][$rowNum - 1][$colNum - 1] = [
51
                        'value' => $cellValue,
52
                        'style' => $style
53
                    ];
54
                }
55
            }
56
        }
57
58
        $this->logger->debug('Populated named ranges', array_keys($namedRanges));
59
60
        return $namedRanges;
61
    }
62
63
    private function getStyleOfCell(\PHPExcel_Worksheet $templateSheet, $templateCor)
64
    {
65
        $style = $templateSheet->getStyle($templateCor);
66
        $style = $style->getIsSupervisor() ? $style->getSharedComponent() : $style;
67
68
        return $style->getIndex();
69
    }
70
71
}
72