[ Index ]

PHP Cross Reference of moodle-2.8

title

Body

[close]

/lib/phpexcel/PHPExcel/Reader/ -> OOCalc.php (source)

   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_Reader
  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    ##VERSION##, ##DATE##
  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   * PHPExcel_Reader_OOCalc
  40   *
  41   * @category    PHPExcel
  42   * @package        PHPExcel_Reader
  43   * @copyright    Copyright (c) 2006 - 2014 PHPExcel (http://www.codeplex.com/PHPExcel)
  44   */
  45  class PHPExcel_Reader_OOCalc extends PHPExcel_Reader_Abstract implements PHPExcel_Reader_IReader
  46  {
  47      /**
  48       * Formats
  49       *
  50       * @var array
  51       */
  52      private $_styles = array();
  53  
  54  
  55      /**
  56       * Create a new PHPExcel_Reader_OOCalc
  57       */
  58  	public function __construct() {
  59          $this->_readFilter     = new PHPExcel_Reader_DefaultReadFilter();
  60      }
  61  
  62  
  63      /**
  64       * Can the current PHPExcel_Reader_IReader read the file?
  65       *
  66       * @param     string         $pFilename
  67       * @return     boolean
  68       * @throws PHPExcel_Reader_Exception
  69       */
  70  	public function canRead($pFilename)
  71      {
  72          // Check if file exists
  73          if (!file_exists($pFilename)) {
  74              throw new PHPExcel_Reader_Exception("Could not open " . $pFilename . " for reading! File does not exist.");
  75          }
  76  
  77          $zipClass = PHPExcel_Settings::getZipClass();
  78  
  79          // Check if zip class exists
  80  //        if (!class_exists($zipClass, FALSE)) {
  81  //            throw new PHPExcel_Reader_Exception($zipClass . " library is not enabled");
  82  //        }
  83  
  84          $mimeType = 'UNKNOWN';
  85          // Load file
  86          $zip = new $zipClass;
  87          if ($zip->open($pFilename) === true) {
  88              // check if it is an OOXML archive
  89              $stat = $zip->statName('mimetype');
  90              if ($stat && ($stat['size'] <= 255)) {
  91                  $mimeType = $zip->getFromName($stat['name']);
  92              } elseif($stat = $zip->statName('META-INF/manifest.xml')) {
  93                  $xml = simplexml_load_string($zip->getFromName('META-INF/manifest.xml'), 'SimpleXMLElement', PHPExcel_Settings::getLibXmlLoaderOptions());
  94                  $namespacesContent = $xml->getNamespaces(true);
  95                  if (isset($namespacesContent['manifest'])) {
  96                      $manifest = $xml->children($namespacesContent['manifest']);
  97                      foreach($manifest as $manifestDataSet) {
  98                          $manifestAttributes = $manifestDataSet->attributes($namespacesContent['manifest']);
  99                          if ($manifestAttributes->{'full-path'} == '/') {
 100                              $mimeType = (string) $manifestAttributes->{'media-type'};
 101                              break;
 102                          }
 103                      }
 104                  }
 105              }
 106  
 107              $zip->close();
 108  
 109              return ($mimeType === 'application/vnd.oasis.opendocument.spreadsheet');
 110          }
 111  
 112          return FALSE;
 113      }
 114  
 115  
 116      /**
 117       * Reads names of the worksheets from a file, without parsing the whole file to a PHPExcel object
 118       *
 119       * @param     string         $pFilename
 120       * @throws     PHPExcel_Reader_Exception
 121       */
 122  	public function listWorksheetNames($pFilename)
 123      {
 124          // Check if file exists
 125          if (!file_exists($pFilename)) {
 126              throw new PHPExcel_Reader_Exception("Could not open " . $pFilename . " for reading! File does not exist.");
 127          }
 128  
 129          $zipClass = PHPExcel_Settings::getZipClass();
 130  
 131          $zip = new $zipClass;
 132          if (!$zip->open($pFilename)) {
 133              throw new PHPExcel_Reader_Exception("Could not open " . $pFilename . " for reading! Error opening file.");
 134          }
 135  
 136          $worksheetNames = array();
 137  
 138          $xml = new XMLReader();
 139          $res = $xml->open('zip://'.realpath($pFilename).'#content.xml', null, PHPExcel_Settings::getLibXmlLoaderOptions());
 140          $xml->setParserProperty(2,true);
 141  
 142          //    Step into the first level of content of the XML
 143          $xml->read();
 144          while ($xml->read()) {
 145              //    Quickly jump through to the office:body node
 146              while ($xml->name !== 'office:body') {
 147                  if ($xml->isEmptyElement)
 148                      $xml->read();
 149                  else
 150                      $xml->next();
 151              }
 152              //    Now read each node until we find our first table:table node
 153              while ($xml->read()) {
 154                  if ($xml->name == 'table:table' && $xml->nodeType == XMLReader::ELEMENT) {
 155                      //    Loop through each table:table node reading the table:name attribute for each worksheet name
 156                      do {
 157                          $worksheetNames[] = $xml->getAttribute('table:name');
 158                          $xml->next();
 159                      } while ($xml->name == 'table:table' && $xml->nodeType == XMLReader::ELEMENT);
 160                  }
 161              }
 162          }
 163  
 164          return $worksheetNames;
 165      }
 166  
 167  
 168      /**
 169       * Return worksheet info (Name, Last Column Letter, Last Column Index, Total Rows, Total Columns)
 170       *
 171       * @param   string     $pFilename
 172       * @throws   PHPExcel_Reader_Exception
 173       */
 174  	public function listWorksheetInfo($pFilename)
 175      {
 176          // Check if file exists
 177          if (!file_exists($pFilename)) {
 178              throw new PHPExcel_Reader_Exception("Could not open " . $pFilename . " for reading! File does not exist.");
 179          }
 180  
 181          $worksheetInfo = array();
 182  
 183          $zipClass = PHPExcel_Settings::getZipClass();
 184  
 185          $zip = new $zipClass;
 186          if (!$zip->open($pFilename)) {
 187              throw new PHPExcel_Reader_Exception("Could not open " . $pFilename . " for reading! Error opening file.");
 188          }
 189  
 190          $xml = new XMLReader();
 191          $res = $xml->open('zip://'.realpath($pFilename).'#content.xml', null, PHPExcel_Settings::getLibXmlLoaderOptions());
 192          $xml->setParserProperty(2,true);
 193  
 194          //    Step into the first level of content of the XML
 195          $xml->read();
 196          while ($xml->read()) {
 197              //    Quickly jump through to the office:body node
 198              while ($xml->name !== 'office:body') {
 199                  if ($xml->isEmptyElement)
 200                      $xml->read();
 201                  else
 202                      $xml->next();
 203              }
 204                  //    Now read each node until we find our first table:table node
 205              while ($xml->read()) {
 206                  if ($xml->name == 'table:table' && $xml->nodeType == XMLReader::ELEMENT) {
 207                      $worksheetNames[] = $xml->getAttribute('table:name');
 208  
 209                      $tmpInfo = array(
 210                          'worksheetName' => $xml->getAttribute('table:name'),
 211                          'lastColumnLetter' => 'A',
 212                          'lastColumnIndex' => 0,
 213                          'totalRows' => 0,
 214                          'totalColumns' => 0,
 215                      );
 216  
 217                      //    Loop through each child node of the table:table element reading
 218                      $currCells = 0;
 219                      do {
 220                          $xml->read();
 221                          if ($xml->name == 'table:table-row' && $xml->nodeType == XMLReader::ELEMENT) {
 222                              $rowspan = $xml->getAttribute('table:number-rows-repeated');
 223                              $rowspan = empty($rowspan) ? 1 : $rowspan;
 224                              $tmpInfo['totalRows'] += $rowspan;
 225                              $tmpInfo['totalColumns'] = max($tmpInfo['totalColumns'],$currCells);
 226                              $currCells = 0;
 227                              //    Step into the row
 228                              $xml->read();
 229                              do {
 230                                  if ($xml->name == 'table:table-cell' && $xml->nodeType == XMLReader::ELEMENT) {
 231                                      if (!$xml->isEmptyElement) {
 232                                          $currCells++;
 233                                          $xml->next();
 234                                      } else {
 235                                          $xml->read();
 236                                      }
 237                                  } elseif ($xml->name == 'table:covered-table-cell' && $xml->nodeType == XMLReader::ELEMENT) {
 238                                      $mergeSize = $xml->getAttribute('table:number-columns-repeated');
 239                                      $currCells += $mergeSize;
 240                                      $xml->read();
 241                                  }
 242                              } while ($xml->name != 'table:table-row');
 243                          }
 244                      } while ($xml->name != 'table:table');
 245  
 246                      $tmpInfo['totalColumns'] = max($tmpInfo['totalColumns'],$currCells);
 247                      $tmpInfo['lastColumnIndex'] = $tmpInfo['totalColumns'] - 1;
 248                      $tmpInfo['lastColumnLetter'] = PHPExcel_Cell::stringFromColumnIndex($tmpInfo['lastColumnIndex']);
 249                      $worksheetInfo[] = $tmpInfo;
 250                  }
 251              }
 252  
 253  //                foreach($workbookData->table as $worksheetDataSet) {
 254  //                    $worksheetData = $worksheetDataSet->children($namespacesContent['table']);
 255  //                    $worksheetDataAttributes = $worksheetDataSet->attributes($namespacesContent['table']);
 256  //
 257  //                    $rowIndex = 0;
 258  //                    foreach ($worksheetData as $key => $rowData) {
 259  //                        switch ($key) {
 260  //                            case 'table-row' :
 261  //                                $rowDataTableAttributes = $rowData->attributes($namespacesContent['table']);
 262  //                                $rowRepeats = (isset($rowDataTableAttributes['number-rows-repeated'])) ?
 263  //                                        $rowDataTableAttributes['number-rows-repeated'] : 1;
 264  //                                $columnIndex = 0;
 265  //
 266  //                                foreach ($rowData as $key => $cellData) {
 267  //                                    $cellDataTableAttributes = $cellData->attributes($namespacesContent['table']);
 268  //                                    $colRepeats = (isset($cellDataTableAttributes['number-columns-repeated'])) ?
 269  //                                        $cellDataTableAttributes['number-columns-repeated'] : 1;
 270  //                                    $cellDataOfficeAttributes = $cellData->attributes($namespacesContent['office']);
 271  //                                    if (isset($cellDataOfficeAttributes['value-type'])) {
 272  //                                        $tmpInfo['lastColumnIndex'] = max($tmpInfo['lastColumnIndex'], $columnIndex + $colRepeats - 1);
 273  //                                        $tmpInfo['totalRows'] = max($tmpInfo['totalRows'], $rowIndex + $rowRepeats);
 274  //                                    }
 275  //                                    $columnIndex += $colRepeats;
 276  //                                }
 277  //                                $rowIndex += $rowRepeats;
 278  //                                break;
 279  //                        }
 280  //                    }
 281  //
 282  //                    $tmpInfo['lastColumnLetter'] = PHPExcel_Cell::stringFromColumnIndex($tmpInfo['lastColumnIndex']);
 283  //                    $tmpInfo['totalColumns'] = $tmpInfo['lastColumnIndex'] + 1;
 284  //
 285  //                }
 286  //            }
 287          }
 288  
 289          return $worksheetInfo;
 290      }
 291  
 292  
 293      /**
 294       * Loads PHPExcel from file
 295       *
 296       * @param     string         $pFilename
 297       * @return     PHPExcel
 298       * @throws     PHPExcel_Reader_Exception
 299       */
 300  	public function load($pFilename)
 301      {
 302          // Create new PHPExcel
 303          $objPHPExcel = new PHPExcel();
 304  
 305          // Load into this instance
 306          return $this->loadIntoExisting($pFilename, $objPHPExcel);
 307      }
 308  
 309  
 310  	private static function identifyFixedStyleValue($styleList,&$styleAttributeValue) {
 311          $styleAttributeValue = strtolower($styleAttributeValue);
 312          foreach($styleList as $style) {
 313              if ($styleAttributeValue == strtolower($style)) {
 314                  $styleAttributeValue = $style;
 315                  return true;
 316              }
 317          }
 318          return false;
 319      }
 320  
 321  
 322      /**
 323       * Loads PHPExcel from file into PHPExcel instance
 324       *
 325       * @param     string         $pFilename
 326       * @param    PHPExcel    $objPHPExcel
 327       * @return     PHPExcel
 328       * @throws     PHPExcel_Reader_Exception
 329       */
 330  	public function loadIntoExisting($pFilename, PHPExcel $objPHPExcel)
 331      {
 332          // Check if file exists
 333          if (!file_exists($pFilename)) {
 334              throw new PHPExcel_Reader_Exception("Could not open " . $pFilename . " for reading! File does not exist.");
 335          }
 336  
 337          $timezoneObj = new DateTimeZone('Europe/London');
 338          $GMT = new DateTimeZone('UTC');
 339  
 340          $zipClass = PHPExcel_Settings::getZipClass();
 341  
 342          $zip = new $zipClass;
 343          if (!$zip->open($pFilename)) {
 344              throw new PHPExcel_Reader_Exception("Could not open " . $pFilename . " for reading! Error opening file.");
 345          }
 346  
 347  //        echo '<h1>Meta Information</h1>';
 348          $xml = simplexml_load_string($zip->getFromName("meta.xml"), 'SimpleXMLElement', PHPExcel_Settings::getLibXmlLoaderOptions());
 349          $namespacesMeta = $xml->getNamespaces(true);
 350  //        echo '<pre>';
 351  //        print_r($namespacesMeta);
 352  //        echo '</pre><hr />';
 353  
 354          $docProps = $objPHPExcel->getProperties();
 355          $officeProperty = $xml->children($namespacesMeta['office']);
 356          foreach($officeProperty as $officePropertyData) {
 357              $officePropertyDC = array();
 358              if (isset($namespacesMeta['dc'])) {
 359                  $officePropertyDC = $officePropertyData->children($namespacesMeta['dc']);
 360              }
 361              foreach($officePropertyDC as $propertyName => $propertyValue) {
 362                  $propertyValue = (string) $propertyValue;
 363                  switch ($propertyName) {
 364                      case 'title' :
 365                              $docProps->setTitle($propertyValue);
 366                              break;
 367                      case 'subject' :
 368                              $docProps->setSubject($propertyValue);
 369                              break;
 370                      case 'creator' :
 371                              $docProps->setCreator($propertyValue);
 372                              $docProps->setLastModifiedBy($propertyValue);
 373                              break;
 374                      case 'date' :
 375                              $creationDate = strtotime($propertyValue);
 376                              $docProps->setCreated($creationDate);
 377                              $docProps->setModified($creationDate);
 378                              break;
 379                      case 'description' :
 380                              $docProps->setDescription($propertyValue);
 381                              break;
 382                  }
 383              }
 384              $officePropertyMeta = array();
 385              if (isset($namespacesMeta['dc'])) {
 386                  $officePropertyMeta = $officePropertyData->children($namespacesMeta['meta']);
 387              }
 388              foreach($officePropertyMeta as $propertyName => $propertyValue) {
 389                  $propertyValueAttributes = $propertyValue->attributes($namespacesMeta['meta']);
 390                  $propertyValue = (string) $propertyValue;
 391                  switch ($propertyName) {
 392                      case 'initial-creator' :
 393                              $docProps->setCreator($propertyValue);
 394                              break;
 395                      case 'keyword' :
 396                              $docProps->setKeywords($propertyValue);
 397                              break;
 398                      case 'creation-date' :
 399                              $creationDate = strtotime($propertyValue);
 400                              $docProps->setCreated($creationDate);
 401                              break;
 402                      case 'user-defined' :
 403                              $propertyValueType = PHPExcel_DocumentProperties::PROPERTY_TYPE_STRING;
 404                              foreach ($propertyValueAttributes as $key => $value) {
 405                                  if ($key == 'name') {
 406                                      $propertyValueName = (string) $value;
 407                                  } elseif($key == 'value-type') {
 408                                      switch ($value) {
 409                                          case 'date'    :
 410                                              $propertyValue = PHPExcel_DocumentProperties::convertProperty($propertyValue,'date');
 411                                              $propertyValueType = PHPExcel_DocumentProperties::PROPERTY_TYPE_DATE;
 412                                              break;
 413                                          case 'boolean'    :
 414                                              $propertyValue = PHPExcel_DocumentProperties::convertProperty($propertyValue,'bool');
 415                                              $propertyValueType = PHPExcel_DocumentProperties::PROPERTY_TYPE_BOOLEAN;
 416                                              break;
 417                                          case 'float'    :
 418                                              $propertyValue = PHPExcel_DocumentProperties::convertProperty($propertyValue,'r4');
 419                                              $propertyValueType = PHPExcel_DocumentProperties::PROPERTY_TYPE_FLOAT;
 420                                              break;
 421                                          default :
 422                                              $propertyValueType = PHPExcel_DocumentProperties::PROPERTY_TYPE_STRING;
 423                                      }
 424                                  }
 425                              }
 426                              $docProps->setCustomProperty($propertyValueName,$propertyValue,$propertyValueType);
 427                              break;
 428                  }
 429              }
 430          }
 431  
 432  
 433  //        echo '<h1>Workbook Content</h1>';
 434          $xml = simplexml_load_string($zip->getFromName("content.xml"), 'SimpleXMLElement', PHPExcel_Settings::getLibXmlLoaderOptions());
 435          $namespacesContent = $xml->getNamespaces(true);
 436  //        echo '<pre>';
 437  //        print_r($namespacesContent);
 438  //        echo '</pre><hr />';
 439  
 440          $workbook = $xml->children($namespacesContent['office']);
 441          foreach($workbook->body->spreadsheet as $workbookData) {
 442              $workbookData = $workbookData->children($namespacesContent['table']);
 443              $worksheetID = 0;
 444              foreach($workbookData->table as $worksheetDataSet) {
 445                  $worksheetData = $worksheetDataSet->children($namespacesContent['table']);
 446  //                print_r($worksheetData);
 447  //                echo '<br />';
 448                  $worksheetDataAttributes = $worksheetDataSet->attributes($namespacesContent['table']);
 449  //                print_r($worksheetDataAttributes);
 450  //                echo '<br />';
 451                  if ((isset($this->_loadSheetsOnly)) && (isset($worksheetDataAttributes['name'])) &&
 452                      (!in_array($worksheetDataAttributes['name'], $this->_loadSheetsOnly))) {
 453                      continue;
 454                  }
 455  
 456  //                echo '<h2>Worksheet '.$worksheetDataAttributes['name'].'</h2>';
 457                  // Create new Worksheet
 458                  $objPHPExcel->createSheet();
 459                  $objPHPExcel->setActiveSheetIndex($worksheetID);
 460                  if (isset($worksheetDataAttributes['name'])) {
 461                      $worksheetName = (string) $worksheetDataAttributes['name'];
 462                      //    Use false for $updateFormulaCellReferences to prevent adjustment of worksheet references in
 463                      //        formula cells... during the load, all formulae should be correct, and we're simply
 464                      //        bringing the worksheet name in line with the formula, not the reverse
 465                      $objPHPExcel->getActiveSheet()->setTitle($worksheetName,false);
 466                  }
 467  
 468                  $rowID = 1;
 469                  foreach($worksheetData as $key => $rowData) {
 470  //                    echo '<b>'.$key.'</b><br />';
 471                      switch ($key) {
 472                          case 'table-header-rows':
 473                              foreach ($rowData as $key=>$cellData) {
 474                                  $rowData = $cellData;
 475                                  break;
 476                              }
 477                          case 'table-row' :
 478                              $rowDataTableAttributes = $rowData->attributes($namespacesContent['table']);
 479                              $rowRepeats = (isset($rowDataTableAttributes['number-rows-repeated'])) ?
 480                                      $rowDataTableAttributes['number-rows-repeated'] : 1;
 481                              $columnID = 'A';
 482                              foreach($rowData as $key => $cellData) {
 483                                  if ($this->getReadFilter() !== NULL) {
 484                                      if (!$this->getReadFilter()->readCell($columnID, $rowID, $worksheetName)) {
 485                                          continue;
 486                                      }
 487                                  }
 488  
 489  //                                echo '<b>'.$columnID.$rowID.'</b><br />';
 490                                  $cellDataText = (isset($namespacesContent['text'])) ?
 491                                      $cellData->children($namespacesContent['text']) :
 492                                      '';
 493                                  $cellDataOffice = $cellData->children($namespacesContent['office']);
 494                                  $cellDataOfficeAttributes = $cellData->attributes($namespacesContent['office']);
 495                                  $cellDataTableAttributes = $cellData->attributes($namespacesContent['table']);
 496  
 497  //                                echo 'Office Attributes: ';
 498  //                                print_r($cellDataOfficeAttributes);
 499  //                                echo '<br />Table Attributes: ';
 500  //                                print_r($cellDataTableAttributes);
 501  //                                echo '<br />Cell Data Text';
 502  //                                print_r($cellDataText);
 503  //                                echo '<br />';
 504  //
 505                                  $type = $formatting = $hyperlink = null;
 506                                  $hasCalculatedValue = false;
 507                                  $cellDataFormula = '';
 508                                  if (isset($cellDataTableAttributes['formula'])) {
 509                                      $cellDataFormula = $cellDataTableAttributes['formula'];
 510                                      $hasCalculatedValue = true;
 511                                  }
 512  
 513                                  if (isset($cellDataOffice->annotation)) {
 514  //                                    echo 'Cell has comment<br />';
 515                                      $annotationText = $cellDataOffice->annotation->children($namespacesContent['text']);
 516                                      $textArray = array();
 517                                      foreach($annotationText as $t) {
 518                                          foreach($t->span as $text) {
 519                                              $textArray[] = (string)$text;
 520                                          }
 521                                      }
 522                                      $text = implode("\n",$textArray);
 523  //                                    echo $text,'<br />';
 524                                      $objPHPExcel->getActiveSheet()->getComment( $columnID.$rowID )
 525  //                                                                    ->setAuthor( $author )
 526                                                                      ->setText($this->_parseRichText($text) );
 527                                  }
 528  
 529                                      if (isset($cellDataText->p)) {
 530                                      // Consolidate if there are multiple p records (maybe with spans as well)
 531                                      $dataArray = array();
 532                                      // Text can have multiple text:p and within those, multiple text:span.
 533                                      // text:p newlines, but text:span does not.
 534                                      // Also, here we assume there is no text data is span fields are specified, since
 535                                      // we have no way of knowing proper positioning anyway.
 536                                      foreach ($cellDataText->p as $pData) {
 537                                          if (isset($pData->span)) {
 538                                              // span sections do not newline, so we just create one large string here
 539                                              $spanSection = "";
 540                                              foreach ($pData->span as $spanData) {
 541                                                  $spanSection .= $spanData;
 542                                              }
 543                                              array_push($dataArray, $spanSection);
 544                                          } else {
 545                                              array_push($dataArray, $pData);
 546                                          }
 547                                      }
 548                                      $allCellDataText = implode($dataArray, "\n");
 549  
 550  //                                    echo 'Value Type is '.$cellDataOfficeAttributes['value-type'].'<br />';
 551                                      switch ($cellDataOfficeAttributes['value-type']) {
 552                                           case 'string' :
 553                                                  $type = PHPExcel_Cell_DataType::TYPE_STRING;
 554                                                  $dataValue = $allCellDataText;
 555                                                  if (isset($dataValue->a)) {
 556                                                      $dataValue = $dataValue->a;
 557                                                      $cellXLinkAttributes = $dataValue->attributes($namespacesContent['xlink']);
 558                                                      $hyperlink = $cellXLinkAttributes['href'];
 559                                                  }
 560                                                  break;
 561                                          case 'boolean' :
 562                                                  $type = PHPExcel_Cell_DataType::TYPE_BOOL;
 563                                                  $dataValue = ($allCellDataText == 'TRUE') ? True : False;
 564                                                  break;
 565                                          case 'percentage' :
 566                                                  $type = PHPExcel_Cell_DataType::TYPE_NUMERIC;
 567                                                  $dataValue = (float) $cellDataOfficeAttributes['value'];
 568                                                  if (floor($dataValue) == $dataValue) {
 569                                                      $dataValue = (integer) $dataValue;
 570                                                  }
 571                                                  $formatting = PHPExcel_Style_NumberFormat::FORMAT_PERCENTAGE_00;
 572                                                  break;
 573                                          case 'currency' :
 574                                                  $type = PHPExcel_Cell_DataType::TYPE_NUMERIC;
 575                                                  $dataValue = (float) $cellDataOfficeAttributes['value'];
 576                                                  if (floor($dataValue) == $dataValue) {
 577                                                      $dataValue = (integer) $dataValue;
 578                                                  }
 579                                                  $formatting = PHPExcel_Style_NumberFormat::FORMAT_CURRENCY_USD_SIMPLE;
 580                                                  break;
 581                                          case 'float' :
 582                                                  $type = PHPExcel_Cell_DataType::TYPE_NUMERIC;
 583                                                  $dataValue = (float) $cellDataOfficeAttributes['value'];
 584                                                  if (floor($dataValue) == $dataValue) {
 585                                                      if ($dataValue == (integer) $dataValue)
 586                                                          $dataValue = (integer) $dataValue;
 587                                                      else
 588                                                          $dataValue = (float) $dataValue;
 589                                                  }
 590                                                  break;
 591                                          case 'date' :
 592                                                  $type = PHPExcel_Cell_DataType::TYPE_NUMERIC;
 593                                                  $dateObj = new DateTime($cellDataOfficeAttributes['date-value'], $GMT);
 594                                                  $dateObj->setTimeZone($timezoneObj);
 595                                                  list($year,$month,$day,$hour,$minute,$second) = explode(' ',$dateObj->format('Y m d H i s'));
 596                                                  $dataValue = PHPExcel_Shared_Date::FormattedPHPToExcel($year,$month,$day,$hour,$minute,$second);
 597                                                  if ($dataValue != floor($dataValue)) {
 598                                                      $formatting = PHPExcel_Style_NumberFormat::FORMAT_DATE_XLSX15.' '.PHPExcel_Style_NumberFormat::FORMAT_DATE_TIME4;
 599                                                  } else {
 600                                                      $formatting = PHPExcel_Style_NumberFormat::FORMAT_DATE_XLSX15;
 601                                                  }
 602                                                  break;
 603                                          case 'time' :
 604                                                  $type = PHPExcel_Cell_DataType::TYPE_NUMERIC;
 605                                                  $dataValue = PHPExcel_Shared_Date::PHPToExcel(strtotime('01-01-1970 '.implode(':',sscanf($cellDataOfficeAttributes['time-value'],'PT%dH%dM%dS'))));
 606                                                  $formatting = PHPExcel_Style_NumberFormat::FORMAT_DATE_TIME4;
 607                                                  break;
 608                                      }
 609  //                                    echo 'Data value is '.$dataValue.'<br />';
 610  //                                    if ($hyperlink !== NULL) {
 611  //                                        echo 'Hyperlink is '.$hyperlink.'<br />';
 612  //                                    }
 613                                  } else {
 614                                      $type = PHPExcel_Cell_DataType::TYPE_NULL;
 615                                      $dataValue = NULL;
 616                                  }
 617  
 618                                  if ($hasCalculatedValue) {
 619                                      $type = PHPExcel_Cell_DataType::TYPE_FORMULA;
 620  //                                    echo 'Formula: ', $cellDataFormula, PHP_EOL;
 621                                      $cellDataFormula = substr($cellDataFormula,strpos($cellDataFormula,':=')+1);
 622                                      $temp = explode('"',$cellDataFormula);
 623                                      $tKey = false;
 624                                      foreach($temp as &$value) {
 625                                          //    Only replace in alternate array entries (i.e. non-quoted blocks)
 626                                          if ($tKey = !$tKey) {
 627                                              $value = preg_replace('/\[([^\.]+)\.([^\.]+):\.([^\.]+)\]/Ui','$1!$2:$3',$value);    //  Cell range reference in another sheet
 628                                              $value = preg_replace('/\[([^\.]+)\.([^\.]+)\]/Ui','$1!$2',$value);       //  Cell reference in another sheet
 629                                              $value = preg_replace('/\[\.([^\.]+):\.([^\.]+)\]/Ui','$1:$2',$value);    //  Cell range reference
 630                                              $value = preg_replace('/\[\.([^\.]+)\]/Ui','$1',$value);                  //  Simple cell reference
 631                                              $value = PHPExcel_Calculation::_translateSeparator(';',',',$value,$inBraces);
 632                                          }
 633                                      }
 634                                      unset($value);
 635                                      //    Then rebuild the formula string
 636                                      $cellDataFormula = implode('"',$temp);
 637  //                                    echo 'Adjusted Formula: ', $cellDataFormula, PHP_EOL;
 638                                  }
 639  
 640                                  $colRepeats = (isset($cellDataTableAttributes['number-columns-repeated'])) ?
 641                                      $cellDataTableAttributes['number-columns-repeated'] : 1;
 642                                  if ($type !== NULL) {
 643                                      for ($i = 0; $i < $colRepeats; ++$i) {
 644                                          if ($i > 0) {
 645                                              ++$columnID;
 646                                          }
 647                                          if ($type !== PHPExcel_Cell_DataType::TYPE_NULL) {
 648                                              for ($rowAdjust = 0; $rowAdjust < $rowRepeats; ++$rowAdjust) {
 649                                                  $rID = $rowID + $rowAdjust;
 650                                                  $objPHPExcel->getActiveSheet()->getCell($columnID.$rID)->setValueExplicit((($hasCalculatedValue) ? $cellDataFormula : $dataValue),$type);
 651                                                  if ($hasCalculatedValue) {
 652  //                                                    echo 'Forumla result is '.$dataValue.'<br />';
 653                                                      $objPHPExcel->getActiveSheet()->getCell($columnID.$rID)->setCalculatedValue($dataValue);
 654                                                  }
 655                                                  if ($formatting !== NULL) {
 656                                                      $objPHPExcel->getActiveSheet()->getStyle($columnID.$rID)->getNumberFormat()->setFormatCode($formatting);
 657                                                  } else {
 658                                                      $objPHPExcel->getActiveSheet()->getStyle($columnID.$rID)->getNumberFormat()->setFormatCode(PHPExcel_Style_NumberFormat::FORMAT_GENERAL);
 659                                                  }
 660                                                  if ($hyperlink !== NULL) {
 661                                                      $objPHPExcel->getActiveSheet()->getCell($columnID.$rID)->getHyperlink()->setUrl($hyperlink);
 662                                                  }
 663                                              }
 664                                          }
 665                                      }
 666                                  }
 667  
 668                                  //    Merged cells
 669                                  if ((isset($cellDataTableAttributes['number-columns-spanned'])) || (isset($cellDataTableAttributes['number-rows-spanned']))) {
 670                                      if (($type !== PHPExcel_Cell_DataType::TYPE_NULL) || (!$this->_readDataOnly)) {
 671                                          $columnTo = $columnID;
 672                                          if (isset($cellDataTableAttributes['number-columns-spanned'])) {
 673                                              $columnTo = PHPExcel_Cell::stringFromColumnIndex(PHPExcel_Cell::columnIndexFromString($columnID) + $cellDataTableAttributes['number-columns-spanned'] -2);
 674                                          }
 675                                          $rowTo = $rowID;
 676                                          if (isset($cellDataTableAttributes['number-rows-spanned'])) {
 677                                              $rowTo = $rowTo + $cellDataTableAttributes['number-rows-spanned'] - 1;
 678                                          }
 679                                          $cellRange = $columnID.$rowID.':'.$columnTo.$rowTo;
 680                                          $objPHPExcel->getActiveSheet()->mergeCells($cellRange);
 681                                      }
 682                                  }
 683  
 684                                  ++$columnID;
 685                              }
 686                              $rowID += $rowRepeats;
 687                              break;
 688                      }
 689                  }
 690                  ++$worksheetID;
 691              }
 692          }
 693  
 694          // Return
 695          return $objPHPExcel;
 696      }
 697  
 698  
 699  	private function _parseRichText($is = '') {
 700          $value = new PHPExcel_RichText();
 701  
 702          $value->createText($is);
 703  
 704          return $value;
 705      }
 706  
 707  }


Generated: Fri Nov 28 20:29:05 2014 Cross-referenced by PHPXref 0.7.1