Issues (5)

src/Support.php (1 issue)

Severity
1
<?php
2
3
/**
4
 * Class Support.
5
 */
6
7
namespace Zhaqq\Xlsx;
8
9
/**
10
 * Class Support.
11
 */
12
class Support
13
{
14
    /**
15
     * @param int  $rowNumber
16
     * @param int  $columnNumber
17
     * @param bool $absolute
18
     *
19
     * @return string
20
     */
21
    public static function xlsCell(int $rowNumber, int $columnNumber, bool $absolute = false)
22
    {
23
        $n = $columnNumber;
24
        for ($r = ''; $n >= 0; $n = intval($n / 26) - 1) {
25
            $r = chr($n % 26 + 0x41).$r;
26
        }
27
        if ($absolute) {
28
            return '$'.$r.'$'.($rowNumber + 1);
29
        }
30
31
        return $r.($rowNumber + 1);
32
    }
33
34
    /**
35
     * @param $numFormat
36
     *
37
     * @return string
38
     */
39
    public static function numberFormatStandardized($numFormat)
40
    {
41
        if ('money' == $numFormat) {
42
            $numFormat = 'dollar';
43
        }
44
        if ('number' == $numFormat) {
45
            $numFormat = 'integer';
46
        }
47
        switch ($numFormat) {
48
            case 'string':
49
                $numFormat = '@';
50
51
                break;
52
            case 'integer':
53
                $numFormat = '0';
54
55
                break;
56
            case 'date':
57
                $numFormat = 'YYYY-MM-DD';
58
59
                break;
60
            case 'datetime':
61
                $numFormat = 'YYYY-MM-DD HH:MM:SS';
62
63
                break;
64
            case 'price':
65
                $numFormat = '#,##0.00';
66
67
                break;
68
            case 'float3':
69
                $numFormat = '#,###0.000';
70
71
                break;
72
            case 'dollar':
73
                $numFormat = '[$$-1009]#,##0.00;[RED]-[$$-1009]#,##0.00';
74
75
                break;
76
            case 'euro':
77
                $numFormat = '#,##0.00 [$€-407];[RED]-#,##0.00 [$€-407]';
78
79
                break;
80
        }
81
        $ignoreUntil = '';
82
        $escaped = '';
83
        for ($i = 0, $ix = strlen($numFormat); $i < $ix; ++$i) {
84
            $c = $numFormat[$i];
85
            if ('' == $ignoreUntil && '[' == $c) {
86
                $ignoreUntil = ']';
87
            } elseif ('' == $ignoreUntil && '"' == $c) {
88
                $ignoreUntil = '"';
89
            } elseif ($ignoreUntil == $c) {
90
                $ignoreUntil = '';
91
            }
92
            if ('' == $ignoreUntil && (' ' == $c || '-' == $c || '(' == $c || ')' == $c) && (0 == $i || '_' != $numFormat[$i - 1])) {
93
                $escaped .= '\\'.$c;
94
            } else {
95
                $escaped .= $c;
96
            }
97
        }
98
99
        return $escaped;
100
    }
101
102
    public static function determineNumberFormatType($numFormat, $function = false)
0 ignored issues
show
The parameter $function is not used and could be removed. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-unused  annotation

102
    public static function determineNumberFormatType($numFormat, /** @scrutinizer ignore-unused */ $function = false)

This check looks for parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
103
    {
104
        $numFormat = preg_replace("/\[(Black|Blue|Cyan|Green|Magenta|Red|White|Yellow)\]/i", '', $numFormat);
105
106
        switch ($numFormat) {
107
            case 'GENERAL':
108
                return 'n_auto';
109
            case '@':
110
                return 'n_string';
111
            case '0':
112
                return 'n_numeric';
113
            case 0 != preg_match('/[H]{1,2}:[M]{1,2}(?![^"]*+")/i', $numFormat):
114
            case 0 != preg_match('/[M]{1,2}:[S]{1,2}(?![^"]*+")/i', $numFormat):
115
                return 'n_datetime';
116
            case 0 != preg_match('/[Y]{2,4}(?![^"]*+")/i', $numFormat):
117
            case 0 != preg_match('/[D]{1,2}(?![^"]*+")/i', $numFormat):
118
            case 0 != preg_match('/[M]{1,2}(?![^"]*+")/i', $numFormat):
119
                return 'n_date';
120
            case 0 != preg_match('/$(?![^"]*+")/', $numFormat):
121
            case 0 != preg_match('/%(?![^"]*+")/', $numFormat):
122
            case 0 != preg_match('/0(?![^"]*+")/', $numFormat):
123
                return 'n_numeric';
124
            default:
125
                return 'n_auto';
126
        }
127
    }
128
129
    /**
130
     * @param $haystack
131
     * @param $needle
132
     *
133
     * @return false|int|string
134
     */
135
    public static function add2listGetIndex(&$haystack, $needle)
136
    {
137
        $existingIdx = array_search($needle, $haystack, $strict = true);
138
        if (false === $existingIdx) {
139
            $existingIdx = count($haystack);
140
            $haystack[] = $needle;
141
        }
142
143
        return $existingIdx;
144
    }
145
146
    /**
147
     * @param $val
148
     *
149
     * @return string
150
     */
151
    public static function xmlSpecialChars($val)
152
    {
153
        //note, badchars does not include \t\n\r (\x09\x0a\x0d)
154
        static $badchars = "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x0b\x0c\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x7f";
155
        static $goodchars = '                              ';
156
157
        return strtr(htmlspecialchars($val, ENT_QUOTES | ENT_XML1), $badchars, $goodchars); //strtr appears to be faster than str_replace
158
    }
159
160
    /**
161
     * @param $dateInput
162
     *
163
     * @return float|int
164
     */
165
    public static function convertDateTime($dateInput)
166
    {
167
        $seconds = 0;    // Time expressed as fraction of 24h hours in seconds
168
        $year = $month = $day = 0;
169
170
        $date_time = $dateInput;
171
        if (preg_match("/(\d{4})\-(\d{2})\-(\d{2})/", $date_time, $matches)) {
172
            list($junk, $year, $month, $day) = $matches;
173
        }
174
        if (preg_match("/(\d+):(\d{2}):(\d{2})/", $date_time, $matches)) {
175
            list($junk, $hour, $min, $sec) = $matches;
176
            $seconds = ($hour * 60 * 60 + $min * 60 + $sec) / (24 * 60 * 60);
177
        }
178
        unset($junk);
179
180
        //using 1900 as epoch, not 1904, ignoring 1904 special case
181
        // Special cases for Excel.
182
        if ('1899-12-31' == "$year-$month-$day") {
183
            return $seconds;
184
        }    // Excel 1900 epoch
185
        if ('1900-01-00' == "$year-$month-$day") {
186
            return $seconds;
187
        }    // Excel 1900 epoch
188
        if ('1900-02-29' == "$year-$month-$day") {
189
            return 60 + $seconds;
190
        }    // Excel false leapday
191
        // We calculate the date by calculating the number of days since the epoch
192
        // and adjust for the number of leap days. We calculate the number of leap
193
        // days by normalising the year in relation to the epoch. Thus the year 2000
194
        // becomes 100 for 4 and 100 year leapdays and 400 for 400 year leapdays.
195
        $epoch = 1900;
196
        $offset = 0;
197
        $norm = 300;
198
        $range = $year - $epoch;
199
        // Set month days and check for leap year.
200
        $leap = ((0 == $year % 400) || ((0 == $year % 4) && ($year % 100))) ? 1 : 0;
201
        $mdays = [31, ($leap ? 29 : 28), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
202
        // Some boundary checks
203
        if ($year < $epoch || $year > 9999) {
204
            return 0;
205
        }
206
        if ($month < 1 || $month > 12) {
207
            return 0;
208
        }
209
        if ($day < 1 || $day > $mdays[$month - 1]) {
210
            return 0;
211
        }
212
        // Accumulate the number of days since the epoch.
213
        $days = $day;    // Add days for current month
214
        $days += array_sum(array_slice($mdays, 0, $month - 1));    // Add days for past months
215
        $days += $range * 365;                      // Add days for past years
216
        $days += intval(($range) / 4);             // Add leapdays
217
        $days -= intval(($range + $offset) / 100); // Subtract 100 year leapdays
218
        $days += intval(($range + $offset + $norm) / 400);  // Add 400 year leapdays
219
        $days -= $leap;                                      // Already counted above
220
        // Adjust for Excel erroneously treating 1900 as a leap year.
221
        if ($days > 59) {
222
            ++$days;
223
        }
224
225
        return $days + $seconds;
226
    }
227
228
    public static function sanitizeSheetname($sheetname)
229
    {
230
        static $badchars = '\\/?*:[]';
231
        static $goodchars = '        ';
232
        $sheetname = strtr($sheetname, $badchars, $goodchars);
233
        $sheetname = mb_substr($sheetname, 0, 31);
234
        $sheetname = trim(trim(trim($sheetname), "'")); //trim before and after trimming single quotes
235
236
        return !empty($sheetname) ? $sheetname : 'Sheet'.((rand() % 900) + 100);
237
    }
238
}
239