summaryrefslogtreecommitdiffstats
path: root/admin/survey/excel/PHPExcel/Cell
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--admin/survey/excel/PHPExcel/Cell.php972
-rw-r--r--admin/survey/excel/PHPExcel/Cell/AdvancedValueBinder.php190
-rw-r--r--admin/survey/excel/PHPExcel/Cell/DataType.php114
-rw-r--r--admin/survey/excel/PHPExcel/Cell/DataValidation.php474
-rw-r--r--admin/survey/excel/PHPExcel/Cell/DefaultValueBinder.php106
-rw-r--r--admin/survey/excel/PHPExcel/Cell/Hyperlink.php127
-rw-r--r--admin/survey/excel/PHPExcel/Cell/IValueBinder.php46
7 files changed, 2029 insertions, 0 deletions
diff --git a/admin/survey/excel/PHPExcel/Cell.php b/admin/survey/excel/PHPExcel/Cell.php
new file mode 100644
index 0000000..d0f5231
--- /dev/null
+++ b/admin/survey/excel/PHPExcel/Cell.php
@@ -0,0 +1,972 @@
+<?php
+/**
+ * PHPExcel
+ *
+ * Copyright (c) 2006 - 2012 PHPExcel
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * @category PHPExcel
+ * @package PHPExcel_Cell
+ * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel)
+ * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL
+ * @version 1.7.8, 2012-10-12
+ */
+
+
+/**
+ * PHPExcel_Cell
+ *
+ * @category PHPExcel
+ * @package PHPExcel_Cell
+ * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel)
+ */
+class PHPExcel_Cell
+{
+
+ /**
+ * Default range variable constant
+ *
+ * @var string
+ */
+ const DEFAULT_RANGE = 'A1:A1';
+
+ /**
+ * Value binder to use
+ *
+ * @var PHPExcel_Cell_IValueBinder
+ */
+ private static $_valueBinder = NULL;
+
+ /**
+ * Column of the cell
+ *
+ * @var string
+ */
+ private $_column;
+
+ /**
+ * Row of the cell
+ *
+ * @var int
+ */
+ private $_row;
+
+ /**
+ * Value of the cell
+ *
+ * @var mixed
+ */
+ private $_value;
+
+ /**
+ * Calculated value of the cell (used for caching)
+ * This returns the value last calculated by MS Excel or whichever spreadsheet program was used to
+ * create the original spreadsheet file.
+ * Note that this value is not guaranteed to reflect the actual calculated value because it is
+ * possible that auto-calculation was disabled in the original spreadsheet, and underlying data
+ * values used by the formula have changed since it was last calculated.
+ *
+ * @var mixed
+ */
+ private $_calculatedValue = NULL;
+
+ /**
+ * Type of the cell data
+ *
+ * @var string
+ */
+ private $_dataType;
+
+ /**
+ * Parent worksheet
+ *
+ * @var PHPExcel_Worksheet
+ */
+ private $_parent;
+
+ /**
+ * Index to cellXf
+ *
+ * @var int
+ */
+ private $_xfIndex;
+
+ /**
+ * Attributes of the formula
+ *
+ */
+ private $_formulaAttributes;
+
+
+ /**
+ * Send notification to the cache controller
+ *
+ * @return void
+ **/
+ public function notifyCacheController() {
+ $this->_parent->getCellCacheController()->updateCacheData($this);
+ return $this;
+ }
+
+ public function detach() {
+ $this->_parent = NULL;
+ }
+
+ public function attach($parent) {
+ $this->_parent = $parent;
+ }
+
+
+ /**
+ * Create a new Cell
+ *
+ * @param string $pColumn
+ * @param int $pRow
+ * @param mixed $pValue
+ * @param string $pDataType
+ * @param PHPExcel_Worksheet $pSheet
+ * @throws PHPExcel_Exception
+ */
+ public function __construct($pColumn = 'A', $pRow = 1, $pValue = NULL, $pDataType = NULL, PHPExcel_Worksheet $pSheet = NULL)
+ {
+ // Initialise cell coordinate
+ $this->_column = strtoupper($pColumn);
+ $this->_row = $pRow;
+
+ // Initialise cell value
+ $this->_value = $pValue;
+
+ // Set worksheet
+ $this->_parent = $pSheet;
+
+ // Set datatype?
+ if ($pDataType !== NULL) {
+ if ($pDataType == PHPExcel_Cell_DataType::TYPE_STRING2)
+ $pDataType = PHPExcel_Cell_DataType::TYPE_STRING;
+ $this->_dataType = $pDataType;
+ } else {
+ if (!self::getValueBinder()->bindValue($this, $pValue)) {
+ throw new PHPExcel_Exception("Value could not be bound to cell.");
+ }
+ }
+
+ // set default index to cellXf
+ $this->_xfIndex = 0;
+ }
+
+ /**
+ * Get cell coordinate column
+ *
+ * @return string
+ */
+ public function getColumn()
+ {
+ return $this->_column;
+ }
+
+ /**
+ * Get cell coordinate row
+ *
+ * @return int
+ */
+ public function getRow()
+ {
+ return $this->_row;
+ }
+
+ /**
+ * Get cell coordinate
+ *
+ * @return string
+ */
+ public function getCoordinate()
+ {
+ return $this->_column . $this->_row;
+ }
+
+ /**
+ * Get cell value
+ *
+ * @return mixed
+ */
+ public function getValue()
+ {
+ return $this->_value;
+ }
+
+ /**
+ * Get cell value with formatting
+ *
+ * @return string
+ */
+ public function getFormattedValue()
+ {
+ return (string) PHPExcel_Style_NumberFormat::toFormattedString(
+ $this->getCalculatedValue(),
+ $this->_parent->getParent()->getCellXfByIndex($this->getXfIndex())
+ ->getNumberFormat()->getFormatCode()
+ );
+ }
+
+ /**
+ * Set cell value
+ *
+ * Sets the value for a cell, automatically determining the datatype using the value binder
+ *
+ * @param mixed $pValue Value
+ * @return PHPExcel_Cell
+ * @throws PHPExcel_Exception
+ */
+ public function setValue($pValue = NULL)
+ {
+ if (!self::getValueBinder()->bindValue($this, $pValue)) {
+ throw new PHPExcel_Exception("Value could not be bound to cell.");
+ }
+ return $this;
+ }
+
+ /**
+ * Set the value for a cell, with the explicit data type passed to the method (bypassing any use of the value binder)
+ *
+ * @param mixed $pValue Value
+ * @param string $pDataType Explicit data type
+ * @return PHPExcel_Cell
+ * @throws PHPExcel_Exception
+ */
+ public function setValueExplicit($pValue = NULL, $pDataType = PHPExcel_Cell_DataType::TYPE_STRING)
+ {
+ // set the value according to data type
+ switch ($pDataType) {
+ case PHPExcel_Cell_DataType::TYPE_STRING2:
+ $pDataType = PHPExcel_Cell_DataType::TYPE_STRING;
+ case PHPExcel_Cell_DataType::TYPE_STRING:
+ case PHPExcel_Cell_DataType::TYPE_NULL:
+ case PHPExcel_Cell_DataType::TYPE_INLINE:
+ $this->_value = PHPExcel_Cell_DataType::checkString($pValue);
+ break;
+ case PHPExcel_Cell_DataType::TYPE_NUMERIC:
+ $this->_value = (float)$pValue;
+ break;
+ case PHPExcel_Cell_DataType::TYPE_FORMULA:
+ $this->_value = (string)$pValue;
+ break;
+ case PHPExcel_Cell_DataType::TYPE_BOOL:
+ $this->_value = (bool)$pValue;
+ break;
+ case PHPExcel_Cell_DataType::TYPE_ERROR:
+ $this->_value = PHPExcel_Cell_DataType::checkErrorCode($pValue);
+ break;
+ default:
+ throw new PHPExcel_Exception('Invalid datatype: ' . $pDataType);
+ break;
+ }
+
+ // set the datatype
+ $this->_dataType = $pDataType;
+
+ return $this->notifyCacheController();
+ }
+
+ /**
+ * Get calculated cell value
+ *
+ * @deprecated Since version 1.7.8 for planned changes to cell for array formula handling
+ *
+ * @return mixed
+ * @throws PHPExcel_Exception
+ */
+ public function getCalculatedValue($resetLog = TRUE)
+ {
+// echo 'Cell '.$this->getCoordinate().' value is a '.$this->_dataType.' with a value of '.$this->getValue().'<br />';
+ if ($this->_dataType == PHPExcel_Cell_DataType::TYPE_FORMULA) {
+ try {
+// echo 'Cell value for '.$this->getCoordinate().' is a formula: Calculating value<br />';
+ $result = PHPExcel_Calculation::getInstance()->calculateCellValue($this,$resetLog);
+// echo $this->getCoordinate().' calculation result is '.$result.'<br />';
+ } catch ( Exception $ex ) {
+ if (($ex->getMessage() === 'Unable to access External Workbook') && ($this->_calculatedValue !== NULL)) {
+// echo 'Returning fallback value of '.$this->_calculatedValue.' for cell '.$this->getCoordinate().'<br />';
+ return $this->_calculatedValue; // Fallback for calculations referencing external files.
+ }
+// echo 'Calculation Exception: '.$ex->getMessage().'<br />';
+ $result = '#N/A';
+ throw(
+ new PHPExcel_Exception(
+ $this->getParent()->getTitle().'!'.$this->getCoordinate().' -> '.$ex->getMessage()
+ )
+ );
+ }
+
+ if ($result === '#Not Yet Implemented') {
+// echo 'Returning fallback value of '.$this->_calculatedValue.' for cell '.$this->getCoordinate().'<br />';
+ return $this->_calculatedValue; // Fallback if calculation engine does not support the formula.
+ }
+// echo 'Returning calculated value of '.$result.' for cell '.$this->getCoordinate().'<br />';
+ return $result;
+ }
+
+// if ($this->_value === NULL) {
+// echo 'Cell '.$this->getCoordinate().' has no value, formula or otherwise<br />';
+// return NULL;
+// }
+// echo 'Cell value for '.$this->getCoordinate().' is not a formula: Returning data value of '.$this->_value.'<br />';
+ return $this->_value;
+ }
+
+ /**
+ * Set old calculated value (cached)
+ *
+ * @param mixed $pValue Value
+ * @return PHPExcel_Cell
+ */
+ public function setCalculatedValue($pValue = NULL)
+ {
+ if ($pValue !== NULL) {
+ $this->_calculatedValue = (is_numeric($pValue)) ? (float) $pValue : $pValue;
+ }
+
+ return $this->notifyCacheController();
+ }
+
+ /**
+ * Get old calculated value (cached)
+ * This returns the value last calculated by MS Excel or whichever spreadsheet program was used to
+ * create the original spreadsheet file.
+ * Note that this value is not guaranteed to refelect the actual calculated value because it is
+ * possible that auto-calculation was disabled in the original spreadsheet, and underlying data
+ * values used by the formula have changed since it was last calculated.
+ *
+ * @return mixed
+ */
+ public function getOldCalculatedValue()
+ {
+ return $this->_calculatedValue;
+ }
+
+ /**
+ * Get cell data type
+ *
+ * @return string
+ */
+ public function getDataType()
+ {
+ return $this->_dataType;
+ }
+
+ /**
+ * Set cell data type
+ *
+ * @param string $pDataType
+ * @return PHPExcel_Cell
+ */
+ public function setDataType($pDataType = PHPExcel_Cell_DataType::TYPE_STRING)
+ {
+ if ($pDataType == PHPExcel_Cell_DataType::TYPE_STRING2)
+ $pDataType = PHPExcel_Cell_DataType::TYPE_STRING;
+
+ $this->_dataType = $pDataType;
+
+ return $this->notifyCacheController();
+ }
+
+ /**
+ * Does this cell contain Data validation rules?
+ *
+ * @return boolean
+ * @throws PHPExcel_Exception
+ */
+ public function hasDataValidation()
+ {
+ if (!isset($this->_parent)) {
+ throw new PHPExcel_Exception('Cannot check for data validation when cell is not bound to a worksheet');
+ }
+
+ return $this->_parent->dataValidationExists($this->getCoordinate());
+ }
+
+ /**
+ * Get Data validation rules
+ *
+ * @return PHPExcel_Cell_DataValidation
+ * @throws PHPExcel_Exception
+ */
+ public function getDataValidation()
+ {
+ if (!isset($this->_parent)) {
+ throw new PHPExcel_Exception('Cannot get data validation for cell that is not bound to a worksheet');
+ }
+
+ return $this->_parent->getDataValidation($this->getCoordinate());
+ }
+
+ /**
+ * Set Data validation rules
+ *
+ * @param PHPExcel_Cell_DataValidation $pDataValidation
+ * @return PHPExcel_Cell
+ * @throws PHPExcel_Exception
+ */
+ public function setDataValidation(PHPExcel_Cell_DataValidation $pDataValidation = NULL)
+ {
+ if (!isset($this->_parent)) {
+ throw new PHPExcel_Exception('Cannot set data validation for cell that is not bound to a worksheet');
+ }
+
+ $this->_parent->setDataValidation($this->getCoordinate(), $pDataValidation);
+
+ return $this->notifyCacheController();
+ }
+
+ /**
+ * Does this cell contain a Hyperlink?
+ *
+ * @return boolean
+ * @throws PHPExcel_Exception
+ */
+ public function hasHyperlink()
+ {
+ if (!isset($this->_parent)) {
+ throw new PHPExcel_Exception('Cannot check for hyperlink when cell is not bound to a worksheet');
+ }
+
+ return $this->_parent->hyperlinkExists($this->getCoordinate());
+ }
+
+ /**
+ * Get Hyperlink
+ *
+ * @return PHPExcel_Cell_Hyperlink
+ * @throws PHPExcel_Exception
+ */
+ public function getHyperlink()
+ {
+ if (!isset($this->_parent)) {
+ throw new PHPExcel_Exception('Cannot get hyperlink for cell that is not bound to a worksheet');
+ }
+
+ return $this->_parent->getHyperlink($this->getCoordinate());
+ }
+
+ /**
+ * Set Hyperlink
+ *
+ * @param PHPExcel_Cell_Hyperlink $pHyperlink
+ * @return PHPExcel_Cell
+ * @throws PHPExcel_Exception
+ */
+ public function setHyperlink(PHPExcel_Cell_Hyperlink $pHyperlink = NULL)
+ {
+ if (!isset($this->_parent)) {
+ throw new PHPExcel_Exception('Cannot set hyperlink for cell that is not bound to a worksheet');
+ }
+
+ $this->_parent->setHyperlink($this->getCoordinate(), $pHyperlink);
+
+ return $this->notifyCacheController();
+ }
+
+ /**
+ * Get parent worksheet
+ *
+ * @return PHPExcel_Worksheet
+ */
+ public function getParent() {
+ return $this->_parent;
+ }
+
+ /**
+ * Re-bind parent
+ *
+ * @param PHPExcel_Worksheet $parent
+ * @return PHPExcel_Cell
+ */
+ public function rebindParent(PHPExcel_Worksheet $parent) {
+ $this->_parent = $parent;
+
+ return $this->notifyCacheController();
+ }
+
+ /**
+ * Is cell in a specific range?
+ *
+ * @param string $pRange Cell range (e.g. A1:A1)
+ * @return boolean
+ */
+ public function isInRange($pRange = 'A1:A1')
+ {
+ list($rangeStart,$rangeEnd) = self::rangeBoundaries($pRange);
+
+ // Translate properties
+ $myColumn = self::columnIndexFromString($this->getColumn());
+ $myRow = $this->getRow();
+
+ // Verify if cell is in range
+ return (($rangeStart[0] <= $myColumn) && ($rangeEnd[0] >= $myColumn) &&
+ ($rangeStart[1] <= $myRow) && ($rangeEnd[1] >= $myRow)
+ );
+ }
+
+ /**
+ * Coordinate from string
+ *
+ * @param string $pCoordinateString
+ * @return array Array containing column and row (indexes 0 and 1)
+ * @throws PHPExcel_Exception
+ */
+ public static function coordinateFromString($pCoordinateString = 'A1')
+ {
+ if (preg_match("/^([$]?[A-Z]{1,3})([$]?\d{1,7})$/", $pCoordinateString, $matches)) {
+ return array($matches[1],$matches[2]);
+ } elseif ((strpos($pCoordinateString,':') !== FALSE) || (strpos($pCoordinateString,',') !== FALSE)) {
+ throw new PHPExcel_Exception('Cell coordinate string can not be a range of cells');
+ } elseif ($pCoordinateString == '') {
+ throw new PHPExcel_Exception('Cell coordinate can not be zero-length string');
+ }
+
+ throw new PHPExcel_Exception('Invalid cell coordinate '.$pCoordinateString);
+ }
+
+ /**
+ * Make string row, column or cell coordinate absolute
+ *
+ * @param string $pCoordinateString e.g. 'A' or '1' or 'A1'
+ * Note that this value can be a row or column reference as well as a cell reference
+ * @return string Absolute coordinate e.g. '$A' or '$1' or '$A$1'
+ * @throws PHPExcel_Exception
+ */
+ public static function absoluteReference($pCoordinateString = 'A1')
+ {
+ if (strpos($pCoordinateString,':') === FALSE && strpos($pCoordinateString,',') === FALSE) {
+ // Split out any worksheet name from the reference
+ $worksheet = '';
+ $cellAddress = explode('!',$pCoordinateString);
+ if (count($cellAddress) > 1) {
+ list($worksheet,$pCoordinateString) = $cellAddress;
+ }
+ if ($worksheet > '') $worksheet .= '!';
+
+ // Create absolute coordinate
+ if (ctype_digit($pCoordinateString)) {
+ return $worksheet . '$' . $pCoordinateString;
+ } elseif (ctype_alpha($pCoordinateString)) {
+ return $worksheet . '$' . strtoupper($pCoordinateString);
+ }
+ return $worksheet . self::absoluteCoordinate($pCoordinateString);
+ }
+
+ throw new PHPExcel_Exception('Cell coordinate string can not be a range of cells');
+ }
+
+ /**
+ * Make string coordinate absolute
+ *
+ * @param string $pCoordinateString e.g. 'A1'
+ * @return string Absolute coordinate e.g. '$A$1'
+ * @throws PHPExcel_Exception
+ */
+ public static function absoluteCoordinate($pCoordinateString = 'A1')
+ {
+ if (strpos($pCoordinateString,':') === FALSE && strpos($pCoordinateString,',') === FALSE) {
+ // Split out any worksheet name from the coordinate
+ $worksheet = '';
+ $cellAddress = explode('!',$pCoordinateString);
+ if (count($cellAddress) > 1) {
+ list($worksheet,$pCoordinateString) = $cellAddress;
+ }
+ if ($worksheet > '') $worksheet .= '!';
+
+ // Create absolute coordinate
+ list($column, $row) = self::coordinateFromString($pCoordinateString);
+ $column = ltrim($column,'$');
+ $row = ltrim($row,'$');
+ return $worksheet . '$' . $column . '$' . $row;
+ }
+
+ throw new PHPExcel_Exception('Cell coordinate string can not be a range of cells');
+ }
+
+ /**
+ * Split range into coordinate strings
+ *
+ * @param string $pRange e.g. 'B4:D9' or 'B4:D9,H2:O11' or 'B4'
+ * @return array Array containg one or more arrays containing one or two coordinate strings
+ * e.g. array('B4','D9') or array(array('B4','D9'),array('H2','O11'))
+ * or array('B4')
+ */
+ public static function splitRange($pRange = 'A1:A1')
+ {
+ // Ensure $pRange is a valid range
+ if(empty($pRange)) {
+ $pRange = self::DEFAULT_RANGE;
+ }
+
+ $exploded = explode(',', $pRange);
+ $counter = count($exploded);
+ for ($i = 0; $i < $counter; ++$i) {
+ $exploded[$i] = explode(':', $exploded[$i]);
+ }
+ return $exploded;
+ }
+
+ /**
+ * Build range from coordinate strings
+ *
+ * @param array $pRange Array containg one or more arrays containing one or two coordinate strings
+ * @return string String representation of $pRange
+ * @throws PHPExcel_Exception
+ */
+ public static function buildRange($pRange)
+ {
+ // Verify range
+ if (!is_array($pRange) || empty($pRange) || !is_array($pRange[0])) {
+ throw new PHPExcel_Exception('Range does not contain any information');
+ }
+
+ // Build range
+ $imploded = array();
+ $counter = count($pRange);
+ for ($i = 0; $i < $counter; ++$i) {
+ $pRange[$i] = implode(':', $pRange[$i]);
+ }
+ $imploded = implode(',', $pRange);
+
+ return $imploded;
+ }
+
+ /**
+ * Calculate range boundaries
+ *
+ * @param string $pRange Cell range (e.g. A1:A1)
+ * @return array Range coordinates array(Start Cell, End Cell)
+ * where Start Cell and End Cell are arrays (Column Number, Row Number)
+ */
+ public static function rangeBoundaries($pRange = 'A1:A1')
+ {
+ // Ensure $pRange is a valid range
+ if(empty($pRange)) {
+ $pRange = self::DEFAULT_RANGE;
+ }
+
+ // Uppercase coordinate
+ $pRange = strtoupper($pRange);
+
+ // Extract range
+ if (strpos($pRange, ':') === FALSE) {
+ $rangeA = $rangeB = $pRange;
+ } else {
+ list($rangeA, $rangeB) = explode(':', $pRange);
+ }
+
+ // Calculate range outer borders
+ $rangeStart = self::coordinateFromString($rangeA);
+ $rangeEnd = self::coordinateFromString($rangeB);
+
+ // Translate column into index
+ $rangeStart[0] = self::columnIndexFromString($rangeStart[0]);
+ $rangeEnd[0] = self::columnIndexFromString($rangeEnd[0]);
+
+ return array($rangeStart, $rangeEnd);
+ }
+
+ /**
+ * Calculate range dimension
+ *
+ * @param string $pRange Cell range (e.g. A1:A1)
+ * @return array Range dimension (width, height)
+ */
+ public static function rangeDimension($pRange = 'A1:A1')
+ {
+ // Calculate range outer borders
+ list($rangeStart,$rangeEnd) = self::rangeBoundaries($pRange);
+
+ return array( ($rangeEnd[0] - $rangeStart[0] + 1), ($rangeEnd[1] - $rangeStart[1] + 1) );
+ }
+
+ /**
+ * Calculate range boundaries
+ *
+ * @param string $pRange Cell range (e.g. A1:A1)
+ * @return array Range coordinates array(Start Cell, End Cell)
+ * where Start Cell and End Cell are arrays (Column ID, Row Number)
+ */
+ public static function getRangeBoundaries($pRange = 'A1:A1')
+ {
+ // Ensure $pRange is a valid range
+ if(empty($pRange)) {
+ $pRange = self::DEFAULT_RANGE;
+ }
+
+ // Uppercase coordinate
+ $pRange = strtoupper($pRange);
+
+ // Extract range
+ if (strpos($pRange, ':') === FALSE) {
+ $rangeA = $rangeB = $pRange;
+ } else {
+ list($rangeA, $rangeB) = explode(':', $pRange);
+ }
+
+ return array( self::coordinateFromString($rangeA), self::coordinateFromString($rangeB));
+ }
+
+ /**
+ * Column index from string
+ *
+ * @param string $pString
+ * @return int Column index (base 1 !!!)
+ * @throws Exception
+ */
+ public static function columnIndexFromString($pString = 'A')
+ {
+ // Using a lookup cache adds a slight memory overhead, but boosts speed
+ // caching using a static within the method is faster than a class static,
+ // though it's additional memory overhead
+ static $_indexCache = array();
+
+ if (isset($_indexCache[$pString]))
+ return $_indexCache[$pString];
+
+ // It's surprising how costly the strtoupper() and ord() calls actually are, so we use a lookup array rather than use ord()
+ // and make it case insensitive to get rid of the strtoupper() as well. Because it's a static, there's no significant
+ // memory overhead either
+ static $_columnLookup = array(
+ 'A' => 1, 'B' => 2, 'C' => 3, 'D' => 4, 'E' => 5, 'F' => 6, 'G' => 7, 'H' => 8, 'I' => 9, 'J' => 10, 'K' => 11, 'L' => 12, 'M' => 13,
+ 'N' => 14, 'O' => 15, 'P' => 16, 'Q' => 17, 'R' => 18, 'S' => 19, 'T' => 20, 'U' => 21, 'V' => 22, 'W' => 23, 'X' => 24, 'Y' => 25, 'Z' => 26,
+ 'a' => 1, 'b' => 2, 'c' => 3, 'd' => 4, 'e' => 5, 'f' => 6, 'g' => 7, 'h' => 8, 'i' => 9, 'j' => 10, 'k' => 11, 'l' => 12, 'm' => 13,
+ 'n' => 14, 'o' => 15, 'p' => 16, 'q' => 17, 'r' => 18, 's' => 19, 't' => 20, 'u' => 21, 'v' => 22, 'w' => 23, 'x' => 24, 'y' => 25, 'z' => 26
+ );
+
+ // We also use the language construct isset() rather than the more costly strlen() function to match the length of $pString
+ // for improved performance
+ if (isset($pString{0})) {
+ if (!isset($pString{1})) {
+ $_indexCache[$pString] = $_columnLookup[$pString];
+ return $_indexCache[$pString];
+ } elseif(!isset($pString{2})) {
+ $_indexCache[$pString] = $_columnLookup[$pString{0}] * 26 + $_columnLookup[$pString{1}];
+ return $_indexCache[$pString];
+ } elseif(!isset($pString{3})) {
+ $_indexCache[$pString] = $_columnLookup[$pString{0}] * 676 + $_columnLookup[$pString{1}] * 26 + $_columnLookup[$pString{2}];
+ return $_indexCache[$pString];
+ }
+ }
+ throw new PHPExcel_Exception("Column string index can not be " . ((isset($pString{0})) ? "longer than 3 characters" : "empty"));
+ }
+
+ /**
+ * String from columnindex
+ *
+ * @param int $pColumnIndex Column index (base 0 !!!)
+ * @return string
+ */
+ public static function stringFromColumnIndex($pColumnIndex = 0)
+ {
+ // Using a lookup cache adds a slight memory overhead, but boosts speed
+ // caching using a static within the method is faster than a class static,
+ // though it's additional memory overhead
+ static $_indexCache = array();
+
+ if (!isset($_indexCache[$pColumnIndex])) {
+ // Determine column string
+ if ($pColumnIndex < 26) {
+ $_indexCache[$pColumnIndex] = chr(65 + $pColumnIndex);
+ } elseif ($pColumnIndex < 702) {
+ $_indexCache[$pColumnIndex] = chr(64 + ($pColumnIndex / 26)) .
+ chr(65 + $pColumnIndex % 26);
+ } else {
+ $_indexCache[$pColumnIndex] = chr(64 + (($pColumnIndex - 26) / 676)) .
+ chr(65 + ((($pColumnIndex - 26) % 676) / 26)) .
+ chr(65 + $pColumnIndex % 26);
+ }
+ }
+ return $_indexCache[$pColumnIndex];
+ }
+
+ /**
+ * Extract all cell references in range
+ *
+ * @param string $pRange Range (e.g. A1 or A1:C10 or A1:E10 A20:E25)
+ * @return array Array containing single cell references
+ */
+ public static function extractAllCellReferencesInRange($pRange = 'A1') {
+ // Returnvalue
+ $returnValue = array();
+
+ // Explode spaces
+ $cellBlocks = explode(' ', str_replace('$', '', strtoupper($pRange)));
+ foreach ($cellBlocks as $cellBlock) {
+ // Single cell?
+ if (strpos($cellBlock,':') === FALSE && strpos($cellBlock,',') === FALSE) {
+ $returnValue[] = $cellBlock;
+ continue;
+ }
+
+ // Range...
+ $ranges = self::splitRange($cellBlock);
+ foreach($ranges as $range) {
+ // Single cell?
+ if (!isset($range[1])) {
+ $returnValue[] = $range[0];
+ continue;
+ }
+
+ // Range...
+ list($rangeStart, $rangeEnd) = $range;
+ list($startCol, $startRow) = sscanf($rangeStart,'%[A-Z]%d');
+ list($endCol, $endRow) = sscanf($rangeEnd,'%[A-Z]%d');
+ $endCol++;
+
+ // Current data
+ $currentCol = $startCol;
+ $currentRow = $startRow;
+
+ // Loop cells
+ while ($currentCol != $endCol) {
+ while ($currentRow <= $endRow) {
+ $returnValue[] = $currentCol.$currentRow;
+ ++$currentRow;
+ }
+ ++$currentCol;
+ $currentRow = $startRow;
+ }
+ }
+ }
+
+ // Sort the result by column and row
+ $sortKeys = array();
+ foreach (array_unique($returnValue) as $coord) {
+ list($column,$row) = sscanf($coord,'%[A-Z]%d');
+ $sortKeys[sprintf('%3s%09d',$column,$row)] = $coord;
+ }
+ ksort($sortKeys);
+
+ // Return value
+ return array_values($sortKeys);
+ }
+
+ /**
+ * Compare 2 cells
+ *
+ * @param PHPExcel_Cell $a Cell a
+ * @param PHPExcel_Cell $a Cell b
+ * @return int Result of comparison (always -1 or 1, never zero!)
+ */
+ public static function compareCells(PHPExcel_Cell $a, PHPExcel_Cell $b)
+ {
+ if ($a->_row < $b->_row) {
+ return -1;
+ } elseif ($a->_row > $b->_row) {
+ return 1;
+ } elseif (self::columnIndexFromString($a->_column) < self::columnIndexFromString($b->_column)) {
+ return -1;
+ } else {
+ return 1;
+ }
+ }
+
+ /**
+ * Get value binder to use
+ *
+ * @return PHPExcel_Cell_IValueBinder
+ */
+ public static function getValueBinder() {
+ if (self::$_valueBinder === NULL) {
+ self::$_valueBinder = new PHPExcel_Cell_DefaultValueBinder();
+ }
+
+ return self::$_valueBinder;
+ }
+
+ /**
+ * Set value binder to use
+ *
+ * @param PHPExcel_Cell_IValueBinder $binder
+ * @throws Exception
+ */
+ public static function setValueBinder(PHPExcel_Cell_IValueBinder $binder = NULL) {
+ if ($binder === NULL) {
+ throw new Exception("A PHPExcel_Cell_IValueBinder is required for PHPExcel to function correctly.");
+ }
+
+ self::$_valueBinder = $binder;
+ }
+
+ /**
+ * Implement PHP __clone to create a deep clone, not just a shallow copy.
+ */
+ public function __clone() {
+ $vars = get_object_vars($this);
+ foreach ($vars as $key => $value) {
+ if ((is_object($value)) && ($key != '_parent')) {
+ $this->$key = clone $value;
+ } else {
+ $this->$key = $value;
+ }
+ }
+ }
+
+ /**
+ * Get index to cellXf
+ *
+ * @return int
+ */
+ public function getXfIndex()
+ {
+ return $this->_xfIndex;
+ }
+
+ /**
+ * Set index to cellXf
+ *
+ * @param int $pValue
+ * @return PHPExcel_Cell
+ */
+ public function setXfIndex($pValue = 0)
+ {
+ $this->_xfIndex = $pValue;
+
+ return $this->notifyCacheController();
+ }
+
+ /**
+ * @deprecated Since version 1.7.8 for planned changes to cell for array formula handling
+ */
+ public function setFormulaAttributes($pAttributes)
+ {
+ $this->_formulaAttributes = $pAttributes;
+ return $this;
+ }
+
+ /**
+ * @deprecated Since version 1.7.8 for planned changes to cell for array formula handling
+ */
+ public function getFormulaAttributes()
+ {
+ return $this->_formulaAttributes;
+ }
+
+ /**
+ * Convert to string
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return (string) $this->getValue();
+ }
+
+}
+
diff --git a/admin/survey/excel/PHPExcel/Cell/AdvancedValueBinder.php b/admin/survey/excel/PHPExcel/Cell/AdvancedValueBinder.php
new file mode 100644
index 0000000..021d0a7
--- /dev/null
+++ b/admin/survey/excel/PHPExcel/Cell/AdvancedValueBinder.php
@@ -0,0 +1,190 @@
+<?php
+/**
+ * PHPExcel
+ *
+ * Copyright (c) 2006 - 2012 PHPExcel
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * @category PHPExcel
+ * @package PHPExcel_Cell
+ * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel)
+ * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL
+ * @version 1.7.8, 2012-10-12
+ */
+
+
+/** PHPExcel root directory */
+if (!defined('PHPEXCEL_ROOT')) {
+ /**
+ * @ignore
+ */
+ define('PHPEXCEL_ROOT', dirname(__FILE__) . '/../../');
+ require(PHPEXCEL_ROOT . 'PHPExcel/Autoloader.php');
+}
+
+
+/**
+ * PHPExcel_Cell_AdvancedValueBinder
+ *
+ * @category PHPExcel
+ * @package PHPExcel_Cell
+ * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel)
+ */
+class PHPExcel_Cell_AdvancedValueBinder extends PHPExcel_Cell_DefaultValueBinder implements PHPExcel_Cell_IValueBinder
+{
+ /**
+ * Bind value to a cell
+ *
+ * @param PHPExcel_Cell $cell Cell to bind value to
+ * @param mixed $value Value to bind in cell
+ * @return boolean
+ */
+ public function bindValue(PHPExcel_Cell $cell, $value = null)
+ {
+ // sanitize UTF-8 strings
+ if (is_string($value)) {
+ $value = PHPExcel_Shared_String::SanitizeUTF8($value);
+ }
+
+ // Find out data type
+ $dataType = parent::dataTypeForValue($value);
+
+ // Style logic - strings
+ if ($dataType === PHPExcel_Cell_DataType::TYPE_STRING && !$value instanceof PHPExcel_RichText) {
+ // Test for booleans using locale-setting
+ if ($value == PHPExcel_Calculation::getTRUE()) {
+ $cell->setValueExplicit( TRUE, PHPExcel_Cell_DataType::TYPE_BOOL);
+ return true;
+ } elseif($value == PHPExcel_Calculation::getFALSE()) {
+ $cell->setValueExplicit( FALSE, PHPExcel_Cell_DataType::TYPE_BOOL);
+ return true;
+ }
+
+ // Check for number in scientific format
+ if (preg_match('/^'.PHPExcel_Calculation::CALCULATION_REGEXP_NUMBER.'$/', $value)) {
+ $cell->setValueExplicit( (float) $value, PHPExcel_Cell_DataType::TYPE_NUMERIC);
+ return true;
+ }
+
+ // Check for fraction
+ if (preg_match('/^([+-]?) *([0-9]*)\s?\/\s*([0-9]*)$/', $value, $matches)) {
+ // Convert value to number
+ $value = $matches[2] / $matches[3];
+ if ($matches[1] == '-') $value = 0 - $value;
+ $cell->setValueExplicit( (float) $value, PHPExcel_Cell_DataType::TYPE_NUMERIC);
+ // Set style
+ $cell->getParent()->getStyle( $cell->getCoordinate() )
+ ->getNumberFormat()->setFormatCode( '??/??' );
+ return true;
+ } elseif (preg_match('/^([+-]?)([0-9]*) +([0-9]*)\s?\/\s*([0-9]*)$/', $value, $matches)) {
+ // Convert value to number
+ $value = $matches[2] + ($matches[3] / $matches[4]);
+ if ($matches[1] == '-') $value = 0 - $value;
+ $cell->setValueExplicit( (float) $value, PHPExcel_Cell_DataType::TYPE_NUMERIC);
+ // Set style
+ $cell->getParent()->getStyle( $cell->getCoordinate() )
+ ->getNumberFormat()->setFormatCode( '# ??/??' );
+ return true;
+ }
+
+ // Check for percentage
+ if (preg_match('/^\-?[0-9]*\.?[0-9]*\s?\%$/', $value)) {
+ // Convert value to number
+ $value = (float) str_replace('%', '', $value) / 100;
+ $cell->setValueExplicit( $value, PHPExcel_Cell_DataType::TYPE_NUMERIC);
+ // Set style
+ $cell->getParent()->getStyle( $cell->getCoordinate() )
+ ->getNumberFormat()->setFormatCode( PHPExcel_Style_NumberFormat::FORMAT_PERCENTAGE_00 );
+ return true;
+ }
+
+ // Check for currency
+ $currencyCode = PHPExcel_Shared_String::getCurrencyCode();
+ if (preg_match('/^'.preg_quote($currencyCode).' *(\d{1,3}(\,\d{3})*|(\d+))(\.\d{2})?$/', $value)) {
+ // Convert value to number
+ $value = (float) trim(str_replace(array($currencyCode,','), '', $value));
+ $cell->setValueExplicit( $value, PHPExcel_Cell_DataType::TYPE_NUMERIC);
+ // Set style
+ $cell->getParent()->getStyle( $cell->getCoordinate() )
+ ->getNumberFormat()->setFormatCode(
+ str_replace('$', $currencyCode, PHPExcel_Style_NumberFormat::FORMAT_CURRENCY_USD_SIMPLE )
+ );
+ return true;
+ } elseif (preg_match('/^\$ *(\d{1,3}(\,\d{3})*|(\d+))(\.\d{2})?$/', $value)) {
+ // Convert value to number
+ $value = (float) trim(str_replace(array('$',','), '', $value));
+ $cell->setValueExplicit( $value, PHPExcel_Cell_DataType::TYPE_NUMERIC);
+ // Set style
+ $cell->getParent()->getStyle( $cell->getCoordinate() )
+ ->getNumberFormat()->setFormatCode( PHPExcel_Style_NumberFormat::FORMAT_CURRENCY_USD_SIMPLE );
+ return true;
+ }
+
+ // Check for time without seconds e.g. '9:45', '09:45'
+ if (preg_match('/^(\d|[0-1]\d|2[0-3]):[0-5]\d$/', $value)) {
+ // Convert value to number
+ list($h, $m) = explode(':', $value);
+ $days = $h / 24 + $m / 1440;
+ $cell->setValueExplicit($days, PHPExcel_Cell_DataType::TYPE_NUMERIC);
+ // Set style
+ $cell->getParent()->getStyle( $cell->getCoordinate() )
+ ->getNumberFormat()->setFormatCode( PHPExcel_Style_NumberFormat::FORMAT_DATE_TIME3 );
+ return true;
+ }
+
+ // Check for time with seconds '9:45:59', '09:45:59'
+ if (preg_match('/^(\d|[0-1]\d|2[0-3]):[0-5]\d:[0-5]\d$/', $value)) {
+ // Convert value to number
+ list($h, $m, $s) = explode(':', $value);
+ $days = $h / 24 + $m / 1440 + $s / 86400;
+ // Convert value to number
+ $cell->setValueExplicit($days, PHPExcel_Cell_DataType::TYPE_NUMERIC);
+ // Set style
+ $cell->getParent()->getStyle( $cell->getCoordinate() )
+ ->getNumberFormat()->setFormatCode( PHPExcel_Style_NumberFormat::FORMAT_DATE_TIME4 );
+ return true;
+ }
+
+ // Check for datetime, e.g. '2008-12-31', '2008-12-31 15:59', '2008-12-31 15:59:10'
+ if (($d = PHPExcel_Shared_Date::stringToExcel($value)) !== false) {
+ // Convert value to number
+ $cell->setValueExplicit($d, PHPExcel_Cell_DataType::TYPE_NUMERIC);
+ // Determine style. Either there is a time part or not. Look for ':'
+ if (strpos($value, ':') !== false) {
+ $formatCode = 'yyyy-mm-dd h:mm';
+ } else {
+ $formatCode = 'yyyy-mm-dd';
+ }
+ $cell->getParent()->getStyle( $cell->getCoordinate() )
+ ->getNumberFormat()->setFormatCode($formatCode);
+ return true;
+ }
+
+ // Check for newline character "\n"
+ if (strpos($value, "\n") !== FALSE) {
+ $value = PHPExcel_Shared_String::SanitizeUTF8($value);
+ $cell->setValueExplicit($value, PHPExcel_Cell_DataType::TYPE_STRING);
+ // Set style
+ $cell->getParent()->getStyle( $cell->getCoordinate() )
+ ->getAlignment()->setWrapText(TRUE);
+ return true;
+ }
+ }
+
+ // Not bound yet? Use parent...
+ return parent::bindValue($cell, $value);
+ }
+}
diff --git a/admin/survey/excel/PHPExcel/Cell/DataType.php b/admin/survey/excel/PHPExcel/Cell/DataType.php
new file mode 100644
index 0000000..5466851
--- /dev/null
+++ b/admin/survey/excel/PHPExcel/Cell/DataType.php
@@ -0,0 +1,114 @@
+<?php
+/**
+ * PHPExcel
+ *
+ * Copyright (c) 2006 - 2012 PHPExcel
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * @category PHPExcel
+ * @package PHPExcel_Cell
+ * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel)
+ * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL
+ * @version 1.7.8, 2012-10-12
+ */
+
+
+/**
+ * PHPExcel_Cell_DataType
+ *
+ * @category PHPExcel
+ * @package PHPExcel_Cell
+ * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel)
+ */
+class PHPExcel_Cell_DataType
+{
+ /* Data types */
+ const TYPE_STRING2 = 'str';
+ const TYPE_STRING = 's';
+ const TYPE_FORMULA = 'f';
+ const TYPE_NUMERIC = 'n';
+ const TYPE_BOOL = 'b';
+ const TYPE_NULL = 'null';
+ const TYPE_INLINE = 'inlineStr';
+ const TYPE_ERROR = 'e';
+
+ /**
+ * List of error codes
+ *
+ * @var array
+ */
+ private static $_errorCodes = array('#NULL!' => 0, '#DIV/0!' => 1, '#VALUE!' => 2, '#REF!' => 3, '#NAME?' => 4, '#NUM!' => 5, '#N/A' => 6);
+
+ /**
+ * Get list of error codes
+ *
+ * @return array
+ */
+ public static function getErrorCodes() {
+ return self::$_errorCodes;
+ }
+
+ /**
+ * DataType for value
+ *
+ * @deprecated Replaced by PHPExcel_Cell_IValueBinder infrastructure
+ * @param mixed $pValue
+ * @return int
+ */
+ public static function dataTypeForValue($pValue = null) {
+ return PHPExcel_Cell_DefaultValueBinder::dataTypeForValue($pValue);
+ }
+
+ /**
+ * Check a string that it satisfies Excel requirements
+ *
+ * @param mixed Value to sanitize to an Excel string
+ * @return mixed Sanitized value
+ */
+ public static function checkString($pValue = null)
+ {
+ if ($pValue instanceof PHPExcel_RichText) {
+ // TODO: Sanitize Rich-Text string (max. character count is 32,767)
+ return $pValue;
+ }
+
+ // string must never be longer than 32,767 characters, truncate if necessary
+ $pValue = PHPExcel_Shared_String::Substring($pValue, 0, 32767);
+
+ // we require that newline is represented as "\n" in core, not as "\r\n" or "\r"
+ $pValue = str_replace(array("\r\n", "\r"), "\n", $pValue);
+
+ return $pValue;
+ }
+
+ /**
+ * Check a value that it is a valid error code
+ *
+ * @param mixed Value to sanitize to an Excel error code
+ * @return string Sanitized value
+ */
+ public static function checkErrorCode($pValue = null)
+ {
+ $pValue = (string)$pValue;
+
+ if ( !array_key_exists($pValue, self::$_errorCodes) ) {
+ $pValue = '#NULL!';
+ }
+
+ return $pValue;
+ }
+
+}
diff --git a/admin/survey/excel/PHPExcel/Cell/DataValidation.php b/admin/survey/excel/PHPExcel/Cell/DataValidation.php
new file mode 100644
index 0000000..603a8b7
--- /dev/null
+++ b/admin/survey/excel/PHPExcel/Cell/DataValidation.php
@@ -0,0 +1,474 @@
+<?php
+/**
+ * PHPExcel
+ *
+ * Copyright (c) 2006 - 2012 PHPExcel
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * @category PHPExcel
+ * @package PHPExcel_Cell
+ * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel)
+ * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL
+ * @version 1.7.8, 2012-10-12
+ */
+
+
+/**
+ * PHPExcel_Cell_DataValidation
+ *
+ * @category PHPExcel
+ * @package PHPExcel_Cell
+ * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel)
+ */
+class PHPExcel_Cell_DataValidation
+{
+ /* Data validation types */
+ const TYPE_NONE = 'none';
+ const TYPE_CUSTOM = 'custom';
+ const TYPE_DATE = 'date';
+ const TYPE_DECIMAL = 'decimal';
+ const TYPE_LIST = 'list';
+ const TYPE_TEXTLENGTH = 'textLength';
+ const TYPE_TIME = 'time';
+ const TYPE_WHOLE = 'whole';
+
+ /* Data validation error styles */
+ const STYLE_STOP = 'stop';
+ const STYLE_WARNING = 'warning';
+ const STYLE_INFORMATION = 'information';
+
+ /* Data validation operators */
+ const OPERATOR_BETWEEN = 'between';
+ const OPERATOR_EQUAL = 'equal';
+ const OPERATOR_GREATERTHAN = 'greaterThan';
+ const OPERATOR_GREATERTHANOREQUAL = 'greaterThanOrEqual';
+ const OPERATOR_LESSTHAN = 'lessThan';
+ const OPERATOR_LESSTHANOREQUAL = 'lessThanOrEqual';
+ const OPERATOR_NOTBETWEEN = 'notBetween';
+ const OPERATOR_NOTEQUAL = 'notEqual';
+
+ /**
+ * Formula 1
+ *
+ * @var string
+ */
+ private $_formula1;
+
+ /**
+ * Formula 2
+ *
+ * @var string
+ */
+ private $_formula2;
+
+ /**
+ * Type
+ *
+ * @var string
+ */
+ private $_type = PHPExcel_Cell_DataValidation::TYPE_NONE;
+
+ /**
+ * Error style
+ *
+ * @var string
+ */
+ private $_errorStyle = PHPExcel_Cell_DataValidation::STYLE_STOP;
+
+ /**
+ * Operator
+ *
+ * @var string
+ */
+ private $_operator;
+
+ /**
+ * Allow Blank
+ *
+ * @var boolean
+ */
+ private $_allowBlank;
+
+ /**
+ * Show DropDown
+ *
+ * @var boolean
+ */
+ private $_showDropDown;
+
+ /**
+ * Show InputMessage
+ *
+ * @var boolean
+ */
+ private $_showInputMessage;
+
+ /**
+ * Show ErrorMessage
+ *
+ * @var boolean
+ */
+ private $_showErrorMessage;
+
+ /**
+ * Error title
+ *
+ * @var string
+ */
+ private $_errorTitle;
+
+ /**
+ * Error
+ *
+ * @var string
+ */
+ private $_error;
+
+ /**
+ * Prompt title
+ *
+ * @var string
+ */
+ private $_promptTitle;
+
+ /**
+ * Prompt
+ *
+ * @var string
+ */
+ private $_prompt;
+
+ /**
+ * Create a new PHPExcel_Cell_DataValidation
+ *
+ * @throws Exception
+ */
+ public function __construct()
+ {
+ // Initialise member variables
+ $this->_formula1 = '';
+ $this->_formula2 = '';
+ $this->_type = PHPExcel_Cell_DataValidation::TYPE_NONE;
+ $this->_errorStyle = PHPExcel_Cell_DataValidation::STYLE_STOP;
+ $this->_operator = '';
+ $this->_allowBlank = false;
+ $this->_showDropDown = false;
+ $this->_showInputMessage = false;
+ $this->_showErrorMessage = false;
+ $this->_errorTitle = '';
+ $this->_error = '';
+ $this->_promptTitle = '';
+ $this->_prompt = '';
+ }
+
+ /**
+ * Get Formula 1
+ *
+ * @return string
+ */
+ public function getFormula1() {
+ return $this->_formula1;
+ }
+
+ /**
+ * Set Formula 1
+ *
+ * @param string $value
+ * @return PHPExcel_Cell_DataValidation
+ */
+ public function setFormula1($value = '') {
+ $this->_formula1 = $value;
+ return $this;
+ }
+
+ /**
+ * Get Formula 2
+ *
+ * @return string
+ */
+ public function getFormula2() {
+ return $this->_formula2;
+ }
+
+ /**
+ * Set Formula 2
+ *
+ * @param string $value
+ * @return PHPExcel_Cell_DataValidation
+ */
+ public function setFormula2($value = '') {
+ $this->_formula2 = $value;
+ return $this;
+ }
+
+ /**
+ * Get Type
+ *
+ * @return string
+ */
+ public function getType() {
+ return $this->_type;
+ }
+
+ /**
+ * Set Type
+ *
+ * @param string $value
+ * @return PHPExcel_Cell_DataValidation
+ */
+ public function setType($value = PHPExcel_Cell_DataValidation::TYPE_NONE) {
+ $this->_type = $value;
+ return $this;
+ }
+
+ /**
+ * Get Error style
+ *
+ * @return string
+ */
+ public function getErrorStyle() {
+ return $this->_errorStyle;
+ }
+
+ /**
+ * Set Error style
+ *
+ * @param string $value
+ * @return PHPExcel_Cell_DataValidation
+ */
+ public function setErrorStyle($value = PHPExcel_Cell_DataValidation::STYLE_STOP) {
+ $this->_errorStyle = $value;
+ return $this;
+ }
+
+ /**
+ * Get Operator
+ *
+ * @return string
+ */
+ public function getOperator() {
+ return $this->_operator;
+ }
+
+ /**
+ * Set Operator
+ *
+ * @param string $value
+ * @return PHPExcel_Cell_DataValidation
+ */
+ public function setOperator($value = '') {
+ $this->_operator = $value;
+ return $this;
+ }
+
+ /**
+ * Get Allow Blank
+ *
+ * @return boolean
+ */
+ public function getAllowBlank() {
+ return $this->_allowBlank;
+ }
+
+ /**
+ * Set Allow Blank
+ *
+ * @param boolean $value
+ * @return PHPExcel_Cell_DataValidation
+ */
+ public function setAllowBlank($value = false) {
+ $this->_allowBlank = $value;
+ return $this;
+ }
+
+ /**
+ * Get Show DropDown
+ *
+ * @return boolean
+ */
+ public function getShowDropDown() {
+ return $this->_showDropDown;
+ }
+
+ /**
+ * Set Show DropDown
+ *
+ * @param boolean $value
+ * @return PHPExcel_Cell_DataValidation
+ */
+ public function setShowDropDown($value = false) {
+ $this->_showDropDown = $value;
+ return $this;
+ }
+
+ /**
+ * Get Show InputMessage
+ *
+ * @return boolean
+ */
+ public function getShowInputMessage() {
+ return $this->_showInputMessage;
+ }
+
+ /**
+ * Set Show InputMessage
+ *
+ * @param boolean $value
+ * @return PHPExcel_Cell_DataValidation
+ */
+ public function setShowInputMessage($value = false) {
+ $this->_showInputMessage = $value;
+ return $this;
+ }
+
+ /**
+ * Get Show ErrorMessage
+ *
+ * @return boolean
+ */
+ public function getShowErrorMessage() {
+ return $this->_showErrorMessage;
+ }
+
+ /**
+ * Set Show ErrorMessage
+ *
+ * @param boolean $value
+ * @return PHPExcel_Cell_DataValidation
+ */
+ public function setShowErrorMessage($value = false) {
+ $this->_showErrorMessage = $value;
+ return $this;
+ }
+
+ /**
+ * Get Error title
+ *
+ * @return string
+ */
+ public function getErrorTitle() {
+ return $this->_errorTitle;
+ }
+
+ /**
+ * Set Error title
+ *
+ * @param string $value
+ * @return PHPExcel_Cell_DataValidation
+ */
+ public function setErrorTitle($value = '') {
+ $this->_errorTitle = $value;
+ return $this;
+ }
+
+ /**
+ * Get Error
+ *
+ * @return string
+ */
+ public function getError() {
+ return $this->_error;
+ }
+
+ /**
+ * Set Error
+ *
+ * @param string $value
+ * @return PHPExcel_Cell_DataValidation
+ */
+ public function setError($value = '') {
+ $this->_error = $value;
+ return $this;
+ }
+
+ /**
+ * Get Prompt title
+ *
+ * @return string
+ */
+ public function getPromptTitle() {
+ return $this->_promptTitle;
+ }
+
+ /**
+ * Set Prompt title
+ *
+ * @param string $value
+ * @return PHPExcel_Cell_DataValidation
+ */
+ public function setPromptTitle($value = '') {
+ $this->_promptTitle = $value;
+ return $this;
+ }
+
+ /**
+ * Get Prompt
+ *
+ * @return string
+ */
+ public function getPrompt() {
+ return $this->_prompt;
+ }
+
+ /**
+ * Set Prompt
+ *
+ * @param string $value
+ * @return PHPExcel_Cell_DataValidation
+ */
+ public function setPrompt($value = '') {
+ $this->_prompt = $value;
+ return $this;
+ }
+
+ /**
+ * Get hash code
+ *
+ * @return string Hash code
+ */
+ public function getHashCode() {
+ return md5(
+ $this->_formula1
+ . $this->_formula2
+ . $this->_type = PHPExcel_Cell_DataValidation::TYPE_NONE
+ . $this->_errorStyle = PHPExcel_Cell_DataValidation::STYLE_STOP
+ . $this->_operator
+ . ($this->_allowBlank ? 't' : 'f')
+ . ($this->_showDropDown ? 't' : 'f')
+ . ($this->_showInputMessage ? 't' : 'f')
+ . ($this->_showErrorMessage ? 't' : 'f')
+ . $this->_errorTitle
+ . $this->_error
+ . $this->_promptTitle
+ . $this->_prompt
+ . __CLASS__
+ );
+ }
+
+ /**
+ * Implement PHP __clone to create a deep clone, not just a shallow copy.
+ */
+ public function __clone() {
+ $vars = get_object_vars($this);
+ foreach ($vars as $key => $value) {
+ if (is_object($value)) {
+ $this->$key = clone $value;
+ } else {
+ $this->$key = $value;
+ }
+ }
+ }
+}
diff --git a/admin/survey/excel/PHPExcel/Cell/DefaultValueBinder.php b/admin/survey/excel/PHPExcel/Cell/DefaultValueBinder.php
new file mode 100644
index 0000000..26750f5
--- /dev/null
+++ b/admin/survey/excel/PHPExcel/Cell/DefaultValueBinder.php
@@ -0,0 +1,106 @@
+<?php
+/**
+ * PHPExcel
+ *
+ * Copyright (c) 2006 - 2012 PHPExcel
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * @category PHPExcel
+ * @package PHPExcel_Cell
+ * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel)
+ * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL
+ * @version 1.7.8, 2012-10-12
+ */
+
+
+/** PHPExcel root directory */
+if (!defined('PHPEXCEL_ROOT')) {
+ /**
+ * @ignore
+ */
+ define('PHPEXCEL_ROOT', dirname(__FILE__) . '/../../');
+ require(PHPEXCEL_ROOT . 'PHPExcel/Autoloader.php');
+}
+
+
+/**
+ * PHPExcel_Cell_DefaultValueBinder
+ *
+ * @category PHPExcel
+ * @package PHPExcel_Cell
+ * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel)
+ */
+class PHPExcel_Cell_DefaultValueBinder implements PHPExcel_Cell_IValueBinder
+{
+ /**
+ * Bind value to a cell
+ *
+ * @param PHPExcel_Cell $cell Cell to bind value to
+ * @param mixed $value Value to bind in cell
+ * @return boolean
+ */
+ public function bindValue(PHPExcel_Cell $cell, $value = null)
+ {
+ // sanitize UTF-8 strings
+ if (is_string($value)) {
+ $value = PHPExcel_Shared_String::SanitizeUTF8($value);
+ }
+
+ // Set value explicit
+ $cell->setValueExplicit( $value, self::dataTypeForValue($value) );
+
+ // Done!
+ return true;
+ }
+
+ /**
+ * DataType for value
+ *
+ * @param mixed $pValue
+ * @return int
+ */
+ public static function dataTypeForValue($pValue = null) {
+ // Match the value against a few data types
+ if (is_null($pValue)) {
+ return PHPExcel_Cell_DataType::TYPE_NULL;
+
+ } elseif ($pValue === '') {
+ return PHPExcel_Cell_DataType::TYPE_STRING;
+
+ } elseif ($pValue instanceof PHPExcel_RichText) {
+ return PHPExcel_Cell_DataType::TYPE_INLINE;
+
+ } elseif ($pValue{0} === '=' && strlen($pValue) > 1) {
+ return PHPExcel_Cell_DataType::TYPE_FORMULA;
+
+ } elseif (is_bool($pValue)) {
+ return PHPExcel_Cell_DataType::TYPE_BOOL;
+
+ } elseif (is_float($pValue) || is_int($pValue)) {
+ return PHPExcel_Cell_DataType::TYPE_NUMERIC;
+
+ } elseif (preg_match('/^\-?([0-9]+\\.?[0-9]*|[0-9]*\\.?[0-9]+)$/', $pValue)) {
+ return PHPExcel_Cell_DataType::TYPE_NUMERIC;
+
+ } elseif (is_string($pValue) && array_key_exists($pValue, PHPExcel_Cell_DataType::getErrorCodes())) {
+ return PHPExcel_Cell_DataType::TYPE_ERROR;
+
+ } else {
+ return PHPExcel_Cell_DataType::TYPE_STRING;
+
+ }
+ }
+}
diff --git a/admin/survey/excel/PHPExcel/Cell/Hyperlink.php b/admin/survey/excel/PHPExcel/Cell/Hyperlink.php
new file mode 100644
index 0000000..be52d40
--- /dev/null
+++ b/admin/survey/excel/PHPExcel/Cell/Hyperlink.php
@@ -0,0 +1,127 @@
+<?php
+/**
+ * PHPExcel
+ *
+ * Copyright (c) 2006 - 2012 PHPExcel
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * @category PHPExcel
+ * @package PHPExcel_Cell
+ * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel)
+ * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL
+ * @version 1.7.8, 2012-10-12
+ */
+
+
+/**
+ * PHPExcel_Cell_Hyperlink
+ *
+ * @category PHPExcel
+ * @package PHPExcel_Cell
+ * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel)
+ */
+class PHPExcel_Cell_Hyperlink
+{
+ /**
+ * URL to link the cell to
+ *
+ * @var string
+ */
+ private $_url;
+
+ /**
+ * Tooltip to display on the hyperlink
+ *
+ * @var string
+ */
+ private $_tooltip;
+
+ /**
+ * Create a new PHPExcel_Cell_Hyperlink
+ *
+ * @param string $pUrl Url to link the cell to
+ * @param string $pTooltip Tooltip to display on the hyperlink
+ * @throws Exception
+ */
+ public function __construct($pUrl = '', $pTooltip = '')
+ {
+ // Initialise member variables
+ $this->_url = $pUrl;
+ $this->_tooltip = $pTooltip;
+ }
+
+ /**
+ * Get URL
+ *
+ * @return string
+ */
+ public function getUrl() {
+ return $this->_url;
+ }
+
+ /**
+ * Set URL
+ *
+ * @param string $value
+ * @return PHPExcel_Cell_Hyperlink
+ */
+ public function setUrl($value = '') {
+ $this->_url = $value;
+ return $this;
+ }
+
+ /**
+ * Get tooltip
+ *
+ * @return string
+ */
+ public function getTooltip() {
+ return $this->_tooltip;
+ }
+
+ /**
+ * Set tooltip
+ *
+ * @param string $value
+ * @return PHPExcel_Cell_Hyperlink
+ */
+ public function setTooltip($value = '') {
+ $this->_tooltip = $value;
+ return $this;
+ }
+
+ /**
+ * Is this hyperlink internal? (to another sheet)
+ *
+ * @return boolean
+ */
+ public function isInternal() {
+ return strpos($this->_url, 'sheet://') !== false;
+ }
+
+ /**
+ * Get hash code
+ *
+ * @return string Hash code
+ */
+ public function getHashCode() {
+ return md5(
+ $this->_url
+ . $this->_tooltip
+ . __CLASS__
+ );
+ }
+}
diff --git a/admin/survey/excel/PHPExcel/Cell/IValueBinder.php b/admin/survey/excel/PHPExcel/Cell/IValueBinder.php
new file mode 100644
index 0000000..d869ec9
--- /dev/null
+++ b/admin/survey/excel/PHPExcel/Cell/IValueBinder.php
@@ -0,0 +1,46 @@
+<?php
+/**
+ * PHPExcel
+ *
+ * Copyright (c) 2006 - 2012 PHPExcel
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * @category PHPExcel
+ * @package PHPExcel_Cell
+ * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel)
+ * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL
+ * @version 1.7.8, 2012-10-12
+ */
+
+
+/**
+ * PHPExcel_Cell_IValueBinder
+ *
+ * @category PHPExcel
+ * @package PHPExcel_Cell
+ * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel)
+ */
+interface PHPExcel_Cell_IValueBinder
+{
+ /**
+ * Bind value to a cell
+ *
+ * @param PHPExcel_Cell $cell Cell to bind value to
+ * @param mixed $value Value to bind in cell
+ * @return boolean
+ */
+ public function bindValue(PHPExcel_Cell $cell, $value = null);
+}