ILIAS  eassessment Revision 61809
 All Data Structures Namespaces Files Functions Variables Groups Pages
Functions.php
Go to the documentation of this file.
1 <?php
30 if (!defined('PHPEXCEL_ROOT')) {
34  define('PHPEXCEL_ROOT', dirname(__FILE__) . '/../../');
35  require(PHPEXCEL_ROOT . 'PHPExcel/Autoloader.php');
36 }
37 
38 
40 define('MAX_VALUE', 1.2e308);
41 
43 define('M_2DIVPI', 0.63661977236758134307553505349006);
44 
46 define('MAX_ITERATIONS', 256);
47 
49 define('PRECISION', 8.88E-016);
50 
51 
60 
62  const COMPATIBILITY_EXCEL = 'Excel';
63  const COMPATIBILITY_GNUMERIC = 'Gnumeric';
64  const COMPATIBILITY_OPENOFFICE = 'OpenOfficeCalc';
65 
67  const RETURNDATE_PHP_OBJECT = 'O';
68  const RETURNDATE_EXCEL = 'E';
69 
70 
78 
86 
93  protected static $_errorCodes = array( 'null' => '#NULL!',
94  'divisionbyzero' => '#DIV/0!',
95  'value' => '#VALUE!',
96  'reference' => '#REF!',
97  'name' => '#NAME?',
98  'num' => '#NUM!',
99  'na' => '#N/A',
100  'gettingdata' => '#GETTING_DATA'
101  );
102 
103 
116  public static function setCompatibilityMode($compatibilityMode) {
117  if (($compatibilityMode == self::COMPATIBILITY_EXCEL) ||
118  ($compatibilityMode == self::COMPATIBILITY_GNUMERIC) ||
119  ($compatibilityMode == self::COMPATIBILITY_OPENOFFICE)) {
120  self::$compatibilityMode = $compatibilityMode;
121  return True;
122  }
123  return False;
124  } // function setCompatibilityMode()
125 
126 
138  public static function getCompatibilityMode() {
140  } // function getCompatibilityMode()
141 
142 
155  public static function setReturnDateType($returnDateType) {
156  if (($returnDateType == self::RETURNDATE_PHP_NUMERIC) ||
157  ($returnDateType == self::RETURNDATE_PHP_OBJECT) ||
158  ($returnDateType == self::RETURNDATE_EXCEL)) {
159  self::$ReturnDateType = $returnDateType;
160  return True;
161  }
162  return False;
163  } // function setReturnDateType()
164 
165 
177  public static function getReturnDateType() {
178  return self::$ReturnDateType;
179  } // function getReturnDateType()
180 
181 
189  public static function DUMMY() {
190  return '#Not Yet Implemented';
191  } // function DUMMY()
192 
193 
201  public static function DIV0() {
202  return self::$_errorCodes['divisionbyzero'];
203  } // function DIV0()
204 
205 
219  public static function NA() {
220  return self::$_errorCodes['na'];
221  } // function NA()
222 
223 
233  public static function NaN() {
234  return self::$_errorCodes['num'];
235  } // function NaN()
236 
237 
247  public static function NAME() {
248  return self::$_errorCodes['name'];
249  } // function NAME()
250 
251 
261  public static function REF() {
262  return self::$_errorCodes['reference'];
263  } // function REF()
264 
265 
275  public static function NULL() {
276  return self::$_errorCodes['null'];
277  } // function NULL()
278 
279 
289  public static function VALUE() {
290  return self::$_errorCodes['value'];
291  } // function VALUE()
292 
293 
294  public static function isMatrixValue($idx) {
295  return ((substr_count($idx,'.') <= 1) || (preg_match('/\.[A-Z]/',$idx) > 0));
296  }
297 
298 
299  public static function isValue($idx) {
300  return (substr_count($idx,'.') == 0);
301  }
302 
303 
304  public static function isCellValue($idx) {
305  return (substr_count($idx,'.') > 1);
306  }
307 
308 
309  public static function _ifCondition($condition) {
311  if (!in_array($condition{0},array('>', '<', '='))) {
312  if (!is_numeric($condition)) { $condition = PHPExcel_Calculation::_wrapResult(strtoupper($condition)); }
313  return '='.$condition;
314  } else {
315  preg_match('/([<>=]+)(.*)/',$condition,$matches);
316  list(,$operator,$operand) = $matches;
317  if (!is_numeric($operand)) { $operand = PHPExcel_Calculation::_wrapResult(strtoupper($operand)); }
318  return $operator.$operand;
319  }
320  } // function _ifCondition()
321 
322 
329  public static function ERROR_TYPE($value = '') {
330  $value = self::flattenSingleValue($value);
331 
332  $i = 1;
333  foreach(self::$_errorCodes as $errorCode) {
334  if ($value == $errorCode) {
335  return $i;
336  }
337  ++$i;
338  }
339  return self::$_errorCodes['na'];
340  } // function ERROR_TYPE()
341 
342 
349  public static function IS_BLANK($value=null) {
350  if (!is_null($value)) {
351  $value = self::flattenSingleValue($value);
352  }
353 
354  return is_null($value);
355  } // function IS_BLANK()
356 
357 
364  public static function IS_ERR($value = '') {
365  $value = self::flattenSingleValue($value);
366 
367  return self::IS_ERROR($value) && (!self::IS_NA($value));
368  } // function IS_ERR()
369 
370 
377  public static function IS_ERROR($value = '') {
378  $value = self::flattenSingleValue($value);
379 
380  return in_array($value, array_values(self::$_errorCodes));
381  } // function IS_ERROR()
382 
383 
390  public static function IS_NA($value = '') {
391  $value = self::flattenSingleValue($value);
392 
393  return ($value === self::$_errorCodes['na']);
394  } // function IS_NA()
395 
396 
403  public static function IS_EVEN($value = 0) {
404  $value = self::flattenSingleValue($value);
405 
406  if ((is_bool($value)) || ((is_string($value)) && (!is_numeric($value)))) {
407  return self::$_errorCodes['value'];
408  }
409  return ($value % 2 == 0);
410  } // function IS_EVEN()
411 
412 
419  public static function IS_ODD($value = null) {
420  $value = self::flattenSingleValue($value);
421 
422  if ((is_bool($value)) || ((is_string($value)) && (!is_numeric($value)))) {
423  return self::$_errorCodes['value'];
424  }
425  return (abs($value) % 2 == 1);
426  } // function IS_ODD()
427 
428 
435  public static function IS_NUMBER($value = 0) {
436  $value = self::flattenSingleValue($value);
437 
438  if (is_string($value)) {
439  return False;
440  }
441  return is_numeric($value);
442  } // function IS_NUMBER()
443 
444 
451  public static function IS_LOGICAL($value = true) {
452  $value = self::flattenSingleValue($value);
453 
454  return is_bool($value);
455  } // function IS_LOGICAL()
456 
457 
464  public static function IS_TEXT($value = '') {
465  $value = self::flattenSingleValue($value);
466 
467  return is_string($value);
468  } // function IS_TEXT()
469 
470 
477  public static function IS_NONTEXT($value = '') {
478  return !self::IS_TEXT($value);
479  } // function IS_NONTEXT()
480 
481 
487  public static function VERSION() {
488  return 'PHPExcel 1.7.6, 2011-02-27';
489  } // function VERSION()
490 
491 
507  public static function N($value) {
508  while (is_array($value)) {
509  $value = array_shift($value);
510  }
511 
512  switch (gettype($value)) {
513  case 'double' :
514  case 'float' :
515  case 'integer' :
516  return $value;
517  break;
518  case 'boolean' :
519  return (integer) $value;
520  break;
521  case 'string' :
522  // Errors
523  if ((strlen($value) > 0) && ($value{0} == '#')) {
524  return $value;
525  }
526  break;
527  }
528  return 0;
529  } // function N()
530 
531 
546  public static function TYPE($value) {
547  $value = self::flattenArrayIndexed($value);
548  if (is_array($value) && (count($value) > 1)) {
549  $a = array_keys($value);
550  $a = array_pop($a);
551  // Range of cells is an error
552  if (self::isCellValue($a)) {
553  return 16;
554  // Test for Matrix
555  } elseif (self::isMatrixValue($a)) {
556  return 64;
557  }
558  } elseif(count($value) == 0) {
559  // Empty Cell
560  return 1;
561  }
562  $value = self::flattenSingleValue($value);
563 
564  if ((is_float($value)) || (is_int($value))) {
565  return 1;
566  } elseif(is_bool($value)) {
567  return 4;
568  } elseif(is_array($value)) {
569  return 64;
570  break;
571  } elseif(is_string($value)) {
572  // Errors
573  if ((strlen($value) > 0) && ($value{0} == '#')) {
574  return 16;
575  }
576  return 2;
577  }
578  return 0;
579  } // function TYPE()
580 
581 
588  public static function flattenArray($array) {
589  if (!is_array($array)) {
590  return (array) $array;
591  }
592 
593  $arrayValues = array();
594  foreach ($array as $value) {
595  if (is_array($value)) {
596  foreach ($value as $val) {
597  if (is_array($val)) {
598  foreach ($val as $v) {
599  $arrayValues[] = $v;
600  }
601  } else {
602  $arrayValues[] = $val;
603  }
604  }
605  } else {
606  $arrayValues[] = $value;
607  }
608  }
609 
610  return $arrayValues;
611  } // function flattenArray()
612 
613 
620  public static function flattenArrayIndexed($array) {
621  if (!is_array($array)) {
622  return (array) $array;
623  }
624 
625  $arrayValues = array();
626  foreach ($array as $k1 => $value) {
627  if (is_array($value)) {
628  foreach ($value as $k2 => $val) {
629  if (is_array($val)) {
630  foreach ($val as $k3 => $v) {
631  $arrayValues[$k1.'.'.$k2.'.'.$k3] = $v;
632  }
633  } else {
634  $arrayValues[$k1.'.'.$k2] = $val;
635  }
636  }
637  } else {
638  $arrayValues[$k1] = $value;
639  }
640  }
641 
642  return $arrayValues;
643  } // function flattenArrayIndexed()
644 
645 
652  public static function flattenSingleValue($value = '') {
653  while (is_array($value)) {
654  $value = array_pop($value);
655  }
656 
657  return $value;
658  } // function flattenSingleValue()
659 
660 } // class PHPExcel_Calculation_Functions
661 
662 
663 //
664 // There are a few mathematical functions that aren't available on all versions of PHP for all platforms
665 // These functions aren't available in Windows implementations of PHP prior to version 5.3.0
666 // So we test if they do exist for this version of PHP/operating platform; and if not we create them
667 //
668 if (!function_exists('acosh')) {
669  function acosh($x) {
670  return 2 * log(sqrt(($x + 1) / 2) + sqrt(($x - 1) / 2));
671  } // function acosh()
672 }
673 
674 if (!function_exists('asinh')) {
675  function asinh($x) {
676  return log($x + sqrt(1 + $x * $x));
677  } // function asinh()
678 }
679 
680 if (!function_exists('atanh')) {
681  function atanh($x) {
682  return (log(1 + $x) - log(1 - $x)) / 2;
683  } // function atanh()
684 }
685 
686 if (!function_exists('money_format')) {
687  function money_format($format, $number) {
688  $regex = array( '/%((?:[\^!\-]|\+|\(|\=.)*)([0-9]+)?(?:#([0-9]+))?',
689  '(?:\.([0-9]+))?([in%])/'
690  );
691  $regex = implode('', $regex);
692  if (setlocale(LC_MONETARY, null) == '') {
693  setlocale(LC_MONETARY, '');
694  }
695  $locale = localeconv();
696  $number = floatval($number);
697  if (!preg_match($regex, $format, $fmatch)) {
698  trigger_error("No format specified or invalid format", E_USER_WARNING);
699  return $number;
700  }
701  $flags = array( 'fillchar' => preg_match('/\=(.)/', $fmatch[1], $match) ? $match[1] : ' ',
702  'nogroup' => preg_match('/\^/', $fmatch[1]) > 0,
703  'usesignal' => preg_match('/\+|\(/', $fmatch[1], $match) ? $match[0] : '+',
704  'nosimbol' => preg_match('/\!/', $fmatch[1]) > 0,
705  'isleft' => preg_match('/\-/', $fmatch[1]) > 0
706  );
707  $width = trim($fmatch[2]) ? (int)$fmatch[2] : 0;
708  $left = trim($fmatch[3]) ? (int)$fmatch[3] : 0;
709  $right = trim($fmatch[4]) ? (int)$fmatch[4] : $locale['int_frac_digits'];
710  $conversion = $fmatch[5];
711  $positive = true;
712  if ($number < 0) {
713  $positive = false;
714  $number *= -1;
715  }
716  $letter = $positive ? 'p' : 'n';
717  $prefix = $suffix = $cprefix = $csuffix = $signal = '';
718  if (!$positive) {
719  $signal = $locale['negative_sign'];
720  switch (true) {
721  case $locale['n_sign_posn'] == 0 || $flags['usesignal'] == '(':
722  $prefix = '(';
723  $suffix = ')';
724  break;
725  case $locale['n_sign_posn'] == 1:
726  $prefix = $signal;
727  break;
728  case $locale['n_sign_posn'] == 2:
729  $suffix = $signal;
730  break;
731  case $locale['n_sign_posn'] == 3:
732  $cprefix = $signal;
733  break;
734  case $locale['n_sign_posn'] == 4:
735  $csuffix = $signal;
736  break;
737  }
738  }
739  if (!$flags['nosimbol']) {
740  $currency = $cprefix;
741  $currency .= ($conversion == 'i' ? $locale['int_curr_symbol'] : $locale['currency_symbol']);
742  $currency .= $csuffix;
743  $currency = iconv('ISO-8859-1','UTF-8',$currency);
744  } else {
745  $currency = '';
746  }
747  $space = $locale["{$letter}_sep_by_space"] ? ' ' : '';
748 
749  $number = number_format($number, $right, $locale['mon_decimal_point'], $flags['nogroup'] ? '' : $locale['mon_thousands_sep'] );
750  $number = explode($locale['mon_decimal_point'], $number);
751 
752  $n = strlen($prefix) + strlen($currency);
753  if ($left > 0 && $left > $n) {
754  if ($flags['isleft']) {
755  $number[0] .= str_repeat($flags['fillchar'], $left - $n);
756  } else {
757  $number[0] = str_repeat($flags['fillchar'], $left - $n) . $number[0];
758  }
759  }
760  $number = implode($locale['mon_decimal_point'], $number);
761  if ($locale["{$letter}_cs_precedes"]) {
762  $number = $prefix . $currency . $space . $number . $suffix;
763  } else {
764  $number = $prefix . $number . $space . $currency . $suffix;
765  }
766  if ($width > 0) {
767  $number = str_pad($number, $width, $flags['fillchar'], $flags['isleft'] ? STR_PAD_RIGHT : STR_PAD_LEFT);
768  }
769  $format = str_replace($fmatch[0], $number, $format);
770  return $format;
771  } // function money_format()
772 }
773 
774 
775 //
776 // Strangely, PHP doesn't have a mb_str_replace multibyte function
777 // As we'll only ever use this function with UTF-8 characters, we can simply "hard-code" the character set
778 //
779 if ((!function_exists('mb_str_replace')) &&
780  (function_exists('mb_substr')) && (function_exists('mb_strlen')) && (function_exists('mb_strpos'))) {
781  function mb_str_replace($search, $replace, $subject) {
782  if(is_array($subject)) {
783  $ret = array();
784  foreach($subject as $key => $val) {
785  $ret[$key] = mb_str_replace($search, $replace, $val);
786  }
787  return $ret;
788  }
789 
790  foreach((array) $search as $key => $s) {
791  if($s == '') {
792  continue;
793  }
794  $r = !is_array($replace) ? $replace : (array_key_exists($key, $replace) ? $replace[$key] : '');
795  $pos = mb_strpos($subject, $s, 0, 'UTF-8');
796  while($pos !== false) {
797  $subject = mb_substr($subject, 0, $pos, 'UTF-8') . $r . mb_substr($subject, $pos + mb_strlen($s, 'UTF-8'), 65535, 'UTF-8');
798  $pos = mb_strpos($subject, $s, $pos + mb_strlen($r, 'UTF-8'), 'UTF-8');
799  }
800  }
801  return $subject;
802  }
803 }