Completed
Push — master ( 864f04...767f7b )
by Stefan
05:57 queued 02:43
created

Writer::writeToBrowser()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 7
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 6
CRAP Score 2

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 7
ccs 6
cts 6
cp 1
rs 9.4285
cc 2
eloc 4
nc 2
nop 1
crap 2
1
<?php
2
3
namespace OneSheet;
4
5
use OneSheet\Style\Style;
6
use OneSheet\Style\Styler;
7
use OneSheet\Size\SizeCalculator;
8
use OneSheet\Size\SizeCollection;
9
10
/**
11
 * Class Writer
12
 *
13
 * @package OneSheet
14
 */
15
class Writer
16
{
17
    /**
18
     * @var SheetFile
19
     */
20
    private $sheetFile;
21
22
    /**
23
     * @var Styler
24
     */
25
    private $styler;
26
27
    /**
28
     * @var Sheet
29
     */
30
    private $sheet;
31
32
    /**
33
     * Writer constructor.
34
     */
35 8
    public function __construct()
36
    {
37 8
        $this->initialize();
38 8
    }
39
40
    /**
41
     * All cells _above_ this cell will be frozen/fixed.
42
     *
43
     * @param int $cellId
44
     */
45 1
    public function setFreezePaneCellId($cellId)
46
    {
47 1
        $this->sheet->setFreezePaneCellId($cellId);
48 1
    }
49
50
    /**
51
     * Set fixed column widths per cell (no ranges) and array index
52
     * 0 being the first column.
53
     * If used alongside cell autosizing, these should be set
54
     * after the last row has been added.
55
     *
56
     * @param array $columnWidths
57
     * @throws \InvalidArgumentException
58
     */
59 1
    public function setFixedColumnWidths(array $columnWidths)
60
    {
61 1
        $this->sheet->setFixedColumnWidths($columnWidths);
62 1
    }
63
64
    /**
65
     * Set lower and/or upper limits for column widths.
66
     *
67
     * @param float|null $minWidth
68
     * @param float|null $maxWidth
69
     */
70 1
    public function setColumnWidthLimits($minWidth = null, $maxWidth = null)
71
    {
72 1
        $this->sheet->setColumnWidthLimits($minWidth, $maxWidth);
73 1
    }
74
75
    /**
76
     * Start recording row specs for column autosizing.
77
     *
78
     * @return Writer
79
     */
80 3
    public function enableCellAutosizing()
81
    {
82 3
        $this->sheet->enableCellAutosizing();
83 3
        return $this;
84
    }
85
86
    /**
87
     * Stop recording row specs for column autosizing.
88
     *
89
     * @return Writer
90
     */
91 1
    public function disableCellAutosizing()
92
    {
93 1
        $this->sheet->disableCellAutosizing();
94 1
        return $this;
95
    }
96
97
    /**
98
     * Initialize writer defaults.
99
     */
100 8
    private function initialize()
101
    {
102 8
        $this->sheetFile = new SheetFile();
103 8
        $this->sheetFile->fwrite(str_repeat(' ', pow(2, 20)) . '<sheetData>');
104 8
        $this->styler = new Styler();
105 8
        $this->sheet = new Sheet(new CellBuilder(), new SizeCalculator(new SizeCollection()));
106 8
    }
107
108
    /**
109
     * @param array $rows
110
     * @param Style $style
111
     * @throws \InvalidArgumentException
112
     */
113 2
    public function addRows(array $rows, Style $style = null)
114
    {
115 2
        if (count($rows) === count($rows, COUNT_RECURSIVE)) {
116 1
            throw new \InvalidArgumentException('Array must contain arrays!');
117
        }
118
119 1
        foreach ($rows as $row) {
120 1
            $this->addRow($row, $style);
121 1
        }
122 1
    }
123
124
    /**
125
     * @param array $row
126
     * @param Style $style
127
     */
128 2
    public function addRow(array $row, Style $style = null)
129
    {
130 2
        if (!empty($row)) {
131 2
            $style = $style instanceof Style ? $style : $this->styler->getDefaultStyle();
132 2
            $this->styler->addStyle($style);
133 2
            $this->sheetFile->fwrite($this->sheet->addRow($row, $style));
134 2
        }
135 2
    }
136
137
    /**
138
     * Send xlsx to browser and unlink file.
139
     *
140
     * @param string $fileName
141
     */
142 1
    public function writeToBrowser($fileName = 'report.xlsx')
143
    {
144 1
        $this->writeToFile($fileName);
145 1
        if (is_readable($fileName)) {
146 1
            $this->sendToBrowserAndUnlink($fileName);
147 1
        }
148 1
    }
149
150
    /**
151
     * Wrap things up and write xlsx.
152
     *
153
     * @param string $fileName
154
     */
155 2
    public function writeToFile($fileName = 'report.xlsx')
156
    {
157 2
        $finalizer = new Finalizer($this->sheet, $this->styler, $this->sheetFile);
158 2
        $finalizer->finalize($fileName);
159 2
    }
160
161
    /**
162
     * Output headers & content and unlink the xlsx file eventually.
163
     *
164
     * @param string $fileName
165
     */
166 1
    private function sendToBrowserAndUnlink($fileName)
167
    {
168 1
        header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
169 1
        header('Content-Disposition: attachment; filename="' . $fileName . '"');
170 1
        header('Content-Length: ' . filesize($fileName));
171 1
        header('Cache-Control: max-age=0');
172 1
        header('Pragma: public');
173 1
        echo readfile($fileName);
174 1
        unlink($fileName);
175 1
    }
176
}
177