[ Index ]

PHP Cross Reference of moodle-2.8

title

Body

[close]

/lib/phpexcel/PHPExcel/ -> Worksheet.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_Worksheet
  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  /**
  30   * PHPExcel_Worksheet
  31   *
  32   * @category   PHPExcel
  33   * @package    PHPExcel_Worksheet
  34   * @copyright  Copyright (c) 2006 - 2014 PHPExcel (http://www.codeplex.com/PHPExcel)
  35   */
  36  class PHPExcel_Worksheet implements PHPExcel_IComparable
  37  {
  38      /* Break types */
  39      const BREAK_NONE   = 0;
  40      const BREAK_ROW    = 1;
  41      const BREAK_COLUMN = 2;
  42  
  43      /* Sheet state */
  44      const SHEETSTATE_VISIBLE    = 'visible';
  45      const SHEETSTATE_HIDDEN     = 'hidden';
  46      const SHEETSTATE_VERYHIDDEN = 'veryHidden';
  47  
  48      /**
  49       * Invalid characters in sheet title
  50       *
  51       * @var array
  52       */
  53      private static $_invalidCharacters = array('*', ':', '/', '\\', '?', '[', ']');
  54  
  55      /**
  56       * Parent spreadsheet
  57       *
  58       * @var PHPExcel
  59       */
  60      private $_parent;
  61  
  62      /**
  63       * Cacheable collection of cells
  64       *
  65       * @var PHPExcel_CachedObjectStorage_xxx
  66       */
  67      private $_cellCollection = null;
  68  
  69      /**
  70       * Collection of row dimensions
  71       *
  72       * @var PHPExcel_Worksheet_RowDimension[]
  73       */
  74      private $_rowDimensions = array();
  75  
  76      /**
  77       * Default row dimension
  78       *
  79       * @var PHPExcel_Worksheet_RowDimension
  80       */
  81      private $_defaultRowDimension = null;
  82  
  83      /**
  84       * Collection of column dimensions
  85       *
  86       * @var PHPExcel_Worksheet_ColumnDimension[]
  87       */
  88      private $_columnDimensions = array();
  89  
  90      /**
  91       * Default column dimension
  92       *
  93       * @var PHPExcel_Worksheet_ColumnDimension
  94       */
  95      private $_defaultColumnDimension = null;
  96  
  97      /**
  98       * Collection of drawings
  99       *
 100       * @var PHPExcel_Worksheet_BaseDrawing[]
 101       */
 102      private $_drawingCollection = null;
 103  
 104      /**
 105       * Collection of Chart objects
 106       *
 107       * @var PHPExcel_Chart[]
 108       */
 109      private $_chartCollection = array();
 110  
 111      /**
 112       * Worksheet title
 113       *
 114       * @var string
 115       */
 116      private $_title;
 117  
 118      /**
 119       * Sheet state
 120       *
 121       * @var string
 122       */
 123      private $_sheetState;
 124  
 125      /**
 126       * Page setup
 127       *
 128       * @var PHPExcel_Worksheet_PageSetup
 129       */
 130      private $_pageSetup;
 131  
 132      /**
 133       * Page margins
 134       *
 135       * @var PHPExcel_Worksheet_PageMargins
 136       */
 137      private $_pageMargins;
 138  
 139      /**
 140       * Page header/footer
 141       *
 142       * @var PHPExcel_Worksheet_HeaderFooter
 143       */
 144      private $_headerFooter;
 145  
 146      /**
 147       * Sheet view
 148       *
 149       * @var PHPExcel_Worksheet_SheetView
 150       */
 151      private $_sheetView;
 152  
 153      /**
 154       * Protection
 155       *
 156       * @var PHPExcel_Worksheet_Protection
 157       */
 158      private $_protection;
 159  
 160      /**
 161       * Collection of styles
 162       *
 163       * @var PHPExcel_Style[]
 164       */
 165      private $_styles = array();
 166  
 167      /**
 168       * Conditional styles. Indexed by cell coordinate, e.g. 'A1'
 169       *
 170       * @var array
 171       */
 172      private $_conditionalStylesCollection = array();
 173  
 174      /**
 175       * Is the current cell collection sorted already?
 176       *
 177       * @var boolean
 178       */
 179      private $_cellCollectionIsSorted = false;
 180  
 181      /**
 182       * Collection of breaks
 183       *
 184       * @var array
 185       */
 186      private $_breaks = array();
 187  
 188      /**
 189       * Collection of merged cell ranges
 190       *
 191       * @var array
 192       */
 193      private $_mergeCells = array();
 194  
 195      /**
 196       * Collection of protected cell ranges
 197       *
 198       * @var array
 199       */
 200      private $_protectedCells = array();
 201  
 202      /**
 203       * Autofilter Range and selection
 204       *
 205       * @var PHPExcel_Worksheet_AutoFilter
 206       */
 207      private $_autoFilter = NULL;
 208  
 209      /**
 210       * Freeze pane
 211       *
 212       * @var string
 213       */
 214      private $_freezePane = '';
 215  
 216      /**
 217       * Show gridlines?
 218       *
 219       * @var boolean
 220       */
 221      private $_showGridlines = true;
 222  
 223      /**
 224      * Print gridlines?
 225      *
 226      * @var boolean
 227      */
 228      private $_printGridlines = false;
 229  
 230      /**
 231      * Show row and column headers?
 232      *
 233      * @var boolean
 234      */
 235      private $_showRowColHeaders = true;
 236  
 237      /**
 238       * Show summary below? (Row/Column outline)
 239       *
 240       * @var boolean
 241       */
 242      private $_showSummaryBelow = true;
 243  
 244      /**
 245       * Show summary right? (Row/Column outline)
 246       *
 247       * @var boolean
 248       */
 249      private $_showSummaryRight = true;
 250  
 251      /**
 252       * Collection of comments
 253       *
 254       * @var PHPExcel_Comment[]
 255       */
 256      private $_comments = array();
 257  
 258      /**
 259       * Active cell. (Only one!)
 260       *
 261       * @var string
 262       */
 263      private $_activeCell = 'A1';
 264  
 265      /**
 266       * Selected cells
 267       *
 268       * @var string
 269       */
 270      private $_selectedCells = 'A1';
 271  
 272      /**
 273       * Cached highest column
 274       *
 275       * @var string
 276       */
 277      private $_cachedHighestColumn = 'A';
 278  
 279      /**
 280       * Cached highest row
 281       *
 282       * @var int
 283       */
 284      private $_cachedHighestRow = 1;
 285  
 286      /**
 287       * Right-to-left?
 288       *
 289       * @var boolean
 290       */
 291      private $_rightToLeft = false;
 292  
 293      /**
 294       * Hyperlinks. Indexed by cell coordinate, e.g. 'A1'
 295       *
 296       * @var array
 297       */
 298      private $_hyperlinkCollection = array();
 299  
 300      /**
 301       * Data validation objects. Indexed by cell coordinate, e.g. 'A1'
 302       *
 303       * @var array
 304       */
 305      private $_dataValidationCollection = array();
 306  
 307      /**
 308       * Tab color
 309       *
 310       * @var PHPExcel_Style_Color
 311       */
 312      private $_tabColor;
 313  
 314      /**
 315       * Dirty flag
 316       *
 317       * @var boolean
 318       */
 319      private $_dirty    = true;
 320  
 321      /**
 322       * Hash
 323       *
 324       * @var string
 325       */
 326      private $_hash    = null;
 327  
 328      /**
 329      * CodeName
 330      *
 331      * @var string
 332      */
 333      private $_codeName = null;
 334  
 335      /**
 336       * Create a new worksheet
 337       *
 338       * @param PHPExcel        $pParent
 339       * @param string        $pTitle
 340       */
 341      public function __construct(PHPExcel $pParent = null, $pTitle = 'Worksheet')
 342      {
 343          // Set parent and title
 344          $this->_parent = $pParent;
 345          $this->setTitle($pTitle, FALSE);
 346          // setTitle can change $pTitle
 347          $this->setCodeName($this->getTitle());
 348          $this->setSheetState(PHPExcel_Worksheet::SHEETSTATE_VISIBLE);
 349  
 350          $this->_cellCollection        = PHPExcel_CachedObjectStorageFactory::getInstance($this);
 351  
 352          // Set page setup
 353          $this->_pageSetup            = new PHPExcel_Worksheet_PageSetup();
 354  
 355          // Set page margins
 356          $this->_pageMargins         = new PHPExcel_Worksheet_PageMargins();
 357  
 358          // Set page header/footer
 359          $this->_headerFooter        = new PHPExcel_Worksheet_HeaderFooter();
 360  
 361          // Set sheet view
 362          $this->_sheetView            = new PHPExcel_Worksheet_SheetView();
 363  
 364          // Drawing collection
 365          $this->_drawingCollection    = new ArrayObject();
 366  
 367          // Chart collection
 368          $this->_chartCollection     = new ArrayObject();
 369  
 370          // Protection
 371          $this->_protection            = new PHPExcel_Worksheet_Protection();
 372  
 373          // Default row dimension
 374          $this->_defaultRowDimension = new PHPExcel_Worksheet_RowDimension(NULL);
 375  
 376          // Default column dimension
 377          $this->_defaultColumnDimension    = new PHPExcel_Worksheet_ColumnDimension(NULL);
 378  
 379          $this->_autoFilter            = new PHPExcel_Worksheet_AutoFilter(NULL, $this);
 380      }
 381  
 382  
 383      /**
 384       * Disconnect all cells from this PHPExcel_Worksheet object,
 385       *    typically so that the worksheet object can be unset
 386       *
 387       */
 388  	public function disconnectCells() {
 389          if ( $this->_cellCollection !== NULL){
 390              $this->_cellCollection->unsetWorksheetCells();
 391              $this->_cellCollection = NULL;
 392          }
 393          //    detach ourself from the workbook, so that it can then delete this worksheet successfully
 394          $this->_parent = null;
 395      }
 396  
 397      /**
 398       * Code to execute when this worksheet is unset()
 399       *
 400       */
 401  	function __destruct() {
 402          PHPExcel_Calculation::getInstance($this->_parent)
 403              ->clearCalculationCacheForWorksheet($this->_title);
 404  
 405          $this->disconnectCells();
 406      }
 407  
 408     /**
 409       * Return the cache controller for the cell collection
 410       *
 411       * @return PHPExcel_CachedObjectStorage_xxx
 412       */
 413  	public function getCellCacheController() {
 414          return $this->_cellCollection;
 415      }    //    function getCellCacheController()
 416  
 417  
 418      /**
 419       * Get array of invalid characters for sheet title
 420       *
 421       * @return array
 422       */
 423      public static function getInvalidCharacters()
 424      {
 425          return self::$_invalidCharacters;
 426      }
 427  
 428      /**
 429       * Check sheet code name for valid Excel syntax
 430       *
 431       * @param string $pValue The string to check
 432       * @return string The valid string
 433       * @throws Exception
 434       */
 435      private static function _checkSheetCodeName($pValue)
 436      {
 437          $CharCount = PHPExcel_Shared_String::CountCharacters($pValue);
 438          if ($CharCount == 0) {
 439              throw new PHPExcel_Exception('Sheet code name cannot be empty.');
 440          }
 441          // Some of the printable ASCII characters are invalid:  * : / \ ? [ ] and  first and last characters cannot be a "'"
 442          if ((str_replace(self::$_invalidCharacters, '', $pValue) !== $pValue) || 
 443              (PHPExcel_Shared_String::Substring($pValue,-1,1)=='\'') || 
 444              (PHPExcel_Shared_String::Substring($pValue,0,1)=='\'')) {
 445              throw new PHPExcel_Exception('Invalid character found in sheet code name');
 446          }
 447   
 448          // Maximum 31 characters allowed for sheet title
 449          if ($CharCount > 31) {
 450              throw new PHPExcel_Exception('Maximum 31 characters allowed in sheet code name.');
 451          }
 452   
 453          return $pValue;
 454      }
 455  
 456     /**
 457       * Check sheet title for valid Excel syntax
 458       *
 459       * @param string $pValue The string to check
 460       * @return string The valid string
 461       * @throws PHPExcel_Exception
 462       */
 463      private static function _checkSheetTitle($pValue)
 464      {
 465          // Some of the printable ASCII characters are invalid:  * : / \ ? [ ]
 466          if (str_replace(self::$_invalidCharacters, '', $pValue) !== $pValue) {
 467              throw new PHPExcel_Exception('Invalid character found in sheet title');
 468          }
 469  
 470          // Maximum 31 characters allowed for sheet title
 471          if (PHPExcel_Shared_String::CountCharacters($pValue) > 31) {
 472              throw new PHPExcel_Exception('Maximum 31 characters allowed in sheet title.');
 473          }
 474  
 475          return $pValue;
 476      }
 477  
 478      /**
 479       * Get collection of cells
 480       *
 481       * @param boolean $pSorted Also sort the cell collection?
 482       * @return PHPExcel_Cell[]
 483       */
 484      public function getCellCollection($pSorted = true)
 485      {
 486          if ($pSorted) {
 487              // Re-order cell collection
 488              return $this->sortCellCollection();
 489          }
 490          if ($this->_cellCollection !== NULL) {
 491              return $this->_cellCollection->getCellList();
 492          }
 493          return array();
 494      }
 495  
 496      /**
 497       * Sort collection of cells
 498       *
 499       * @return PHPExcel_Worksheet
 500       */
 501      public function sortCellCollection()
 502      {
 503          if ($this->_cellCollection !== NULL) {
 504              return $this->_cellCollection->getSortedCellList();
 505          }
 506          return array();
 507      }
 508  
 509      /**
 510       * Get collection of row dimensions
 511       *
 512       * @return PHPExcel_Worksheet_RowDimension[]
 513       */
 514      public function getRowDimensions()
 515      {
 516          return $this->_rowDimensions;
 517      }
 518  
 519      /**
 520       * Get default row dimension
 521       *
 522       * @return PHPExcel_Worksheet_RowDimension
 523       */
 524      public function getDefaultRowDimension()
 525      {
 526          return $this->_defaultRowDimension;
 527      }
 528  
 529      /**
 530       * Get collection of column dimensions
 531       *
 532       * @return PHPExcel_Worksheet_ColumnDimension[]
 533       */
 534      public function getColumnDimensions()
 535      {
 536          return $this->_columnDimensions;
 537      }
 538  
 539      /**
 540       * Get default column dimension
 541       *
 542       * @return PHPExcel_Worksheet_ColumnDimension
 543       */
 544      public function getDefaultColumnDimension()
 545      {
 546          return $this->_defaultColumnDimension;
 547      }
 548  
 549      /**
 550       * Get collection of drawings
 551       *
 552       * @return PHPExcel_Worksheet_BaseDrawing[]
 553       */
 554      public function getDrawingCollection()
 555      {
 556          return $this->_drawingCollection;
 557      }
 558  
 559      /**
 560       * Get collection of charts
 561       *
 562       * @return PHPExcel_Chart[]
 563       */
 564      public function getChartCollection()
 565      {
 566          return $this->_chartCollection;
 567      }
 568  
 569      /**
 570       * Add chart
 571       *
 572       * @param PHPExcel_Chart $pChart
 573       * @param int|null $iChartIndex Index where chart should go (0,1,..., or null for last)
 574       * @return PHPExcel_Chart
 575       */
 576      public function addChart(PHPExcel_Chart $pChart = null, $iChartIndex = null)
 577      {
 578          $pChart->setWorksheet($this);
 579          if (is_null($iChartIndex)) {
 580              $this->_chartCollection[] = $pChart;
 581          } else {
 582              // Insert the chart at the requested index
 583              array_splice($this->_chartCollection, $iChartIndex, 0, array($pChart));
 584          }
 585  
 586          return $pChart;
 587      }
 588  
 589      /**
 590       * Return the count of charts on this worksheet
 591       *
 592       * @return int        The number of charts
 593       */
 594      public function getChartCount()
 595      {
 596          return count($this->_chartCollection);
 597      }
 598  
 599      /**
 600       * Get a chart by its index position
 601       *
 602       * @param string $index Chart index position
 603       * @return false|PHPExcel_Chart
 604       * @throws PHPExcel_Exception
 605       */
 606      public function getChartByIndex($index = null)
 607      {
 608          $chartCount = count($this->_chartCollection);
 609          if ($chartCount == 0) {
 610              return false;
 611          }
 612          if (is_null($index)) {
 613              $index = --$chartCount;
 614          }
 615          if (!isset($this->_chartCollection[$index])) {
 616              return false;
 617          }
 618  
 619          return $this->_chartCollection[$index];
 620      }
 621  
 622      /**
 623       * Return an array of the names of charts on this worksheet
 624       *
 625       * @return string[] The names of charts
 626       * @throws PHPExcel_Exception
 627       */
 628      public function getChartNames()
 629      {
 630          $chartNames = array();
 631          foreach($this->_chartCollection as $chart) {
 632              $chartNames[] = $chart->getName();
 633          }
 634          return $chartNames;
 635      }
 636  
 637      /**
 638       * Get a chart by name
 639       *
 640       * @param string $chartName Chart name
 641       * @return false|PHPExcel_Chart
 642       * @throws PHPExcel_Exception
 643       */
 644      public function getChartByName($chartName = '')
 645      {
 646          $chartCount = count($this->_chartCollection);
 647          if ($chartCount == 0) {
 648              return false;
 649          }
 650          foreach($this->_chartCollection as $index => $chart) {
 651              if ($chart->getName() == $chartName) {
 652                  return $this->_chartCollection[$index];
 653              }
 654          }
 655          return false;
 656      }
 657  
 658      /**
 659       * Refresh column dimensions
 660       *
 661       * @return PHPExcel_Worksheet
 662       */
 663      public function refreshColumnDimensions()
 664      {
 665          $currentColumnDimensions = $this->getColumnDimensions();
 666          $newColumnDimensions = array();
 667  
 668          foreach ($currentColumnDimensions as $objColumnDimension) {
 669              $newColumnDimensions[$objColumnDimension->getColumnIndex()] = $objColumnDimension;
 670          }
 671  
 672          $this->_columnDimensions = $newColumnDimensions;
 673  
 674          return $this;
 675      }
 676  
 677      /**
 678       * Refresh row dimensions
 679       *
 680       * @return PHPExcel_Worksheet
 681       */
 682      public function refreshRowDimensions()
 683      {
 684          $currentRowDimensions = $this->getRowDimensions();
 685          $newRowDimensions = array();
 686  
 687          foreach ($currentRowDimensions as $objRowDimension) {
 688              $newRowDimensions[$objRowDimension->getRowIndex()] = $objRowDimension;
 689          }
 690  
 691          $this->_rowDimensions = $newRowDimensions;
 692  
 693          return $this;
 694      }
 695  
 696      /**
 697       * Calculate worksheet dimension
 698       *
 699       * @return string  String containing the dimension of this worksheet
 700       */
 701      public function calculateWorksheetDimension()
 702      {
 703          // Return
 704          return 'A1' . ':' .  $this->getHighestColumn() . $this->getHighestRow();
 705      }
 706  
 707      /**
 708       * Calculate worksheet data dimension
 709       *
 710       * @return string  String containing the dimension of this worksheet that actually contain data
 711       */
 712      public function calculateWorksheetDataDimension()
 713      {
 714          // Return
 715          return 'A1' . ':' .  $this->getHighestDataColumn() . $this->getHighestDataRow();
 716      }
 717  
 718      /**
 719       * Calculate widths for auto-size columns
 720       *
 721       * @param  boolean  $calculateMergeCells  Calculate merge cell width
 722       * @return PHPExcel_Worksheet;
 723       */
 724      public function calculateColumnWidths($calculateMergeCells = false)
 725      {
 726          // initialize $autoSizes array
 727          $autoSizes = array();
 728          foreach ($this->getColumnDimensions() as $colDimension) {
 729              if ($colDimension->getAutoSize()) {
 730                  $autoSizes[$colDimension->getColumnIndex()] = -1;
 731              }
 732          }
 733  
 734          // There is only something to do if there are some auto-size columns
 735          if (!empty($autoSizes)) {
 736  
 737              // build list of cells references that participate in a merge
 738              $isMergeCell = array();
 739              foreach ($this->getMergeCells() as $cells) {
 740                  foreach (PHPExcel_Cell::extractAllCellReferencesInRange($cells) as $cellReference) {
 741                      $isMergeCell[$cellReference] = true;
 742                  }
 743              }
 744  
 745              // loop through all cells in the worksheet
 746              foreach ($this->getCellCollection(false) as $cellID) {
 747                  $cell = $this->getCell($cellID);
 748                  if (isset($autoSizes[$this->_cellCollection->getCurrentColumn()])) {
 749                      // Determine width if cell does not participate in a merge
 750                      if (!isset($isMergeCell[$this->_cellCollection->getCurrentAddress()])) {
 751                          // Calculated value
 752                          // To formatted string
 753                          $cellValue = PHPExcel_Style_NumberFormat::toFormattedString(
 754                              $cell->getCalculatedValue(),
 755                              $this->getParent()->getCellXfByIndex($cell->getXfIndex())->getNumberFormat()->getFormatCode()
 756                          );
 757  
 758                          $autoSizes[$this->_cellCollection->getCurrentColumn()] = max(
 759                              (float) $autoSizes[$this->_cellCollection->getCurrentColumn()],
 760                              (float)PHPExcel_Shared_Font::calculateColumnWidth(
 761                                  $this->getParent()->getCellXfByIndex($cell->getXfIndex())->getFont(),
 762                                  $cellValue,
 763                                  $this->getParent()->getCellXfByIndex($cell->getXfIndex())->getAlignment()->getTextRotation(),
 764                                  $this->getDefaultStyle()->getFont()
 765                              )
 766                          );
 767                      }
 768                  }
 769              }
 770  
 771              // adjust column widths
 772              foreach ($autoSizes as $columnIndex => $width) {
 773                  if ($width == -1) $width = $this->getDefaultColumnDimension()->getWidth();
 774                  $this->getColumnDimension($columnIndex)->setWidth($width);
 775              }
 776          }
 777  
 778          return $this;
 779      }
 780  
 781      /**
 782       * Get parent
 783       *
 784       * @return PHPExcel
 785       */
 786  	public function getParent() {
 787          return $this->_parent;
 788      }
 789  
 790      /**
 791       * Re-bind parent
 792       *
 793       * @param PHPExcel $parent
 794       * @return PHPExcel_Worksheet
 795       */
 796  	public function rebindParent(PHPExcel $parent) {
 797          if ($this->_parent !== null) {
 798              $namedRanges = $this->_parent->getNamedRanges();
 799              foreach ($namedRanges as $namedRange) {
 800                  $parent->addNamedRange($namedRange);
 801              }
 802  
 803              $this->_parent->removeSheetByIndex(
 804                  $this->_parent->getIndex($this)
 805              );
 806          }
 807          $this->_parent = $parent;
 808  
 809          return $this;
 810      }
 811  
 812      /**
 813       * Get title
 814       *
 815       * @return string
 816       */
 817      public function getTitle()
 818      {
 819          return $this->_title;
 820      }
 821  
 822      /**
 823       * Set title
 824       *
 825       * @param string $pValue String containing the dimension of this worksheet
 826       * @param string $updateFormulaCellReferences boolean Flag indicating whether cell references in formulae should
 827       *            be updated to reflect the new sheet name.
 828       *          This should be left as the default true, unless you are
 829       *          certain that no formula cells on any worksheet contain
 830       *          references to this worksheet
 831       * @return PHPExcel_Worksheet
 832       */
 833      public function setTitle($pValue = 'Worksheet', $updateFormulaCellReferences = true)
 834      {
 835          // Is this a 'rename' or not?
 836          if ($this->getTitle() == $pValue) {
 837              return $this;
 838          }
 839  
 840          // Syntax check
 841          self::_checkSheetTitle($pValue);
 842  
 843          // Old title
 844          $oldTitle = $this->getTitle();
 845  
 846          if ($this->_parent) {
 847              // Is there already such sheet name?
 848              if ($this->_parent->sheetNameExists($pValue)) {
 849                  // Use name, but append with lowest possible integer
 850  
 851                  if (PHPExcel_Shared_String::CountCharacters($pValue) > 29) {
 852                      $pValue = PHPExcel_Shared_String::Substring($pValue,0,29);
 853                  }
 854                  $i = 1;
 855                  while ($this->_parent->sheetNameExists($pValue . ' ' . $i)) {
 856                      ++$i;
 857                      if ($i == 10) {
 858                          if (PHPExcel_Shared_String::CountCharacters($pValue) > 28) {
 859                              $pValue = PHPExcel_Shared_String::Substring($pValue,0,28);
 860                          }
 861                      } elseif ($i == 100) {
 862                          if (PHPExcel_Shared_String::CountCharacters($pValue) > 27) {
 863                              $pValue = PHPExcel_Shared_String::Substring($pValue,0,27);
 864                          }
 865                      }
 866                  }
 867  
 868                  $altTitle = $pValue . ' ' . $i;
 869                  return $this->setTitle($altTitle,$updateFormulaCellReferences);
 870              }
 871          }
 872  
 873          // Set title
 874          $this->_title = $pValue;
 875          $this->_dirty = true;
 876  
 877          if ($this->_parent) {
 878              // New title
 879              $newTitle = $this->getTitle();
 880              PHPExcel_Calculation::getInstance($this->_parent)
 881                  ->renameCalculationCacheForWorksheet($oldTitle, $newTitle);
 882              if ($updateFormulaCellReferences)
 883                  PHPExcel_ReferenceHelper::getInstance()->updateNamedFormulas($this->_parent, $oldTitle, $newTitle);
 884          }
 885  
 886          return $this;
 887      }
 888  
 889      /**
 890       * Get sheet state
 891       *
 892       * @return string Sheet state (visible, hidden, veryHidden)
 893       */
 894  	public function getSheetState() {
 895          return $this->_sheetState;
 896      }
 897  
 898      /**
 899       * Set sheet state
 900       *
 901       * @param string $value Sheet state (visible, hidden, veryHidden)
 902       * @return PHPExcel_Worksheet
 903       */
 904  	public function setSheetState($value = PHPExcel_Worksheet::SHEETSTATE_VISIBLE) {
 905          $this->_sheetState = $value;
 906          return $this;
 907      }
 908  
 909      /**
 910       * Get page setup
 911       *
 912       * @return PHPExcel_Worksheet_PageSetup
 913       */
 914      public function getPageSetup()
 915      {
 916          return $this->_pageSetup;
 917      }
 918  
 919      /**
 920       * Set page setup
 921       *
 922       * @param PHPExcel_Worksheet_PageSetup    $pValue
 923       * @return PHPExcel_Worksheet
 924       */
 925      public function setPageSetup(PHPExcel_Worksheet_PageSetup $pValue)
 926      {
 927          $this->_pageSetup = $pValue;
 928          return $this;
 929      }
 930  
 931      /**
 932       * Get page margins
 933       *
 934       * @return PHPExcel_Worksheet_PageMargins
 935       */
 936      public function getPageMargins()
 937      {
 938          return $this->_pageMargins;
 939      }
 940  
 941      /**
 942       * Set page margins
 943       *
 944       * @param PHPExcel_Worksheet_PageMargins    $pValue
 945       * @return PHPExcel_Worksheet
 946       */
 947      public function setPageMargins(PHPExcel_Worksheet_PageMargins $pValue)
 948      {
 949          $this->_pageMargins = $pValue;
 950          return $this;
 951      }
 952  
 953      /**
 954       * Get page header/footer
 955       *
 956       * @return PHPExcel_Worksheet_HeaderFooter
 957       */
 958      public function getHeaderFooter()
 959      {
 960          return $this->_headerFooter;
 961      }
 962  
 963      /**
 964       * Set page header/footer
 965       *
 966       * @param PHPExcel_Worksheet_HeaderFooter    $pValue
 967       * @return PHPExcel_Worksheet
 968       */
 969      public function setHeaderFooter(PHPExcel_Worksheet_HeaderFooter $pValue)
 970      {
 971          $this->_headerFooter = $pValue;
 972          return $this;
 973      }
 974  
 975      /**
 976       * Get sheet view
 977       *
 978       * @return PHPExcel_Worksheet_SheetView
 979       */
 980      public function getSheetView()
 981      {
 982          return $this->_sheetView;
 983      }
 984  
 985      /**
 986       * Set sheet view
 987       *
 988       * @param PHPExcel_Worksheet_SheetView    $pValue
 989       * @return PHPExcel_Worksheet
 990       */
 991      public function setSheetView(PHPExcel_Worksheet_SheetView $pValue)
 992      {
 993          $this->_sheetView = $pValue;
 994          return $this;
 995      }
 996  
 997      /**
 998       * Get Protection
 999       *
1000       * @return PHPExcel_Worksheet_Protection
1001       */
1002      public function getProtection()
1003      {
1004          return $this->_protection;
1005      }
1006  
1007      /**
1008       * Set Protection
1009       *
1010       * @param PHPExcel_Worksheet_Protection    $pValue
1011       * @return PHPExcel_Worksheet
1012       */
1013      public function setProtection(PHPExcel_Worksheet_Protection $pValue)
1014      {
1015          $this->_protection = $pValue;
1016          $this->_dirty = true;
1017  
1018          return $this;
1019      }
1020  
1021      /**
1022       * Get highest worksheet column
1023       *
1024       * @param   string     $row        Return the data highest column for the specified row,
1025       *                                     or the highest column of any row if no row number is passed
1026       * @return string Highest column name
1027       */
1028      public function getHighestColumn($row = null)
1029      {
1030          if ($row == null) {
1031              return $this->_cachedHighestColumn;
1032          }
1033          return $this->getHighestDataColumn($row);
1034      }
1035  
1036      /**
1037       * Get highest worksheet column that contains data
1038       *
1039       * @param   string     $row        Return the highest data column for the specified row,
1040       *                                     or the highest data column of any row if no row number is passed
1041       * @return string Highest column name that contains data
1042       */
1043      public function getHighestDataColumn($row = null)
1044      {
1045          return $this->_cellCollection->getHighestColumn($row);
1046      }
1047  
1048      /**
1049       * Get highest worksheet row
1050       *
1051       * @param   string     $column     Return the highest data row for the specified column,
1052       *                                     or the highest row of any column if no column letter is passed
1053       * @return int Highest row number
1054       */
1055      public function getHighestRow($column = null)
1056      {
1057          if ($column == null) {
1058              return $this->_cachedHighestRow;
1059          }
1060          return $this->getHighestDataRow($column);
1061      }
1062  
1063      /**
1064       * Get highest worksheet row that contains data
1065       *
1066       * @param   string     $column     Return the highest data row for the specified column,
1067       *                                     or the highest data row of any column if no column letter is passed
1068       * @return string Highest row number that contains data
1069       */
1070      public function getHighestDataRow($column = null)
1071      {
1072          return $this->_cellCollection->getHighestRow($column);
1073      }
1074  
1075      /**
1076       * Get highest worksheet column and highest row that have cell records
1077       *
1078       * @return array Highest column name and highest row number
1079       */
1080      public function getHighestRowAndColumn()
1081      {
1082          return $this->_cellCollection->getHighestRowAndColumn();
1083      }
1084  
1085      /**
1086       * Set a cell value
1087       *
1088       * @param string $pCoordinate Coordinate of the cell
1089       * @param mixed $pValue Value of the cell
1090       * @param bool $returnCell   Return the worksheet (false, default) or the cell (true)
1091       * @return PHPExcel_Worksheet|PHPExcel_Cell    Depending on the last parameter being specified
1092       */
1093      public function setCellValue($pCoordinate = 'A1', $pValue = null, $returnCell = false)
1094      {
1095          $cell = $this->getCell($pCoordinate)->setValue($pValue);
1096          return ($returnCell) ? $cell : $this;
1097      }
1098  
1099      /**
1100       * Set a cell value by using numeric cell coordinates
1101       *
1102       * @param string $pColumn Numeric column coordinate of the cell (A = 0)
1103       * @param string $pRow Numeric row coordinate of the cell
1104       * @param mixed $pValue Value of the cell
1105       * @param bool $returnCell Return the worksheet (false, default) or the cell (true)
1106       * @return PHPExcel_Worksheet|PHPExcel_Cell    Depending on the last parameter being specified
1107       */
1108      public function setCellValueByColumnAndRow($pColumn = 0, $pRow = 1, $pValue = null, $returnCell = false)
1109      {
1110          $cell = $this->getCellByColumnAndRow($pColumn, $pRow)->setValue($pValue);
1111          return ($returnCell) ? $cell : $this;
1112      }
1113  
1114      /**
1115       * Set a cell value
1116       *
1117       * @param string $pCoordinate Coordinate of the cell
1118       * @param mixed  $pValue Value of the cell
1119       * @param string $pDataType Explicit data type
1120       * @param bool $returnCell Return the worksheet (false, default) or the cell (true)
1121       * @return PHPExcel_Worksheet|PHPExcel_Cell    Depending on the last parameter being specified
1122       */
1123      public function setCellValueExplicit($pCoordinate = 'A1', $pValue = null, $pDataType = PHPExcel_Cell_DataType::TYPE_STRING, $returnCell = false)
1124      {
1125          // Set value
1126          $cell = $this->getCell($pCoordinate)->setValueExplicit($pValue, $pDataType);
1127          return ($returnCell) ? $cell : $this;
1128      }
1129  
1130      /**
1131       * Set a cell value by using numeric cell coordinates
1132       *
1133       * @param string $pColumn Numeric column coordinate of the cell
1134       * @param string $pRow Numeric row coordinate of the cell
1135       * @param mixed $pValue Value of the cell
1136       * @param string $pDataType Explicit data type
1137       * @param bool $returnCell Return the worksheet (false, default) or the cell (true)
1138       * @return PHPExcel_Worksheet|PHPExcel_Cell    Depending on the last parameter being specified
1139       */
1140      public function setCellValueExplicitByColumnAndRow($pColumn = 0, $pRow = 1, $pValue = null, $pDataType = PHPExcel_Cell_DataType::TYPE_STRING, $returnCell = false)
1141      {
1142          $cell = $this->getCellByColumnAndRow($pColumn, $pRow)->setValueExplicit($pValue, $pDataType);
1143          return ($returnCell) ? $cell : $this;
1144      }
1145  
1146      /**
1147       * Get cell at a specific coordinate
1148       *
1149       * @param string $pCoordinate    Coordinate of the cell
1150       * @throws PHPExcel_Exception
1151       * @return PHPExcel_Cell Cell that was found
1152       */
1153      public function getCell($pCoordinate = 'A1')
1154      {
1155          // Check cell collection
1156          if ($this->_cellCollection->isDataSet($pCoordinate)) {
1157              return $this->_cellCollection->getCacheData($pCoordinate);
1158          }
1159  
1160          // Worksheet reference?
1161          if (strpos($pCoordinate, '!') !== false) {
1162              $worksheetReference = PHPExcel_Worksheet::extractSheetTitle($pCoordinate, true);
1163              return $this->_parent->getSheetByName($worksheetReference[0])->getCell($worksheetReference[1]);
1164          }
1165  
1166          // Named range?
1167          if ((!preg_match('/^'.PHPExcel_Calculation::CALCULATION_REGEXP_CELLREF.'$/i', $pCoordinate, $matches)) &&
1168              (preg_match('/^'.PHPExcel_Calculation::CALCULATION_REGEXP_NAMEDRANGE.'$/i', $pCoordinate, $matches))) {
1169              $namedRange = PHPExcel_NamedRange::resolveRange($pCoordinate, $this);
1170              if ($namedRange !== NULL) {
1171                  $pCoordinate = $namedRange->getRange();
1172                  return $namedRange->getWorksheet()->getCell($pCoordinate);
1173              }
1174          }
1175  
1176          // Uppercase coordinate
1177          $pCoordinate = strtoupper($pCoordinate);
1178  
1179          if (strpos($pCoordinate, ':') !== false || strpos($pCoordinate, ',') !== false) {
1180              throw new PHPExcel_Exception('Cell coordinate can not be a range of cells.');
1181          } elseif (strpos($pCoordinate, '$') !== false) {
1182              throw new PHPExcel_Exception('Cell coordinate must not be absolute.');
1183          }
1184  
1185          // Create new cell object
1186          return $this->_createNewCell($pCoordinate);
1187      }
1188  
1189      /**
1190       * Get cell at a specific coordinate by using numeric cell coordinates
1191       *
1192       * @param  string $pColumn Numeric column coordinate of the cell
1193       * @param string $pRow Numeric row coordinate of the cell
1194       * @return PHPExcel_Cell Cell that was found
1195       */
1196      public function getCellByColumnAndRow($pColumn = 0, $pRow = 1)
1197      {
1198          $columnLetter = PHPExcel_Cell::stringFromColumnIndex($pColumn);
1199          $coordinate = $columnLetter . $pRow;
1200  
1201          if ($this->_cellCollection->isDataSet($coordinate)) {
1202              return $this->_cellCollection->getCacheData($coordinate);
1203          }
1204  
1205          return $this->_createNewCell($coordinate);
1206      }
1207  
1208      /**
1209       * Create a new cell at the specified coordinate
1210       *
1211       * @param string $pCoordinate    Coordinate of the cell
1212       * @return PHPExcel_Cell Cell that was created
1213       */
1214  	private function _createNewCell($pCoordinate)
1215      {
1216          $cell = $this->_cellCollection->addCacheData(
1217              $pCoordinate,
1218              new PHPExcel_Cell(
1219                  NULL, 
1220                  PHPExcel_Cell_DataType::TYPE_NULL, 
1221                  $this
1222              )
1223          );
1224          $this->_cellCollectionIsSorted = false;
1225  
1226          // Coordinates
1227          $aCoordinates = PHPExcel_Cell::coordinateFromString($pCoordinate);
1228          if (PHPExcel_Cell::columnIndexFromString($this->_cachedHighestColumn) < PHPExcel_Cell::columnIndexFromString($aCoordinates[0]))
1229              $this->_cachedHighestColumn = $aCoordinates[0];
1230          $this->_cachedHighestRow = max($this->_cachedHighestRow, $aCoordinates[1]);
1231  
1232          // Cell needs appropriate xfIndex from dimensions records
1233          //    but don't create dimension records if they don't already exist
1234          $rowDimension    = $this->getRowDimension($aCoordinates[1], FALSE);
1235          $columnDimension = $this->getColumnDimension($aCoordinates[0], FALSE);
1236  
1237          if ($rowDimension !== NULL && $rowDimension->getXfIndex() > 0) {
1238              // then there is a row dimension with explicit style, assign it to the cell
1239              $cell->setXfIndex($rowDimension->getXfIndex());
1240          } elseif ($columnDimension !== NULL && $columnDimension->getXfIndex() > 0) {
1241              // then there is a column dimension, assign it to the cell
1242              $cell->setXfIndex($columnDimension->getXfIndex());
1243          }
1244  
1245          return $cell;
1246      }
1247      
1248      /**
1249       * Does the cell at a specific coordinate exist?
1250       *
1251       * @param string $pCoordinate  Coordinate of the cell
1252       * @throws PHPExcel_Exception
1253       * @return boolean
1254       */
1255      public function cellExists($pCoordinate = 'A1')
1256      {
1257          // Worksheet reference?
1258          if (strpos($pCoordinate, '!') !== false) {
1259              $worksheetReference = PHPExcel_Worksheet::extractSheetTitle($pCoordinate, true);
1260              return $this->_parent->getSheetByName($worksheetReference[0])->cellExists($worksheetReference[1]);
1261          }
1262  
1263          // Named range?
1264          if ((!preg_match('/^'.PHPExcel_Calculation::CALCULATION_REGEXP_CELLREF.'$/i', $pCoordinate, $matches)) &&
1265              (preg_match('/^'.PHPExcel_Calculation::CALCULATION_REGEXP_NAMEDRANGE.'$/i', $pCoordinate, $matches))) {
1266              $namedRange = PHPExcel_NamedRange::resolveRange($pCoordinate, $this);
1267              if ($namedRange !== NULL) {
1268                  $pCoordinate = $namedRange->getRange();
1269                  if ($this->getHashCode() != $namedRange->getWorksheet()->getHashCode()) {
1270                      if (!$namedRange->getLocalOnly()) {
1271                          return $namedRange->getWorksheet()->cellExists($pCoordinate);
1272                      } else {
1273                          throw new PHPExcel_Exception('Named range ' . $namedRange->getName() . ' is not accessible from within sheet ' . $this->getTitle());
1274                      }
1275                  }
1276              }
1277              else { return false; }
1278          }
1279  
1280          // Uppercase coordinate
1281          $pCoordinate = strtoupper($pCoordinate);
1282  
1283          if (strpos($pCoordinate,':') !== false || strpos($pCoordinate,',') !== false) {
1284              throw new PHPExcel_Exception('Cell coordinate can not be a range of cells.');
1285          } elseif (strpos($pCoordinate,'$') !== false) {
1286              throw new PHPExcel_Exception('Cell coordinate must not be absolute.');
1287          } else {
1288              // Coordinates
1289              $aCoordinates = PHPExcel_Cell::coordinateFromString($pCoordinate);
1290  
1291              // Cell exists?
1292              return $this->_cellCollection->isDataSet($pCoordinate);
1293          }
1294      }
1295  
1296      /**
1297       * Cell at a specific coordinate by using numeric cell coordinates exists?
1298       *
1299       * @param string $pColumn Numeric column coordinate of the cell
1300       * @param string $pRow Numeric row coordinate of the cell
1301       * @return boolean
1302       */
1303      public function cellExistsByColumnAndRow($pColumn = 0, $pRow = 1)
1304      {
1305          return $this->cellExists(PHPExcel_Cell::stringFromColumnIndex($pColumn) . $pRow);
1306      }
1307  
1308      /**
1309       * Get row dimension at a specific row
1310       *
1311       * @param int $pRow Numeric index of the row
1312       * @return PHPExcel_Worksheet_RowDimension
1313       */
1314      public function getRowDimension($pRow = 1, $create = TRUE)
1315      {
1316          // Found
1317          $found = null;
1318  
1319          // Get row dimension
1320          if (!isset($this->_rowDimensions[$pRow])) {
1321              if (!$create)
1322                  return NULL;
1323              $this->_rowDimensions[$pRow] = new PHPExcel_Worksheet_RowDimension($pRow);
1324  
1325              $this->_cachedHighestRow = max($this->_cachedHighestRow,$pRow);
1326          }
1327          return $this->_rowDimensions[$pRow];
1328      }
1329  
1330      /**
1331       * Get column dimension at a specific column
1332       *
1333       * @param string $pColumn String index of the column
1334       * @return PHPExcel_Worksheet_ColumnDimension
1335       */
1336      public function getColumnDimension($pColumn = 'A', $create = TRUE)
1337      {
1338          // Uppercase coordinate
1339          $pColumn = strtoupper($pColumn);
1340  
1341          // Fetch dimensions
1342          if (!isset($this->_columnDimensions[$pColumn])) {
1343              if (!$create)
1344                  return NULL;
1345              $this->_columnDimensions[$pColumn] = new PHPExcel_Worksheet_ColumnDimension($pColumn);
1346  
1347              if (PHPExcel_Cell::columnIndexFromString($this->_cachedHighestColumn) < PHPExcel_Cell::columnIndexFromString($pColumn))
1348                  $this->_cachedHighestColumn = $pColumn;
1349          }
1350          return $this->_columnDimensions[$pColumn];
1351      }
1352  
1353      /**
1354       * Get column dimension at a specific column by using numeric cell coordinates
1355       *
1356       * @param string $pColumn Numeric column coordinate of the cell
1357       * @return PHPExcel_Worksheet_ColumnDimension
1358       */
1359      public function getColumnDimensionByColumn($pColumn = 0)
1360      {
1361          return $this->getColumnDimension(PHPExcel_Cell::stringFromColumnIndex($pColumn));
1362      }
1363  
1364      /**
1365       * Get styles
1366       *
1367       * @return PHPExcel_Style[]
1368       */
1369      public function getStyles()
1370      {
1371          return $this->_styles;
1372      }
1373  
1374      /**
1375       * Get default style of workbook.
1376       *
1377       * @deprecated
1378       * @return PHPExcel_Style
1379       * @throws PHPExcel_Exception
1380       */
1381      public function getDefaultStyle()
1382      {
1383          return $this->_parent->getDefaultStyle();
1384      }
1385  
1386      /**
1387       * Set default style - should only be used by PHPExcel_IReader implementations!
1388       *
1389       * @deprecated
1390       * @param PHPExcel_Style $pValue
1391       * @throws PHPExcel_Exception
1392       * @return PHPExcel_Worksheet
1393       */
1394      public function setDefaultStyle(PHPExcel_Style $pValue)
1395      {
1396          $this->_parent->getDefaultStyle()->applyFromArray(array(
1397              'font' => array(
1398                  'name' => $pValue->getFont()->getName(),
1399                  'size' => $pValue->getFont()->getSize(),
1400              ),
1401          ));
1402          return $this;
1403      }
1404  
1405      /**
1406       * Get style for cell
1407       *
1408       * @param string $pCellCoordinate Cell coordinate to get style for
1409       * @return PHPExcel_Style
1410       * @throws PHPExcel_Exception
1411       */
1412      public function getStyle($pCellCoordinate = 'A1')
1413      {
1414          // set this sheet as active
1415          $this->_parent->setActiveSheetIndex($this->_parent->getIndex($this));
1416  
1417          // set cell coordinate as active
1418          $this->setSelectedCells($pCellCoordinate);
1419  
1420          return $this->_parent->getCellXfSupervisor();
1421      }
1422  
1423      /**
1424       * Get conditional styles for a cell
1425       *
1426       * @param string $pCoordinate
1427       * @return PHPExcel_Style_Conditional[]
1428       */
1429      public function getConditionalStyles($pCoordinate = 'A1')
1430      {
1431          if (!isset($this->_conditionalStylesCollection[$pCoordinate])) {
1432              $this->_conditionalStylesCollection[$pCoordinate] = array();
1433          }
1434          return $this->_conditionalStylesCollection[$pCoordinate];
1435      }
1436  
1437      /**
1438       * Do conditional styles exist for this cell?
1439       *
1440       * @param string $pCoordinate
1441       * @return boolean
1442       */
1443      public function conditionalStylesExists($pCoordinate = 'A1')
1444      {
1445          if (isset($this->_conditionalStylesCollection[$pCoordinate])) {
1446              return true;
1447          }
1448          return false;
1449      }
1450  
1451      /**
1452       * Removes conditional styles for a cell
1453       *
1454       * @param string $pCoordinate
1455       * @return PHPExcel_Worksheet
1456       */
1457      public function removeConditionalStyles($pCoordinate = 'A1')
1458      {
1459          unset($this->_conditionalStylesCollection[$pCoordinate]);
1460          return $this;
1461      }
1462  
1463      /**
1464       * Get collection of conditional styles
1465       *
1466       * @return array
1467       */
1468      public function getConditionalStylesCollection()
1469      {
1470          return $this->_conditionalStylesCollection;
1471      }
1472  
1473      /**
1474       * Set conditional styles
1475       *
1476       * @param $pCoordinate string E.g. 'A1'
1477       * @param $pValue PHPExcel_Style_Conditional[]
1478       * @return PHPExcel_Worksheet
1479       */
1480      public function setConditionalStyles($pCoordinate = 'A1', $pValue)
1481      {
1482          $this->_conditionalStylesCollection[$pCoordinate] = $pValue;
1483          return $this;
1484      }
1485  
1486      /**
1487       * Get style for cell by using numeric cell coordinates
1488       *
1489       * @param int $pColumn  Numeric column coordinate of the cell
1490       * @param int $pRow Numeric row coordinate of the cell
1491       * @return PHPExcel_Style
1492       */
1493      public function getStyleByColumnAndRow($pColumn = 0, $pRow = 1)
1494      {
1495          return $this->getStyle(PHPExcel_Cell::stringFromColumnIndex($pColumn) . $pRow);
1496      }
1497  
1498      /**
1499       * Set shared cell style to a range of cells
1500       *
1501       * Please note that this will overwrite existing cell styles for cells in range!
1502       *
1503       * @deprecated
1504       * @param PHPExcel_Style $pSharedCellStyle Cell style to share
1505       * @param string $pRange Range of cells (i.e. "A1:B10"), or just one cell (i.e. "A1")
1506       * @throws PHPExcel_Exception
1507       * @return PHPExcel_Worksheet
1508       */
1509      public function setSharedStyle(PHPExcel_Style $pSharedCellStyle = null, $pRange = '')
1510      {
1511          $this->duplicateStyle($pSharedCellStyle, $pRange);
1512          return $this;
1513      }
1514  
1515      /**
1516       * Duplicate cell style to a range of cells
1517       *
1518       * Please note that this will overwrite existing cell styles for cells in range!
1519       *
1520       * @param PHPExcel_Style $pCellStyle Cell style to duplicate
1521       * @param string $pRange Range of cells (i.e. "A1:B10"), or just one cell (i.e. "A1")
1522       * @throws PHPExcel_Exception
1523       * @return PHPExcel_Worksheet
1524       */
1525      public function duplicateStyle(PHPExcel_Style $pCellStyle = null, $pRange = '')
1526      {
1527          // make sure we have a real style and not supervisor
1528          $style = $pCellStyle->getIsSupervisor() ? $pCellStyle->getSharedComponent() : $pCellStyle;
1529  
1530          // Add the style to the workbook if necessary
1531          $workbook = $this->_parent;
1532          if ($existingStyle = $this->_parent->getCellXfByHashCode($pCellStyle->getHashCode())) {
1533              // there is already such cell Xf in our collection
1534              $xfIndex = $existingStyle->getIndex();
1535          } else {
1536              // we don't have such a cell Xf, need to add
1537              $workbook->addCellXf($pCellStyle);
1538              $xfIndex = $pCellStyle->getIndex();
1539          }
1540  
1541          // Calculate range outer borders
1542          list($rangeStart, $rangeEnd) = PHPExcel_Cell::rangeBoundaries($pRange . ':' . $pRange);
1543  
1544          // Make sure we can loop upwards on rows and columns
1545          if ($rangeStart[0] > $rangeEnd[0] && $rangeStart[1] > $rangeEnd[1]) {
1546              $tmp = $rangeStart;
1547              $rangeStart = $rangeEnd;
1548              $rangeEnd = $tmp;
1549          }
1550  
1551          // Loop through cells and apply styles
1552          for ($col = $rangeStart[0]; $col <= $rangeEnd[0]; ++$col) {
1553              for ($row = $rangeStart[1]; $row <= $rangeEnd[1]; ++$row) {
1554                  $this->getCell(PHPExcel_Cell::stringFromColumnIndex($col - 1) . $row)->setXfIndex($xfIndex);
1555              }
1556          }
1557  
1558          return $this;
1559      }
1560  
1561      /**
1562       * Duplicate conditional style to a range of cells
1563       *
1564       * Please note that this will overwrite existing cell styles for cells in range!
1565       *
1566       * @param    array of PHPExcel_Style_Conditional    $pCellStyle    Cell style to duplicate
1567       * @param string $pRange Range of cells (i.e. "A1:B10"), or just one cell (i.e. "A1")
1568       * @throws PHPExcel_Exception
1569       * @return PHPExcel_Worksheet
1570       */
1571      public function duplicateConditionalStyle(array $pCellStyle = null, $pRange = '')
1572      {
1573          foreach($pCellStyle as $cellStyle) {
1574              if (!($cellStyle instanceof PHPExcel_Style_Conditional)) {
1575                  throw new PHPExcel_Exception('Style is not a conditional style');
1576              }
1577          }
1578  
1579          // Calculate range outer borders
1580          list($rangeStart, $rangeEnd) = PHPExcel_Cell::rangeBoundaries($pRange . ':' . $pRange);
1581  
1582          // Make sure we can loop upwards on rows and columns
1583          if ($rangeStart[0] > $rangeEnd[0] && $rangeStart[1] > $rangeEnd[1]) {
1584              $tmp = $rangeStart;
1585              $rangeStart = $rangeEnd;
1586              $rangeEnd = $tmp;
1587          }
1588  
1589          // Loop through cells and apply styles
1590          for ($col = $rangeStart[0]; $col <= $rangeEnd[0]; ++$col) {
1591              for ($row = $rangeStart[1]; $row <= $rangeEnd[1]; ++$row) {
1592                  $this->setConditionalStyles(PHPExcel_Cell::stringFromColumnIndex($col - 1) . $row, $pCellStyle);
1593              }
1594          }
1595  
1596          return $this;
1597      }
1598  
1599      /**
1600       * Duplicate cell style array to a range of cells
1601       *
1602       * Please note that this will overwrite existing cell styles for cells in range,
1603       * if they are in the styles array. For example, if you decide to set a range of
1604       * cells to font bold, only include font bold in the styles array.
1605       *
1606       * @deprecated
1607       * @param array $pStyles Array containing style information
1608       * @param string $pRange Range of cells (i.e. "A1:B10"), or just one cell (i.e. "A1")
1609       * @param boolean $pAdvanced Advanced mode for setting borders.
1610       * @throws PHPExcel_Exception
1611       * @return PHPExcel_Worksheet
1612       */
1613      public function duplicateStyleArray($pStyles = null, $pRange = '', $pAdvanced = true)
1614      {
1615          $this->getStyle($pRange)->applyFromArray($pStyles, $pAdvanced);
1616          return $this;
1617      }
1618  
1619      /**
1620       * Set break on a cell
1621       *
1622       * @param string $pCell Cell coordinate (e.g. A1)
1623       * @param int $pBreak Break type (type of PHPExcel_Worksheet::BREAK_*)
1624       * @throws PHPExcel_Exception
1625       * @return PHPExcel_Worksheet
1626       */
1627      public function setBreak($pCell = 'A1', $pBreak = PHPExcel_Worksheet::BREAK_NONE)
1628      {
1629          // Uppercase coordinate
1630          $pCell = strtoupper($pCell);
1631  
1632          if ($pCell != '') {
1633              if ($pBreak == PHPExcel_Worksheet::BREAK_NONE) {
1634                  if (isset($this->_breaks[$pCell])) {
1635                      unset($this->_breaks[$pCell]);
1636                  }
1637              } else {
1638                  $this->_breaks[$pCell] = $pBreak;
1639              }
1640          } else {
1641              throw new PHPExcel_Exception('No cell coordinate specified.');
1642          }
1643  
1644          return $this;
1645      }
1646  
1647      /**
1648       * Set break on a cell by using numeric cell coordinates
1649       *
1650       * @param integer $pColumn Numeric column coordinate of the cell
1651       * @param integer $pRow Numeric row coordinate of the cell
1652       * @param  integer $pBreak Break type (type of PHPExcel_Worksheet::BREAK_*)
1653       * @return PHPExcel_Worksheet
1654       */
1655      public function setBreakByColumnAndRow($pColumn = 0, $pRow = 1, $pBreak = PHPExcel_Worksheet::BREAK_NONE)
1656      {
1657          return $this->setBreak(PHPExcel_Cell::stringFromColumnIndex($pColumn) . $pRow, $pBreak);
1658      }
1659  
1660      /**
1661       * Get breaks
1662       *
1663       * @return array[]
1664       */
1665      public function getBreaks()
1666      {
1667          return $this->_breaks;
1668      }
1669  
1670      /**
1671       * Set merge on a cell range
1672       *
1673       * @param string $pRange  Cell range (e.g. A1:E1)
1674       * @throws PHPExcel_Exception
1675       * @return PHPExcel_Worksheet
1676       */
1677      public function mergeCells($pRange = 'A1:A1')
1678      {
1679          // Uppercase coordinate
1680          $pRange = strtoupper($pRange);
1681  
1682          if (strpos($pRange,':') !== false) {
1683              $this->_mergeCells[$pRange] = $pRange;
1684  
1685              // make sure cells are created
1686  
1687              // get the cells in the range
1688              $aReferences = PHPExcel_Cell::extractAllCellReferencesInRange($pRange);
1689  
1690              // create upper left cell if it does not already exist
1691              $upperLeft = $aReferences[0];
1692              if (!$this->cellExists($upperLeft)) {
1693                  $this->getCell($upperLeft)->setValueExplicit(null, PHPExcel_Cell_DataType::TYPE_NULL);
1694              }
1695  
1696              // create or blank out the rest of the cells in the range
1697              $count = count($aReferences);
1698              for ($i = 1; $i < $count; $i++) {
1699                  $this->getCell($aReferences[$i])->setValueExplicit(null, PHPExcel_Cell_DataType::TYPE_NULL);
1700              }
1701  
1702          } else {
1703              throw new PHPExcel_Exception('Merge must be set on a range of cells.');
1704          }
1705  
1706          return $this;
1707      }
1708  
1709      /**
1710       * Set merge on a cell range by using numeric cell coordinates
1711       *
1712       * @param int $pColumn1    Numeric column coordinate of the first cell
1713       * @param int $pRow1        Numeric row coordinate of the first cell
1714       * @param int $pColumn2    Numeric column coordinate of the last cell
1715       * @param int $pRow2        Numeric row coordinate of the last cell
1716       * @throws    PHPExcel_Exception
1717       * @return PHPExcel_Worksheet
1718       */
1719      public function mergeCellsByColumnAndRow($pColumn1 = 0, $pRow1 = 1, $pColumn2 = 0, $pRow2 = 1)
1720      {
1721          $cellRange = PHPExcel_Cell::stringFromColumnIndex($pColumn1) . $pRow1 . ':' . PHPExcel_Cell::stringFromColumnIndex($pColumn2) . $pRow2;
1722          return $this->mergeCells($cellRange);
1723      }
1724  
1725      /**
1726       * Remove merge on a cell range
1727       *
1728       * @param    string            $pRange        Cell range (e.g. A1:E1)
1729       * @throws    PHPExcel_Exception
1730       * @return PHPExcel_Worksheet
1731       */
1732      public function unmergeCells($pRange = 'A1:A1')
1733      {
1734          // Uppercase coordinate
1735          $pRange = strtoupper($pRange);
1736  
1737          if (strpos($pRange,':') !== false) {
1738              if (isset($this->_mergeCells[$pRange])) {
1739                  unset($this->_mergeCells[$pRange]);
1740              } else {
1741                  throw new PHPExcel_Exception('Cell range ' . $pRange . ' not known as merged.');
1742              }
1743          } else {
1744              throw new PHPExcel_Exception('Merge can only be removed from a range of cells.');
1745          }
1746  
1747          return $this;
1748      }
1749  
1750      /**
1751       * Remove merge on a cell range by using numeric cell coordinates
1752       *
1753       * @param int $pColumn1    Numeric column coordinate of the first cell
1754       * @param int $pRow1        Numeric row coordinate of the first cell
1755       * @param int $pColumn2    Numeric column coordinate of the last cell
1756       * @param int $pRow2        Numeric row coordinate of the last cell
1757       * @throws    PHPExcel_Exception
1758       * @return PHPExcel_Worksheet
1759       */
1760      public function unmergeCellsByColumnAndRow($pColumn1 = 0, $pRow1 = 1, $pColumn2 = 0, $pRow2 = 1)
1761      {
1762          $cellRange = PHPExcel_Cell::stringFromColumnIndex($pColumn1) . $pRow1 . ':' . PHPExcel_Cell::stringFromColumnIndex($pColumn2) . $pRow2;
1763          return $this->unmergeCells($cellRange);
1764      }
1765  
1766      /**
1767       * Get merge cells array.
1768       *
1769       * @return array[]
1770       */
1771      public function getMergeCells()
1772      {
1773          return $this->_mergeCells;
1774      }
1775  
1776      /**
1777       * Set merge cells array for the entire sheet. Use instead mergeCells() to merge
1778       * a single cell range.
1779       *
1780       * @param array
1781       */
1782      public function setMergeCells($pValue = array())
1783      {
1784          $this->_mergeCells = $pValue;
1785  
1786          return $this;
1787      }
1788  
1789      /**
1790       * Set protection on a cell range
1791       *
1792       * @param    string            $pRange                Cell (e.g. A1) or cell range (e.g. A1:E1)
1793       * @param    string            $pPassword            Password to unlock the protection
1794       * @param    boolean        $pAlreadyHashed    If the password has already been hashed, set this to true
1795       * @throws    PHPExcel_Exception
1796       * @return PHPExcel_Worksheet
1797       */
1798      public function protectCells($pRange = 'A1', $pPassword = '', $pAlreadyHashed = false)
1799      {
1800          // Uppercase coordinate
1801          $pRange = strtoupper($pRange);
1802  
1803          if (!$pAlreadyHashed) {
1804              $pPassword = PHPExcel_Shared_PasswordHasher::hashPassword($pPassword);
1805          }
1806          $this->_protectedCells[$pRange] = $pPassword;
1807  
1808          return $this;
1809      }
1810  
1811      /**
1812       * Set protection on a cell range by using numeric cell coordinates
1813       *
1814       * @param int  $pColumn1            Numeric column coordinate of the first cell
1815       * @param int  $pRow1                Numeric row coordinate of the first cell
1816       * @param int  $pColumn2            Numeric column coordinate of the last cell
1817       * @param int  $pRow2                Numeric row coordinate of the last cell
1818       * @param string $pPassword            Password to unlock the protection
1819       * @param    boolean $pAlreadyHashed    If the password has already been hashed, set this to true
1820       * @throws    PHPExcel_Exception
1821       * @return PHPExcel_Worksheet
1822       */
1823      public function protectCellsByColumnAndRow($pColumn1 = 0, $pRow1 = 1, $pColumn2 = 0, $pRow2 = 1, $pPassword = '', $pAlreadyHashed = false)
1824      {
1825          $cellRange = PHPExcel_Cell::stringFromColumnIndex($pColumn1) . $pRow1 . ':' . PHPExcel_Cell::stringFromColumnIndex($pColumn2) . $pRow2;
1826          return $this->protectCells($cellRange, $pPassword, $pAlreadyHashed);
1827      }
1828  
1829      /**
1830       * Remove protection on a cell range
1831       *
1832       * @param    string            $pRange        Cell (e.g. A1) or cell range (e.g. A1:E1)
1833       * @throws    PHPExcel_Exception
1834       * @return PHPExcel_Worksheet
1835       */
1836      public function unprotectCells($pRange = 'A1')
1837      {
1838          // Uppercase coordinate
1839          $pRange = strtoupper($pRange);
1840  
1841          if (isset($this->_protectedCells[$pRange])) {
1842              unset($this->_protectedCells[$pRange]);
1843          } else {
1844              throw new PHPExcel_Exception('Cell range ' . $pRange . ' not known as protected.');
1845          }
1846          return $this;
1847      }
1848  
1849      /**
1850       * Remove protection on a cell range by using numeric cell coordinates
1851       *
1852       * @param int  $pColumn1            Numeric column coordinate of the first cell
1853       * @param int  $pRow1                Numeric row coordinate of the first cell
1854       * @param int  $pColumn2            Numeric column coordinate of the last cell
1855       * @param int $pRow2                Numeric row coordinate of the last cell
1856       * @param string $pPassword            Password to unlock the protection
1857       * @param    boolean $pAlreadyHashed    If the password has already been hashed, set this to true
1858       * @throws    PHPExcel_Exception
1859       * @return PHPExcel_Worksheet
1860       */
1861      public function unprotectCellsByColumnAndRow($pColumn1 = 0, $pRow1 = 1, $pColumn2 = 0, $pRow2 = 1, $pPassword = '', $pAlreadyHashed = false)
1862      {
1863          $cellRange = PHPExcel_Cell::stringFromColumnIndex($pColumn1) . $pRow1 . ':' . PHPExcel_Cell::stringFromColumnIndex($pColumn2) . $pRow2;
1864          return $this->unprotectCells($cellRange, $pPassword, $pAlreadyHashed);
1865      }
1866  
1867      /**
1868       * Get protected cells
1869       *
1870       * @return array[]
1871       */
1872      public function getProtectedCells()
1873      {
1874          return $this->_protectedCells;
1875      }
1876  
1877      /**
1878       *    Get Autofilter
1879       *
1880       *    @return PHPExcel_Worksheet_AutoFilter
1881       */
1882      public function getAutoFilter()
1883      {
1884          return $this->_autoFilter;
1885      }
1886  
1887      /**
1888       *    Set AutoFilter
1889       *
1890       *    @param    PHPExcel_Worksheet_AutoFilter|string   $pValue
1891       *            A simple string containing a Cell range like 'A1:E10' is permitted for backward compatibility
1892       *    @throws    PHPExcel_Exception
1893       *    @return PHPExcel_Worksheet
1894       */
1895      public function setAutoFilter($pValue)
1896      {
1897          if (is_string($pValue)) {
1898              $this->_autoFilter->setRange($pValue);
1899          } elseif(is_object($pValue) && ($pValue instanceof PHPExcel_Worksheet_AutoFilter)) {
1900              $this->_autoFilter = $pValue;
1901          }
1902          return $this;
1903      }
1904  
1905      /**
1906       *    Set Autofilter Range by using numeric cell coordinates
1907       *
1908       *    @param  integer  $pColumn1    Numeric column coordinate of the first cell
1909       *    @param  integer  $pRow1       Numeric row coordinate of the first cell
1910       *    @param  integer  $pColumn2    Numeric column coordinate of the second cell
1911       *    @param  integer  $pRow2       Numeric row coordinate of the second cell
1912       *    @throws    PHPExcel_Exception
1913       *    @return PHPExcel_Worksheet
1914       */
1915      public function setAutoFilterByColumnAndRow($pColumn1 = 0, $pRow1 = 1, $pColumn2 = 0, $pRow2 = 1)
1916      {
1917          return $this->setAutoFilter(
1918              PHPExcel_Cell::stringFromColumnIndex($pColumn1) . $pRow1
1919              . ':' .
1920              PHPExcel_Cell::stringFromColumnIndex($pColumn2) . $pRow2
1921          );
1922      }
1923  
1924      /**
1925       * Remove autofilter
1926       *
1927       * @return PHPExcel_Worksheet
1928       */
1929      public function removeAutoFilter()
1930      {
1931          $this->_autoFilter->setRange(NULL);
1932          return $this;
1933      }
1934  
1935      /**
1936       * Get Freeze Pane
1937       *
1938       * @return string
1939       */
1940      public function getFreezePane()
1941      {
1942          return $this->_freezePane;
1943      }
1944  
1945      /**
1946       * Freeze Pane
1947       *
1948       * @param    string        $pCell        Cell (i.e. A2)
1949       *                                    Examples:
1950       *                                        A2 will freeze the rows above cell A2 (i.e row 1)
1951       *                                        B1 will freeze the columns to the left of cell B1 (i.e column A)
1952       *                                        B2 will freeze the rows above and to the left of cell A2
1953       *                                            (i.e row 1 and column A)
1954       * @throws    PHPExcel_Exception
1955       * @return PHPExcel_Worksheet
1956       */
1957      public function freezePane($pCell = '')
1958      {
1959          // Uppercase coordinate
1960          $pCell = strtoupper($pCell);
1961  
1962          if (strpos($pCell,':') === false && strpos($pCell,',') === false) {
1963              $this->_freezePane = $pCell;
1964          } else {
1965              throw new PHPExcel_Exception('Freeze pane can not be set on a range of cells.');
1966          }
1967          return $this;
1968      }
1969  
1970      /**
1971       * Freeze Pane by using numeric cell coordinates
1972       *
1973       * @param int $pColumn    Numeric column coordinate of the cell
1974       * @param int $pRow        Numeric row coordinate of the cell
1975       * @throws    PHPExcel_Exception
1976       * @return PHPExcel_Worksheet
1977       */
1978      public function freezePaneByColumnAndRow($pColumn = 0, $pRow = 1)
1979      {
1980          return $this->freezePane(PHPExcel_Cell::stringFromColumnIndex($pColumn) . $pRow);
1981      }
1982  
1983      /**
1984       * Unfreeze Pane
1985       *
1986       * @return PHPExcel_Worksheet
1987       */
1988      public function unfreezePane()
1989      {
1990          return $this->freezePane('');
1991      }
1992  
1993      /**
1994       * Insert a new row, updating all possible related data
1995       *
1996       * @param int $pBefore    Insert before this one
1997       * @param int $pNumRows    Number of rows to insert
1998       * @throws    PHPExcel_Exception
1999       * @return PHPExcel_Worksheet
2000       */
2001      public function insertNewRowBefore($pBefore = 1, $pNumRows = 1) {
2002          if ($pBefore >= 1) {
2003              $objReferenceHelper = PHPExcel_ReferenceHelper::getInstance();
2004              $objReferenceHelper->insertNewBefore('A' . $pBefore, 0, $pNumRows, $this);
2005          } else {
2006              throw new PHPExcel_Exception("Rows can only be inserted before at least row 1.");
2007          }
2008          return $this;
2009      }
2010  
2011      /**
2012       * Insert a new column, updating all possible related data
2013       *
2014       * @param int $pBefore    Insert before this one
2015       * @param int $pNumCols    Number of columns to insert
2016       * @throws    PHPExcel_Exception
2017       * @return PHPExcel_Worksheet
2018       */
2019      public function insertNewColumnBefore($pBefore = 'A', $pNumCols = 1) {
2020          if (!is_numeric($pBefore)) {
2021              $objReferenceHelper = PHPExcel_ReferenceHelper::getInstance();
2022              $objReferenceHelper->insertNewBefore($pBefore . '1', $pNumCols, 0, $this);
2023          } else {
2024              throw new PHPExcel_Exception("Column references should not be numeric.");
2025          }
2026          return $this;
2027      }
2028  
2029      /**
2030       * Insert a new column, updating all possible related data
2031       *
2032       * @param int $pBefore    Insert before this one (numeric column coordinate of the cell)
2033       * @param int $pNumCols    Number of columns to insert
2034       * @throws    PHPExcel_Exception
2035       * @return PHPExcel_Worksheet
2036       */
2037      public function insertNewColumnBeforeByIndex($pBefore = 0, $pNumCols = 1) {
2038          if ($pBefore >= 0) {
2039              return $this->insertNewColumnBefore(PHPExcel_Cell::stringFromColumnIndex($pBefore), $pNumCols);
2040          } else {
2041              throw new PHPExcel_Exception("Columns can only be inserted before at least column A (0).");
2042          }
2043      }
2044  
2045      /**
2046       * Delete a row, updating all possible related data
2047       *
2048       * @param int $pRow        Remove starting with this one
2049       * @param int $pNumRows    Number of rows to remove
2050       * @throws    PHPExcel_Exception
2051       * @return PHPExcel_Worksheet
2052       */
2053      public function removeRow($pRow = 1, $pNumRows = 1) {
2054          if ($pRow >= 1) {
2055              $objReferenceHelper = PHPExcel_ReferenceHelper::getInstance();
2056              $objReferenceHelper->insertNewBefore('A' . ($pRow + $pNumRows), 0, -$pNumRows, $this);
2057          } else {
2058              throw new PHPExcel_Exception("Rows to be deleted should at least start from row 1.");
2059          }
2060          return $this;
2061      }
2062  
2063      /**
2064       * Remove a column, updating all possible related data
2065       *
2066       * @param int $pColumn    Remove starting with this one
2067       * @param int $pNumCols    Number of columns to remove
2068       * @throws    PHPExcel_Exception
2069       * @return PHPExcel_Worksheet
2070       */
2071      public function removeColumn($pColumn = 'A', $pNumCols = 1) {
2072          if (!is_numeric($pColumn)) {
2073              $pColumn = PHPExcel_Cell::stringFromColumnIndex(PHPExcel_Cell::columnIndexFromString($pColumn) - 1 + $pNumCols);
2074              $objReferenceHelper = PHPExcel_ReferenceHelper::getInstance();
2075              $objReferenceHelper->insertNewBefore($pColumn . '1', -$pNumCols, 0, $this);
2076          } else {
2077              throw new PHPExcel_Exception("Column references should not be numeric.");
2078          }
2079          return $this;
2080      }
2081  
2082      /**
2083       * Remove a column, updating all possible related data
2084       *
2085       * @param int $pColumn    Remove starting with this one (numeric column coordinate of the cell)
2086       * @param int $pNumCols    Number of columns to remove
2087       * @throws    PHPExcel_Exception
2088       * @return PHPExcel_Worksheet
2089       */
2090      public function removeColumnByIndex($pColumn = 0, $pNumCols = 1) {
2091          if ($pColumn >= 0) {
2092              return $this->removeColumn(PHPExcel_Cell::stringFromColumnIndex($pColumn), $pNumCols);
2093          } else {
2094              throw new PHPExcel_Exception("Columns to be deleted should at least start from column 0");
2095          }
2096      }
2097  
2098      /**
2099       * Show gridlines?
2100       *
2101       * @return boolean
2102       */
2103      public function getShowGridlines() {
2104          return $this->_showGridlines;
2105      }
2106  
2107      /**
2108       * Set show gridlines
2109       *
2110       * @param boolean $pValue    Show gridlines (true/false)
2111       * @return PHPExcel_Worksheet
2112       */
2113      public function setShowGridlines($pValue = false) {
2114          $this->_showGridlines = $pValue;
2115          return $this;
2116      }
2117  
2118      /**
2119      * Print gridlines?
2120      *
2121      * @return boolean
2122      */
2123      public function getPrintGridlines() {
2124          return $this->_printGridlines;
2125      }
2126  
2127      /**
2128      * Set print gridlines
2129      *
2130      * @param boolean $pValue Print gridlines (true/false)
2131      * @return PHPExcel_Worksheet
2132      */
2133      public function setPrintGridlines($pValue = false) {
2134          $this->_printGridlines = $pValue;
2135          return $this;
2136      }
2137  
2138      /**
2139      * Show row and column headers?
2140      *
2141      * @return boolean
2142      */
2143      public function getShowRowColHeaders() {
2144          return $this->_showRowColHeaders;
2145      }
2146  
2147      /**
2148      * Set show row and column headers
2149      *
2150      * @param boolean $pValue Show row and column headers (true/false)
2151      * @return PHPExcel_Worksheet
2152      */
2153      public function setShowRowColHeaders($pValue = false) {
2154          $this->_showRowColHeaders = $pValue;
2155          return $this;
2156      }
2157  
2158      /**
2159       * Show summary below? (Row/Column outlining)
2160       *
2161       * @return boolean
2162       */
2163      public function getShowSummaryBelow() {
2164          return $this->_showSummaryBelow;
2165      }
2166  
2167      /**
2168       * Set show summary below
2169       *
2170       * @param boolean $pValue    Show summary below (true/false)
2171       * @return PHPExcel_Worksheet
2172       */
2173      public function setShowSummaryBelow($pValue = true) {
2174          $this->_showSummaryBelow = $pValue;
2175          return $this;
2176      }
2177  
2178      /**
2179       * Show summary right? (Row/Column outlining)
2180       *
2181       * @return boolean
2182       */
2183      public function getShowSummaryRight() {
2184          return $this->_showSummaryRight;
2185      }
2186  
2187      /**
2188       * Set show summary right
2189       *
2190       * @param boolean $pValue    Show summary right (true/false)
2191       * @return PHPExcel_Worksheet
2192       */
2193      public function setShowSummaryRight($pValue = true) {
2194          $this->_showSummaryRight = $pValue;
2195          return $this;
2196      }
2197  
2198      /**
2199       * Get comments
2200       *
2201       * @return PHPExcel_Comment[]
2202       */
2203      public function getComments()
2204      {
2205          return $this->_comments;
2206      }
2207  
2208      /**
2209       * Set comments array for the entire sheet.
2210       *
2211       * @param array of PHPExcel_Comment
2212       * @return PHPExcel_Worksheet
2213       */
2214      public function setComments($pValue = array())
2215      {
2216          $this->_comments = $pValue;
2217  
2218          return $this;
2219      }
2220  
2221      /**
2222       * Get comment for cell
2223       *
2224       * @param string $pCellCoordinate    Cell coordinate to get comment for
2225       * @return PHPExcel_Comment
2226       * @throws PHPExcel_Exception
2227       */
2228      public function getComment($pCellCoordinate = 'A1')
2229      {
2230          // Uppercase coordinate
2231          $pCellCoordinate = strtoupper($pCellCoordinate);
2232  
2233          if (strpos($pCellCoordinate,':') !== false || strpos($pCellCoordinate,',') !== false) {
2234              throw new PHPExcel_Exception('Cell coordinate string can not be a range of cells.');
2235          } else if (strpos($pCellCoordinate,'$') !== false) {
2236              throw new PHPExcel_Exception('Cell coordinate string must not be absolute.');
2237          } else if ($pCellCoordinate == '') {
2238              throw new PHPExcel_Exception('Cell coordinate can not be zero-length string.');
2239          } else {
2240              // Check if we already have a comment for this cell.
2241              // If not, create a new comment.
2242              if (isset($this->_comments[$pCellCoordinate])) {
2243                  return $this->_comments[$pCellCoordinate];
2244              } else {
2245                  $newComment = new PHPExcel_Comment();
2246                  $this->_comments[$pCellCoordinate] = $newComment;
2247                  return $newComment;
2248              }
2249          }
2250      }
2251  
2252      /**
2253       * Get comment for cell by using numeric cell coordinates
2254       *
2255       * @param int $pColumn    Numeric column coordinate of the cell
2256       * @param int $pRow        Numeric row coordinate of the cell
2257       * @return PHPExcel_Comment
2258       */
2259      public function getCommentByColumnAndRow($pColumn = 0, $pRow = 1)
2260      {
2261          return $this->getComment(PHPExcel_Cell::stringFromColumnIndex($pColumn) . $pRow);
2262      }
2263  
2264      /**
2265       * Get selected cell
2266       *
2267       * @deprecated
2268       * @return string
2269       */
2270      public function getSelectedCell()
2271      {
2272          return $this->getSelectedCells();
2273      }
2274  
2275      /**
2276       * Get active cell
2277       *
2278       * @return string Example: 'A1'
2279       */
2280      public function getActiveCell()
2281      {
2282          return $this->_activeCell;
2283      }
2284  
2285      /**
2286       * Get selected cells
2287       *
2288       * @return string
2289       */
2290      public function getSelectedCells()
2291      {
2292          return $this->_selectedCells;
2293      }
2294  
2295      /**
2296       * Selected cell
2297       *
2298       * @param    string        $pCoordinate    Cell (i.e. A1)
2299       * @return PHPExcel_Worksheet
2300       */
2301      public function setSelectedCell($pCoordinate = 'A1')
2302      {
2303          return $this->setSelectedCells($pCoordinate);
2304      }
2305  
2306      /**
2307       * Select a range of cells.
2308       *
2309       * @param    string        $pCoordinate    Cell range, examples: 'A1', 'B2:G5', 'A:C', '3:6'
2310       * @throws    PHPExcel_Exception
2311       * @return PHPExcel_Worksheet
2312       */
2313      public function setSelectedCells($pCoordinate = 'A1')
2314      {
2315          // Uppercase coordinate
2316          $pCoordinate = strtoupper($pCoordinate);
2317  
2318          // Convert 'A' to 'A:A'
2319          $pCoordinate = preg_replace('/^([A-Z]+)$/', '$1}:$1}', $pCoordinate);
2320  
2321          // Convert '1' to '1:1'
2322          $pCoordinate = preg_replace('/^([0-9]+)$/', '$1}:$1}', $pCoordinate);
2323  
2324          // Convert 'A:C' to 'A1:C1048576'
2325          $pCoordinate = preg_replace('/^([A-Z]+):([A-Z]+)$/', '$1}1:$2}1048576', $pCoordinate);
2326  
2327          // Convert '1:3' to 'A1:XFD3'
2328          $pCoordinate = preg_replace('/^([0-9]+):([0-9]+)$/', 'A$1}:XFD$2}', $pCoordinate);
2329  
2330          if (strpos($pCoordinate,':') !== false || strpos($pCoordinate,',') !== false) {
2331              list($first, ) = PHPExcel_Cell::splitRange($pCoordinate);
2332              $this->_activeCell = $first[0];
2333          } else {
2334              $this->_activeCell = $pCoordinate;
2335          }
2336          $this->_selectedCells = $pCoordinate;
2337          return $this;
2338      }
2339  
2340      /**
2341       * Selected cell by using numeric cell coordinates
2342       *
2343       * @param int $pColumn Numeric column coordinate of the cell
2344       * @param int $pRow Numeric row coordinate of the cell
2345       * @throws PHPExcel_Exception
2346       * @return PHPExcel_Worksheet
2347       */
2348      public function setSelectedCellByColumnAndRow($pColumn = 0, $pRow = 1)
2349      {
2350          return $this->setSelectedCells(PHPExcel_Cell::stringFromColumnIndex($pColumn) . $pRow);
2351      }
2352  
2353      /**
2354       * Get right-to-left
2355       *
2356       * @return boolean
2357       */
2358      public function getRightToLeft() {
2359          return $this->_rightToLeft;
2360      }
2361  
2362      /**
2363       * Set right-to-left
2364       *
2365       * @param boolean $value    Right-to-left true/false
2366       * @return PHPExcel_Worksheet
2367       */
2368      public function setRightToLeft($value = false) {
2369          $this->_rightToLeft = $value;
2370          return $this;
2371      }
2372  
2373      /**
2374       * Fill worksheet from values in array
2375       *
2376       * @param array $source Source array
2377       * @param mixed $nullValue Value in source array that stands for blank cell
2378       * @param string $startCell Insert array starting from this cell address as the top left coordinate
2379       * @param boolean $strictNullComparison Apply strict comparison when testing for null values in the array
2380       * @throws PHPExcel_Exception
2381       * @return PHPExcel_Worksheet
2382       */
2383      public function fromArray($source = null, $nullValue = null, $startCell = 'A1', $strictNullComparison = false) {
2384          if (is_array($source)) {
2385              //    Convert a 1-D array to 2-D (for ease of looping)
2386              if (!is_array(end($source))) {
2387                  $source = array($source);
2388              }
2389  
2390              // start coordinate
2391              list ($startColumn, $startRow) = PHPExcel_Cell::coordinateFromString($startCell);
2392  
2393              // Loop through $source
2394              foreach ($source as $rowData) {
2395                  $currentColumn = $startColumn;
2396                  foreach($rowData as $cellValue) {
2397                      if ($strictNullComparison) {
2398                          if ($cellValue !== $nullValue) {
2399                              // Set cell value
2400                              $this->getCell($currentColumn . $startRow)->setValue($cellValue);
2401                          }
2402                      } else {
2403                          if ($cellValue != $nullValue) {
2404                              // Set cell value
2405                              $this->getCell($currentColumn . $startRow)->setValue($cellValue);
2406                          }
2407                      }
2408                      ++$currentColumn;
2409                  }
2410                  ++$startRow;
2411              }
2412          } else {
2413              throw new PHPExcel_Exception("Parameter \$source should be an array.");
2414          }
2415          return $this;
2416      }
2417  
2418      /**
2419       * Create array from a range of cells
2420       *
2421       * @param string $pRange Range of cells (i.e. "A1:B10"), or just one cell (i.e. "A1")
2422       * @param mixed $nullValue Value returned in the array entry if a cell doesn't exist
2423       * @param boolean $calculateFormulas Should formulas be calculated?
2424       * @param boolean $formatData Should formatting be applied to cell values?
2425       * @param boolean $returnCellRef False - Return a simple array of rows and columns indexed by number counting from zero
2426       *                               True - Return rows and columns indexed by their actual row and column IDs
2427       * @return array
2428       */
2429  	public function rangeToArray($pRange = 'A1', $nullValue = null, $calculateFormulas = true, $formatData = true, $returnCellRef = false) {
2430          // Returnvalue
2431          $returnValue = array();
2432          //    Identify the range that we need to extract from the worksheet
2433          list($rangeStart, $rangeEnd) = PHPExcel_Cell::rangeBoundaries($pRange);
2434          $minCol = PHPExcel_Cell::stringFromColumnIndex($rangeStart[0] -1);
2435          $minRow = $rangeStart[1];
2436          $maxCol = PHPExcel_Cell::stringFromColumnIndex($rangeEnd[0] -1);
2437          $maxRow = $rangeEnd[1];
2438  
2439          $maxCol++;
2440          // Loop through rows
2441          $r = -1;
2442          for ($row = $minRow; $row <= $maxRow; ++$row) {
2443              $rRef = ($returnCellRef) ? $row : ++$r;
2444              $c = -1;
2445              // Loop through columns in the current row
2446              for ($col = $minCol; $col != $maxCol; ++$col) {
2447                  $cRef = ($returnCellRef) ? $col : ++$c;
2448                  //    Using getCell() will create a new cell if it doesn't already exist. We don't want that to happen
2449                  //        so we test and retrieve directly against _cellCollection
2450                  if ($this->_cellCollection->isDataSet($col.$row)) {
2451                      // Cell exists
2452                      $cell = $this->_cellCollection->getCacheData($col.$row);
2453                      if ($cell->getValue() !== null) {
2454                          if ($cell->getValue() instanceof PHPExcel_RichText) {
2455                              $returnValue[$rRef][$cRef] = $cell->getValue()->getPlainText();
2456                          } else {
2457                              if ($calculateFormulas) {
2458                                  $returnValue[$rRef][$cRef] = $cell->getCalculatedValue();
2459                              } else {
2460                                  $returnValue[$rRef][$cRef] = $cell->getValue();
2461                              }
2462                          }
2463  
2464                          if ($formatData) {
2465                              $style = $this->_parent->getCellXfByIndex($cell->getXfIndex());
2466                              $returnValue[$rRef][$cRef] = PHPExcel_Style_NumberFormat::toFormattedString(
2467                                  $returnValue[$rRef][$cRef],
2468                                  ($style && $style->getNumberFormat()) ?
2469                                      $style->getNumberFormat()->getFormatCode() :
2470                                      PHPExcel_Style_NumberFormat::FORMAT_GENERAL
2471                              );
2472                          }
2473                      } else {
2474                          // Cell holds a NULL
2475                          $returnValue[$rRef][$cRef] = $nullValue;
2476                      }
2477                  } else {
2478                      // Cell doesn't exist
2479                      $returnValue[$rRef][$cRef] = $nullValue;
2480                  }
2481              }
2482          }
2483  
2484          // Return
2485          return $returnValue;
2486      }
2487  
2488  
2489      /**
2490       * Create array from a range of cells
2491       *
2492       * @param  string $pNamedRange Name of the Named Range
2493       * @param  mixed  $nullValue Value returned in the array entry if a cell doesn't exist
2494       * @param  boolean $calculateFormulas  Should formulas be calculated?
2495       * @param  boolean $formatData  Should formatting be applied to cell values?
2496       * @param  boolean $returnCellRef False - Return a simple array of rows and columns indexed by number counting from zero
2497       *                                True - Return rows and columns indexed by their actual row and column IDs
2498       * @return array
2499       * @throws PHPExcel_Exception
2500       */
2501  	public function namedRangeToArray($pNamedRange = '', $nullValue = null, $calculateFormulas = true, $formatData = true, $returnCellRef = false) {
2502          $namedRange = PHPExcel_NamedRange::resolveRange($pNamedRange, $this);
2503          if ($namedRange !== NULL) {
2504              $pWorkSheet = $namedRange->getWorksheet();
2505              $pCellRange = $namedRange->getRange();
2506  
2507              return $pWorkSheet->rangeToArray(    $pCellRange,
2508                                                  $nullValue, $calculateFormulas, $formatData, $returnCellRef);
2509          }
2510  
2511          throw new PHPExcel_Exception('Named Range '.$pNamedRange.' does not exist.');
2512      }
2513  
2514  
2515      /**
2516       * Create array from worksheet
2517       *
2518       * @param mixed $nullValue Value returned in the array entry if a cell doesn't exist
2519       * @param boolean $calculateFormulas Should formulas be calculated?
2520       * @param boolean $formatData  Should formatting be applied to cell values?
2521       * @param boolean $returnCellRef False - Return a simple array of rows and columns indexed by number counting from zero
2522       *                               True - Return rows and columns indexed by their actual row and column IDs
2523       * @return array
2524       */
2525  	public function toArray($nullValue = null, $calculateFormulas = true, $formatData = true, $returnCellRef = false) {
2526          // Garbage collect...
2527          $this->garbageCollect();
2528  
2529          //    Identify the range that we need to extract from the worksheet
2530          $maxCol = $this->getHighestColumn();
2531          $maxRow = $this->getHighestRow();
2532          // Return
2533          return $this->rangeToArray(    'A1:'.$maxCol.$maxRow,
2534                                      $nullValue, $calculateFormulas, $formatData, $returnCellRef);
2535      }
2536  
2537      /**
2538       * Get row iterator
2539       *
2540       * @param  integer                           $startRow    The row number at which to start iterating
2541       * @return PHPExcel_Worksheet_RowIterator
2542       */
2543  	public function getRowIterator($startRow = 1) {
2544          return new PHPExcel_Worksheet_RowIterator($this,$startRow);
2545      }
2546  
2547      /**
2548       * Run PHPExcel garabage collector.
2549       *
2550       * @return PHPExcel_Worksheet
2551       */
2552  	public function garbageCollect() {
2553          // Flush cache
2554          $this->_cellCollection->getCacheData('A1');
2555          // Build a reference table from images
2556  //        $imageCoordinates = array();
2557  //        $iterator = $this->getDrawingCollection()->getIterator();
2558  //        while ($iterator->valid()) {
2559  //            $imageCoordinates[$iterator->current()->getCoordinates()] = true;
2560  //
2561  //            $iterator->next();
2562  //        }
2563  //
2564          // Lookup highest column and highest row if cells are cleaned
2565          $colRow = $this->_cellCollection->getHighestRowAndColumn();
2566          $highestRow = $colRow['row'];
2567          $highestColumn = PHPExcel_Cell::columnIndexFromString($colRow['column']);
2568  
2569          // Loop through column dimensions
2570          foreach ($this->_columnDimensions as $dimension) {
2571              $highestColumn = max($highestColumn,PHPExcel_Cell::columnIndexFromString($dimension->getColumnIndex()));
2572          }
2573  
2574          // Loop through row dimensions
2575          foreach ($this->_rowDimensions as $dimension) {
2576              $highestRow = max($highestRow,$dimension->getRowIndex());
2577          }
2578  
2579          // Cache values
2580          if ($highestColumn < 0) {
2581              $this->_cachedHighestColumn = 'A';
2582          } else {
2583              $this->_cachedHighestColumn = PHPExcel_Cell::stringFromColumnIndex(--$highestColumn);
2584          }
2585          $this->_cachedHighestRow = $highestRow;
2586  
2587          // Return
2588          return $this;
2589      }
2590  
2591      /**
2592       * Get hash code
2593       *
2594       * @return string    Hash code
2595       */
2596  	public function getHashCode() {
2597          if ($this->_dirty) {
2598              $this->_hash = md5( $this->_title .
2599                                  $this->_autoFilter .
2600                                  ($this->_protection->isProtectionEnabled() ? 't' : 'f') .
2601                                  __CLASS__
2602                                );
2603              $this->_dirty = false;
2604          }
2605          return $this->_hash;
2606      }
2607  
2608      /**
2609       * Extract worksheet title from range.
2610       *
2611       * Example: extractSheetTitle("testSheet!A1") ==> 'A1'
2612       * Example: extractSheetTitle("'testSheet 1'!A1", true) ==> array('testSheet 1', 'A1');
2613       *
2614       * @param string $pRange    Range to extract title from
2615       * @param bool $returnRange    Return range? (see example)
2616       * @return mixed
2617       */
2618  	public static function extractSheetTitle($pRange, $returnRange = false) {
2619          // Sheet title included?
2620          if (($sep = strpos($pRange, '!')) === false) {
2621              return '';
2622          }
2623  
2624          if ($returnRange) {
2625              return array( trim(substr($pRange, 0, $sep),"'"),
2626                            substr($pRange, $sep + 1)
2627                          );
2628          }
2629  
2630          return substr($pRange, $sep + 1);
2631      }
2632  
2633      /**
2634       * Get hyperlink
2635       *
2636       * @param string $pCellCoordinate    Cell coordinate to get hyperlink for
2637       */
2638      public function getHyperlink($pCellCoordinate = 'A1')
2639      {
2640          // return hyperlink if we already have one
2641          if (isset($this->_hyperlinkCollection[$pCellCoordinate])) {
2642              return $this->_hyperlinkCollection[$pCellCoordinate];
2643          }
2644  
2645          // else create hyperlink
2646          $this->_hyperlinkCollection[$pCellCoordinate] = new PHPExcel_Cell_Hyperlink();
2647          return $this->_hyperlinkCollection[$pCellCoordinate];
2648      }
2649  
2650      /**
2651       * Set hyperlnk
2652       *
2653       * @param string $pCellCoordinate    Cell coordinate to insert hyperlink
2654       * @param    PHPExcel_Cell_Hyperlink    $pHyperlink
2655       * @return PHPExcel_Worksheet
2656       */
2657      public function setHyperlink($pCellCoordinate = 'A1', PHPExcel_Cell_Hyperlink $pHyperlink = null)
2658      {
2659          if ($pHyperlink === null) {
2660              unset($this->_hyperlinkCollection[$pCellCoordinate]);
2661          } else {
2662              $this->_hyperlinkCollection[$pCellCoordinate] = $pHyperlink;
2663          }
2664          return $this;
2665      }
2666  
2667      /**
2668       * Hyperlink at a specific coordinate exists?
2669       *
2670       * @param string $pCoordinate
2671       * @return boolean
2672       */
2673      public function hyperlinkExists($pCoordinate = 'A1')
2674      {
2675          return isset($this->_hyperlinkCollection[$pCoordinate]);
2676      }
2677  
2678      /**
2679       * Get collection of hyperlinks
2680       *
2681       * @return PHPExcel_Cell_Hyperlink[]
2682       */
2683      public function getHyperlinkCollection()
2684      {
2685          return $this->_hyperlinkCollection;
2686      }
2687  
2688      /**
2689       * Get data validation
2690       *
2691       * @param string $pCellCoordinate Cell coordinate to get data validation for
2692       */
2693      public function getDataValidation($pCellCoordinate = 'A1')
2694      {
2695          // return data validation if we already have one
2696          if (isset($this->_dataValidationCollection[$pCellCoordinate])) {
2697              return $this->_dataValidationCollection[$pCellCoordinate];
2698          }
2699  
2700          // else create data validation
2701          $this->_dataValidationCollection[$pCellCoordinate] = new PHPExcel_Cell_DataValidation();
2702          return $this->_dataValidationCollection[$pCellCoordinate];
2703      }
2704  
2705      /**
2706       * Set data validation
2707       *
2708       * @param string $pCellCoordinate    Cell coordinate to insert data validation
2709       * @param    PHPExcel_Cell_DataValidation    $pDataValidation
2710       * @return PHPExcel_Worksheet
2711       */
2712      public function setDataValidation($pCellCoordinate = 'A1', PHPExcel_Cell_DataValidation $pDataValidation = null)
2713      {
2714          if ($pDataValidation === null) {
2715              unset($this->_dataValidationCollection[$pCellCoordinate]);
2716          } else {
2717              $this->_dataValidationCollection[$pCellCoordinate] = $pDataValidation;
2718          }
2719          return $this;
2720      }
2721  
2722      /**
2723       * Data validation at a specific coordinate exists?
2724       *
2725       * @param string $pCoordinate
2726       * @return boolean
2727       */
2728      public function dataValidationExists($pCoordinate = 'A1')
2729      {
2730          return isset($this->_dataValidationCollection[$pCoordinate]);
2731      }
2732  
2733      /**
2734       * Get collection of data validations
2735       *
2736       * @return PHPExcel_Cell_DataValidation[]
2737       */
2738      public function getDataValidationCollection()
2739      {
2740          return $this->_dataValidationCollection;
2741      }
2742  
2743      /**
2744       * Accepts a range, returning it as a range that falls within the current highest row and column of the worksheet
2745       *
2746       * @param string $range
2747       * @return string Adjusted range value
2748       */
2749  	public function shrinkRangeToFit($range) {
2750          $maxCol = $this->getHighestColumn();
2751          $maxRow = $this->getHighestRow();
2752          $maxCol = PHPExcel_Cell::columnIndexFromString($maxCol);
2753  
2754          $rangeBlocks = explode(' ',$range);
2755          foreach ($rangeBlocks as &$rangeSet) {
2756              $rangeBoundaries = PHPExcel_Cell::getRangeBoundaries($rangeSet);
2757  
2758              if (PHPExcel_Cell::columnIndexFromString($rangeBoundaries[0][0]) > $maxCol) { $rangeBoundaries[0][0] = PHPExcel_Cell::stringFromColumnIndex($maxCol); }
2759              if ($rangeBoundaries[0][1] > $maxRow) { $rangeBoundaries[0][1] = $maxRow; }
2760              if (PHPExcel_Cell::columnIndexFromString($rangeBoundaries[1][0]) > $maxCol) { $rangeBoundaries[1][0] = PHPExcel_Cell::stringFromColumnIndex($maxCol); }
2761              if ($rangeBoundaries[1][1] > $maxRow) { $rangeBoundaries[1][1] = $maxRow; }
2762              $rangeSet = $rangeBoundaries[0][0].$rangeBoundaries[0][1].':'.$rangeBoundaries[1][0].$rangeBoundaries[1][1];
2763          }
2764          unset($rangeSet);
2765          $stRange = implode(' ',$rangeBlocks);
2766  
2767          return $stRange;
2768      }
2769  
2770      /**
2771       * Get tab color
2772       *
2773       * @return PHPExcel_Style_Color
2774       */
2775      public function getTabColor()
2776      {
2777          if ($this->_tabColor === NULL)
2778              $this->_tabColor = new PHPExcel_Style_Color();
2779  
2780          return $this->_tabColor;
2781      }
2782  
2783      /**
2784       * Reset tab color
2785       *
2786       * @return PHPExcel_Worksheet
2787       */
2788      public function resetTabColor()
2789      {
2790          $this->_tabColor = null;
2791          unset($this->_tabColor);
2792  
2793          return $this;
2794      }
2795  
2796      /**
2797       * Tab color set?
2798       *
2799       * @return boolean
2800       */
2801      public function isTabColorSet()
2802      {
2803          return ($this->_tabColor !== NULL);
2804      }
2805  
2806      /**
2807       * Copy worksheet (!= clone!)
2808       *
2809       * @return PHPExcel_Worksheet
2810       */
2811  	public function copy() {
2812          $copied = clone $this;
2813  
2814          return $copied;
2815      }
2816  
2817      /**
2818       * Implement PHP __clone to create a deep clone, not just a shallow copy.
2819       */
2820  	public function __clone() {
2821          foreach ($this as $key => $val) {
2822              if ($key == '_parent') {
2823                  continue;
2824              }
2825  
2826              if (is_object($val) || (is_array($val))) {
2827                  if ($key == '_cellCollection') {
2828                      $newCollection = clone $this->_cellCollection;
2829                      $newCollection->copyCellCollection($this);
2830                      $this->_cellCollection = $newCollection;
2831                  } elseif ($key == '_drawingCollection') {
2832                      $newCollection = clone $this->_drawingCollection;
2833                      $this->_drawingCollection = $newCollection;
2834                  } elseif (($key == '_autoFilter') && ($this->_autoFilter instanceof PHPExcel_Worksheet_AutoFilter)) {
2835                      $newAutoFilter = clone $this->_autoFilter;
2836                      $this->_autoFilter = $newAutoFilter;
2837                      $this->_autoFilter->setParent($this);
2838                  } else {
2839                      $this->{$key} = unserialize(serialize($val));
2840                  }
2841              }
2842          }
2843      }
2844  /**
2845       * Define the code name of the sheet
2846       *
2847       * @param null|string Same rule as Title minus space not allowed (but, like Excel, change silently space to underscore)
2848       * @return objWorksheet
2849       * @throws PHPExcel_Exception
2850      */
2851  	public function setCodeName($pValue=null){
2852          // Is this a 'rename' or not?
2853          if ($this->getCodeName() == $pValue) {
2854              return $this;
2855          }
2856          $pValue = str_replace(' ', '_', $pValue);//Excel does this automatically without flinching, we are doing the same
2857          // Syntax check
2858          // throw an exception if not valid
2859          self::_checkSheetCodeName($pValue);
2860  
2861          // We use the same code that setTitle to find a valid codeName else not using a space (Excel don't like) but a '_'
2862          
2863          if ($this->getParent()) {
2864              // Is there already such sheet name?
2865              if ($this->getParent()->sheetCodeNameExists($pValue)) {
2866                  // Use name, but append with lowest possible integer
2867  
2868                  if (PHPExcel_Shared_String::CountCharacters($pValue) > 29) {
2869                      $pValue = PHPExcel_Shared_String::Substring($pValue,0,29);
2870                  }
2871                  $i = 1;
2872                  while ($this->getParent()->sheetCodeNameExists($pValue . '_' . $i)) {
2873                      ++$i;
2874                      if ($i == 10) {
2875                          if (PHPExcel_Shared_String::CountCharacters($pValue) > 28) {
2876                              $pValue = PHPExcel_Shared_String::Substring($pValue,0,28);
2877                          }
2878                      } elseif ($i == 100) {
2879                          if (PHPExcel_Shared_String::CountCharacters($pValue) > 27) {
2880                              $pValue = PHPExcel_Shared_String::Substring($pValue,0,27);
2881                          }
2882                      }
2883                  }
2884  
2885                  $pValue = $pValue . '_' . $i;// ok, we have a valid name
2886                  //codeName is'nt used in formula : no need to call for an update
2887                  //return $this->setTitle($altTitle,$updateFormulaCellReferences);
2888              }
2889          }
2890  
2891          $this->_codeName=$pValue;
2892          return $this;
2893      }
2894      /**
2895       * Return the code name of the sheet
2896       *
2897       * @return null|string
2898      */
2899  	public function getCodeName(){
2900          return $this->_codeName;
2901      }
2902      /**
2903       * Sheet has a code name ?
2904       * @return boolean
2905      */
2906  	public function hasCodeName(){
2907          return !(is_null($this->_codeName));
2908      }
2909  }


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