1: <?php
2: /**
3: * PHPExcel
4: *
5: * Copyright (c) 2006 - 2014 PHPExcel
6: *
7: * This library is free software; you can redistribute it and/or
8: * modify it under the terms of the GNU Lesser General Public
9: * License as published by the Free Software Foundation; either
10: * version 2.1 of the License, or (at your option) any later version.
11: *
12: * This library is distributed in the hope that it will be useful,
13: * but WITHOUT ANY WARRANTY; without even the implied warranty of
14: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15: * Lesser General Public License for more details.
16: *
17: * You should have received a copy of the GNU Lesser General Public
18: * License along with this library; if not, write to the Free Software
19: * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20: *
21: * @category PHPExcel
22: * @package PHPExcel_Calculation
23: * @copyright Copyright (c) 2006 - 2014 PHPExcel (http://www.codeplex.com/PHPExcel)
24: * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL
25: * @version 1.8.0, 2014-03-02
26: */
27:
28:
29: /** PHPExcel root directory */
30: if (!defined('PHPEXCEL_ROOT')) {
31: /**
32: * @ignore
33: */
34: define('PHPEXCEL_ROOT', dirname(__FILE__) . '/../../');
35: require(PHPEXCEL_ROOT . 'PHPExcel/Autoloader.php');
36: }
37:
38:
39: /**
40: * PHPExcel_Calculation_Logical
41: *
42: * @category PHPExcel
43: * @package PHPExcel_Calculation
44: * @copyright Copyright (c) 2006 - 2014 PHPExcel (http://www.codeplex.com/PHPExcel)
45: */
46: class PHPExcel_Calculation_Logical {
47:
48: /**
49: * TRUE
50: *
51: * Returns the boolean TRUE.
52: *
53: * Excel Function:
54: * =TRUE()
55: *
56: * @access public
57: * @category Logical Functions
58: * @return boolean True
59: */
60: public static function TRUE() {
61: return TRUE;
62: } // function TRUE()
63:
64:
65: /**
66: * FALSE
67: *
68: * Returns the boolean FALSE.
69: *
70: * Excel Function:
71: * =FALSE()
72: *
73: * @access public
74: * @category Logical Functions
75: * @return boolean False
76: */
77: public static function FALSE() {
78: return FALSE;
79: } // function FALSE()
80:
81:
82: /**
83: * LOGICAL_AND
84: *
85: * Returns boolean TRUE if all its arguments are TRUE; returns FALSE if one or more argument is FALSE.
86: *
87: * Excel Function:
88: * =AND(logical1[,logical2[, ...]])
89: *
90: * The arguments must evaluate to logical values such as TRUE or FALSE, or the arguments must be arrays
91: * or references that contain logical values.
92: *
93: * Boolean arguments are treated as True or False as appropriate
94: * Integer or floating point arguments are treated as True, except for 0 or 0.0 which are False
95: * If any argument value is a string, or a Null, the function returns a #VALUE! error, unless the string holds
96: * the value TRUE or FALSE, in which case it is evaluated as the corresponding boolean value
97: *
98: * @access public
99: * @category Logical Functions
100: * @param mixed $arg,... Data values
101: * @return boolean The logical AND of the arguments.
102: */
103: public static function LOGICAL_AND() {
104: // Return value
105: $returnValue = TRUE;
106:
107: // Loop through the arguments
108: $aArgs = PHPExcel_Calculation_Functions::flattenArray(func_get_args());
109: $argCount = -1;
110: foreach ($aArgs as $argCount => $arg) {
111: // Is it a boolean value?
112: if (is_bool($arg)) {
113: $returnValue = $returnValue && $arg;
114: } elseif ((is_numeric($arg)) && (!is_string($arg))) {
115: $returnValue = $returnValue && ($arg != 0);
116: } elseif (is_string($arg)) {
117: $arg = strtoupper($arg);
118: if (($arg == 'TRUE') || ($arg == PHPExcel_Calculation::getTRUE())) {
119: $arg = TRUE;
120: } elseif (($arg == 'FALSE') || ($arg == PHPExcel_Calculation::getFALSE())) {
121: $arg = FALSE;
122: } else {
123: return PHPExcel_Calculation_Functions::VALUE();
124: }
125: $returnValue = $returnValue && ($arg != 0);
126: }
127: }
128:
129: // Return
130: if ($argCount < 0) {
131: return PHPExcel_Calculation_Functions::VALUE();
132: }
133: return $returnValue;
134: } // function LOGICAL_AND()
135:
136:
137: /**
138: * LOGICAL_OR
139: *
140: * Returns boolean TRUE if any argument is TRUE; returns FALSE if all arguments are FALSE.
141: *
142: * Excel Function:
143: * =OR(logical1[,logical2[, ...]])
144: *
145: * The arguments must evaluate to logical values such as TRUE or FALSE, or the arguments must be arrays
146: * or references that contain logical values.
147: *
148: * Boolean arguments are treated as True or False as appropriate
149: * Integer or floating point arguments are treated as True, except for 0 or 0.0 which are False
150: * If any argument value is a string, or a Null, the function returns a #VALUE! error, unless the string holds
151: * the value TRUE or FALSE, in which case it is evaluated as the corresponding boolean value
152: *
153: * @access public
154: * @category Logical Functions
155: * @param mixed $arg,... Data values
156: * @return boolean The logical OR of the arguments.
157: */
158: public static function LOGICAL_OR() {
159: // Return value
160: $returnValue = FALSE;
161:
162: // Loop through the arguments
163: $aArgs = PHPExcel_Calculation_Functions::flattenArray(func_get_args());
164: $argCount = -1;
165: foreach ($aArgs as $argCount => $arg) {
166: // Is it a boolean value?
167: if (is_bool($arg)) {
168: $returnValue = $returnValue || $arg;
169: } elseif ((is_numeric($arg)) && (!is_string($arg))) {
170: $returnValue = $returnValue || ($arg != 0);
171: } elseif (is_string($arg)) {
172: $arg = strtoupper($arg);
173: if (($arg == 'TRUE') || ($arg == PHPExcel_Calculation::getTRUE())) {
174: $arg = TRUE;
175: } elseif (($arg == 'FALSE') || ($arg == PHPExcel_Calculation::getFALSE())) {
176: $arg = FALSE;
177: } else {
178: return PHPExcel_Calculation_Functions::VALUE();
179: }
180: $returnValue = $returnValue || ($arg != 0);
181: }
182: }
183:
184: // Return
185: if ($argCount < 0) {
186: return PHPExcel_Calculation_Functions::VALUE();
187: }
188: return $returnValue;
189: } // function LOGICAL_OR()
190:
191:
192: /**
193: * NOT
194: *
195: * Returns the boolean inverse of the argument.
196: *
197: * Excel Function:
198: * =NOT(logical)
199: *
200: * The argument must evaluate to a logical value such as TRUE or FALSE
201: *
202: * Boolean arguments are treated as True or False as appropriate
203: * Integer or floating point arguments are treated as True, except for 0 or 0.0 which are False
204: * If any argument value is a string, or a Null, the function returns a #VALUE! error, unless the string holds
205: * the value TRUE or FALSE, in which case it is evaluated as the corresponding boolean value
206: *
207: * @access public
208: * @category Logical Functions
209: * @param mixed $logical A value or expression that can be evaluated to TRUE or FALSE
210: * @return boolean The boolean inverse of the argument.
211: */
212: public static function NOT($logical=FALSE) {
213: $logical = PHPExcel_Calculation_Functions::flattenSingleValue($logical);
214: if (is_string($logical)) {
215: $logical = strtoupper($logical);
216: if (($logical == 'TRUE') || ($logical == PHPExcel_Calculation::getTRUE())) {
217: return FALSE;
218: } elseif (($logical == 'FALSE') || ($logical == PHPExcel_Calculation::getFALSE())) {
219: return TRUE;
220: } else {
221: return PHPExcel_Calculation_Functions::VALUE();
222: }
223: }
224:
225: return !$logical;
226: } // function NOT()
227:
228: /**
229: * STATEMENT_IF
230: *
231: * Returns one value if a condition you specify evaluates to TRUE and another value if it evaluates to FALSE.
232: *
233: * Excel Function:
234: * =IF(condition[,returnIfTrue[,returnIfFalse]])
235: *
236: * Condition is any value or expression that can be evaluated to TRUE or FALSE.
237: * For example, A10=100 is a logical expression; if the value in cell A10 is equal to 100,
238: * the expression evaluates to TRUE. Otherwise, the expression evaluates to FALSE.
239: * This argument can use any comparison calculation operator.
240: * ReturnIfTrue is the value that is returned if condition evaluates to TRUE.
241: * For example, if this argument is the text string "Within budget" and the condition argument evaluates to TRUE,
242: * then the IF function returns the text "Within budget"
243: * If condition is TRUE and ReturnIfTrue is blank, this argument returns 0 (zero). To display the word TRUE, use
244: * the logical value TRUE for this argument.
245: * ReturnIfTrue can be another formula.
246: * ReturnIfFalse is the value that is returned if condition evaluates to FALSE.
247: * For example, if this argument is the text string "Over budget" and the condition argument evaluates to FALSE,
248: * then the IF function returns the text "Over budget".
249: * If condition is FALSE and ReturnIfFalse is omitted, then the logical value FALSE is returned.
250: * If condition is FALSE and ReturnIfFalse is blank, then the value 0 (zero) is returned.
251: * ReturnIfFalse can be another formula.
252: *
253: * @access public
254: * @category Logical Functions
255: * @param mixed $condition Condition to evaluate
256: * @param mixed $returnIfTrue Value to return when condition is true
257: * @param mixed $returnIfFalse Optional value to return when condition is false
258: * @return mixed The value of returnIfTrue or returnIfFalse determined by condition
259: */
260: public static function STATEMENT_IF($condition = TRUE, $returnIfTrue = 0, $returnIfFalse = FALSE) {
261: $condition = (is_null($condition)) ? TRUE : (boolean) PHPExcel_Calculation_Functions::flattenSingleValue($condition);
262: $returnIfTrue = (is_null($returnIfTrue)) ? 0 : PHPExcel_Calculation_Functions::flattenSingleValue($returnIfTrue);
263: $returnIfFalse = (is_null($returnIfFalse)) ? FALSE : PHPExcel_Calculation_Functions::flattenSingleValue($returnIfFalse);
264:
265: return ($condition) ? $returnIfTrue : $returnIfFalse;
266: } // function STATEMENT_IF()
267:
268:
269: /**
270: * IFERROR
271: *
272: * Excel Function:
273: * =IFERROR(testValue,errorpart)
274: *
275: * @access public
276: * @category Logical Functions
277: * @param mixed $testValue Value to check, is also the value returned when no error
278: * @param mixed $errorpart Value to return when testValue is an error condition
279: * @return mixed The value of errorpart or testValue determined by error condition
280: */
281: public static function IFERROR($testValue = '', $errorpart = '') {
282: $testValue = (is_null($testValue)) ? '' : PHPExcel_Calculation_Functions::flattenSingleValue($testValue);
283: $errorpart = (is_null($errorpart)) ? '' : PHPExcel_Calculation_Functions::flattenSingleValue($errorpart);
284:
285: return self::STATEMENT_IF(PHPExcel_Calculation_Functions::IS_ERROR($testValue), $errorpart, $testValue);
286: } // function IFERROR()
287:
288: } // class PHPExcel_Calculation_Logical
289: