XlsExporter::export()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 18
Code Lines 12

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 1
Metric Value
c 1
b 0
f 1
dl 0
loc 18
rs 9.4286
cc 1
eloc 12
nc 1
nop 4
1
<?php
2
3
namespace Ob\CmsBundle\Export;
4
5
use Liuggio\ExcelBundle\Factory;
6
7
class XlsExporter implements ExporterInterface
8
{
9
    /**
10
     * @var Factory
11
     */
12
    private $phpexcel;
13
14
    /**
15
     * @param Factory $phpexcel
16
     */
17
    public function __construct(Factory $phpexcel)
18
    {
19
        $this->phpexcel = $phpexcel;
20
    }
21
22
    /**
23
     * {@inheritdoc}
24
     */
25
    public function export($filename, $format, $data, $fields)
26
    {
27
        $file = $this->phpexcel->createPHPExcelObject();
28
        $sheet = $file->setActiveSheetIndex(0);
29
30
        $sheet = $this->writeRows($sheet, $fields, $data);
31
        $this->writeHeaders($sheet, $fields);
32
33
        $writer = $this->phpexcel->createWriter($file, 'Excel5');
34
35
        $response = $this->phpexcel->createStreamedResponse($writer);
36
        $response->headers->set('Content-Type', 'text/vnd.ms-excel; charset=utf-8');
37
        $response->headers->set('Content-Disposition', 'attachment;filename=' . $filename);
38
        $response->headers->set('Pragma', 'public');
39
        $response->headers->set('Cache-Control', 'maxage=1');
40
41
        return $response;
42
    }
43
44
    private function writeHeaders($sheet, $columnNames)
45
    {
46
        // Define column range
47
        $first = $last = 'A';
48
49
        // Write headers
50
        foreach ($columnNames as $header) {
51
            $sheet->setCellValue($last . '1', $header);
52
            $last++;
53
        }
54
55
        $sheet->freezePane('A2');
56
57
        // Make them stand out
58
        $sheet->getStyle($first . '1:' . $last . '1')->getFont()->setBold(true);
59
60
        // Auto-size columns
61
        foreach (range($first, $last) as $column) {
62
            $sheet->getColumnDimension($column)->setAutoSize(true);
63
        }
64
65
        return $sheet;
66
    }
67
68
    private function writeRows($sheet, $columnNames, $data)
69
    {
70
        $firstDataRow = 2;
71
72
        foreach ($data as $entity) {
73
            $cell = 'A';
74
75
            foreach ($columnNames as $column) {
76
                if (strpos($column, '.') !== false) {
77
                    list($relation, $field) = explode('.', $column);
78
                    $relation = $entity->{"get$relation"}();
79
                    $value = $relation ? $relation->{"get$field"}() : "";
80
81
                    if (gettype($value) == 'object') {
82
                        $value = $value->__toString();
83
                    }
84
                } else {
85
                    $value = $this->stringify($entity->{"get$column"}());
86
                }
87
88
                $sheet->setCellValue($cell . $firstDataRow, $value);
89
                $cell++;
90
            }
91
92
            $firstDataRow++;
93
        }
94
95
        return $sheet;
96
    }
97
98
    /**
99
     * Transform objects to strings
100
     *
101
     * @param $value
102
     * @return string|mixed
103
     */
104
    private function stringify($value)
105
    {
106
        if (gettype($value) == 'object') {
107
            switch (get_class($value)) {
108
                case 'DateTime':
109
                    $value = $value->format('Y-m-d');
110
                    break;
111
                case 'Doctrine\Common\Collections':
112
                case 'Doctrine\ORM\PersistentCollection':
113
                    $value = count($value);
114
                    break;
115
            }
116
        }
117
118
        return $value;
119
    }
120
121
    /**
122
     * {@inheritdoc}
123
     */
124
    public function supports($format)
125
    {
126
        if ($format == 'xls') {
127
            return true;
128
        }
129
130
        return false;
131
    }
132
}
133