Overview

Packages

  • JAMA
  • None
  • PHP
  • PHPExcel
    • CachedObjectStorage
    • Calculation
    • Cell
    • Chart
      • Renderer
    • Reader
      • Excel2007
      • Excel5
    • RichText
    • Settings
    • Shared
      • Escher
      • OLE
      • Trend
      • ZipArchive
    • Style
    • Worksheet
      • Drawing
    • Writer
      • 2007
      • CSV
      • Excel2007
      • Excel5
      • HTML
      • PDF

Classes

  • CholeskyDecomposition
  • Dao
  • DateTime
  • DateTimeZone
  • DOMNode
  • EigenvalueDecomposition
  • Elemento
  • Historial
  • Irradiacion
  • Latitud
  • MotorPhp
  • Panel
  • PclZip
  • Periodo
  • PHPExcel
  • PHPExcel_Autoloader
  • PHPExcel_Best_Fit
  • PHPExcel_CachedObjectStorage_APC
  • PHPExcel_CachedObjectStorage_CacheBase
  • PHPExcel_CachedObjectStorage_DiscISAM
  • PHPExcel_CachedObjectStorage_Igbinary
  • PHPExcel_CachedObjectStorage_Memcache
  • PHPExcel_CachedObjectStorage_Memory
  • PHPExcel_CachedObjectStorage_MemoryGZip
  • PHPExcel_CachedObjectStorage_MemorySerialized
  • PHPExcel_CachedObjectStorage_PHPTemp
  • PHPExcel_CachedObjectStorage_SQLite
  • PHPExcel_CachedObjectStorage_SQLite3
  • PHPExcel_CachedObjectStorage_Wincache
  • PHPExcel_CachedObjectStorageFactory
  • PHPExcel_CalcEngine_CyclicReferenceStack
  • PHPExcel_CalcEngine_Logger
  • PHPExcel_Calculation
  • PHPExcel_Calculation_Database
  • PHPExcel_Calculation_DateTime
  • PHPExcel_Calculation_Engineering
  • PHPExcel_Calculation_ExceptionHandler
  • PHPExcel_Calculation_Financial
  • PHPExcel_Calculation_FormulaParser
  • PHPExcel_Calculation_FormulaToken
  • PHPExcel_Calculation_Function
  • PHPExcel_Calculation_Functions
  • PHPExcel_Calculation_Logical
  • PHPExcel_Calculation_LookupRef
  • PHPExcel_Calculation_MathTrig
  • PHPExcel_Calculation_Statistical
  • PHPExcel_Calculation_TextData
  • PHPExcel_Calculation_Token_Stack
  • PHPExcel_Cell
  • PHPExcel_Cell_AdvancedValueBinder
  • PHPExcel_Cell_DataType
  • PHPExcel_Cell_DataValidation
  • PHPExcel_Cell_DefaultValueBinder
  • PHPExcel_Cell_Hyperlink
  • PHPExcel_Chart
  • PHPExcel_Chart_DataSeries
  • PHPExcel_Chart_DataSeriesValues
  • PHPExcel_Chart_Layout
  • PHPExcel_Chart_Legend
  • PHPExcel_Chart_PlotArea
  • PHPExcel_Chart_Renderer_jpgraph
  • PHPExcel_Chart_Title
  • PHPExcel_Comment
  • PHPExcel_DocumentProperties
  • PHPExcel_DocumentSecurity
  • PHPExcel_Exponential_Best_Fit
  • PHPExcel_HashTable
  • PHPExcel_IOFactory
  • PHPExcel_Linear_Best_Fit
  • PHPExcel_Logarithmic_Best_Fit
  • PHPExcel_NamedRange
  • PHPExcel_Polynomial_Best_Fit
  • PHPExcel_Power_Best_Fit
  • PHPExcel_Reader_Abstract
  • PHPExcel_Reader_CSV
  • PHPExcel_Reader_DefaultReadFilter
  • PHPExcel_Reader_Excel2003XML
  • PHPExcel_Reader_Excel2007
  • PHPExcel_Reader_Excel2007_Chart
  • PHPExcel_Reader_Excel2007_Theme
  • PHPExcel_Reader_Excel5
  • PHPExcel_Reader_Excel5_Escher
  • PHPExcel_Reader_Excel5_MD5
  • PHPExcel_Reader_Excel5_RC4
  • PHPExcel_Reader_Gnumeric
  • PHPExcel_Reader_HTML
  • PHPExcel_Reader_OOCalc
  • PHPExcel_Reader_SYLK
  • PHPExcel_ReferenceHelper
  • PHPExcel_RichText
  • PHPExcel_RichText_Run
  • PHPExcel_RichText_TextElement
  • PHPExcel_Settings
  • PHPExcel_Shared_CodePage
  • PHPExcel_Shared_Date
  • PHPExcel_Shared_Drawing
  • PHPExcel_Shared_Escher
  • PHPExcel_Shared_Escher_DgContainer
  • PHPExcel_Shared_Escher_DgContainer_SpgrContainer
  • PHPExcel_Shared_Escher_DgContainer_SpgrContainer_SpContainer
  • PHPExcel_Shared_Escher_DggContainer
  • PHPExcel_Shared_Escher_DggContainer_BstoreContainer
  • PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE
  • PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE_Blip
  • PHPExcel_Shared_Excel5
  • PHPExcel_Shared_File
  • PHPExcel_Shared_Font
  • PHPExcel_Shared_JAMA_LUDecomposition
  • PHPExcel_Shared_JAMA_Matrix
  • PHPExcel_Shared_JAMA_QRDecomposition
  • PHPExcel_Shared_OLE
  • PHPExcel_Shared_OLE_ChainedBlockStream
  • PHPExcel_Shared_OLE_PPS
  • PHPExcel_Shared_OLE_PPS_File
  • PHPExcel_Shared_OLE_PPS_Root
  • PHPExcel_Shared_OLERead
  • PHPExcel_Shared_PasswordHasher
  • PHPExcel_Shared_String
  • PHPExcel_Shared_TimeZone
  • PHPExcel_Shared_XMLWriter
  • PHPExcel_Shared_ZipArchive
  • PHPExcel_Shared_ZipStreamWrapper
  • PHPExcel_Style
  • PHPExcel_Style_Alignment
  • PHPExcel_Style_Border
  • PHPExcel_Style_Borders
  • PHPExcel_Style_Color
  • PHPExcel_Style_Conditional
  • PHPExcel_Style_Fill
  • PHPExcel_Style_Font
  • PHPExcel_Style_NumberFormat
  • PHPExcel_Style_Protection
  • PHPExcel_Style_Supervisor
  • PHPExcel_Worksheet
  • PHPExcel_Worksheet_AutoFilter
  • PHPExcel_Worksheet_AutoFilter_Column
  • PHPExcel_Worksheet_AutoFilter_Column_Rule
  • PHPExcel_Worksheet_BaseDrawing
  • PHPExcel_Worksheet_CellIterator
  • PHPExcel_Worksheet_ColumnDimension
  • PHPExcel_Worksheet_Drawing
  • PHPExcel_Worksheet_Drawing_Shadow
  • PHPExcel_Worksheet_HeaderFooter
  • PHPExcel_Worksheet_HeaderFooterDrawing
  • PHPExcel_Worksheet_MemoryDrawing
  • PHPExcel_Worksheet_PageMargins
  • PHPExcel_Worksheet_PageSetup
  • PHPExcel_Worksheet_Protection
  • PHPExcel_Worksheet_Row
  • PHPExcel_Worksheet_RowDimension
  • PHPExcel_Worksheet_RowIterator
  • PHPExcel_Worksheet_SheetView
  • PHPExcel_WorksheetIterator
  • PHPExcel_Writer_Abstract
  • PHPExcel_Writer_CSV
  • PHPExcel_Writer_Excel2007
  • PHPExcel_Writer_Excel2007_Chart
  • PHPExcel_Writer_Excel2007_Comments
  • PHPExcel_Writer_Excel2007_ContentTypes
  • PHPExcel_Writer_Excel2007_DocProps
  • PHPExcel_Writer_Excel2007_Drawing
  • PHPExcel_Writer_Excel2007_Rels
  • PHPExcel_Writer_Excel2007_RelsRibbon
  • PHPExcel_Writer_Excel2007_RelsVBA
  • PHPExcel_Writer_Excel2007_StringTable
  • PHPExcel_Writer_Excel2007_Style
  • PHPExcel_Writer_Excel2007_Theme
  • PHPExcel_Writer_Excel2007_Workbook
  • PHPExcel_Writer_Excel2007_Worksheet
  • PHPExcel_Writer_Excel2007_WriterPart
  • PHPExcel_Writer_Excel5
  • PHPExcel_Writer_Excel5_BIFFwriter
  • PHPExcel_Writer_Excel5_Escher
  • PHPExcel_Writer_Excel5_Font
  • PHPExcel_Writer_Excel5_Parser
  • PHPExcel_Writer_Excel5_Workbook
  • PHPExcel_Writer_Excel5_Worksheet
  • PHPExcel_Writer_Excel5_Xf
  • PHPExcel_Writer_HTML
  • PHPExcel_Writer_PDF
  • PHPExcel_Writer_PDF_Core
  • PHPExcel_Writer_PDF_DomPDF
  • PHPExcel_Writer_PDF_mPDF
  • PHPExcel_Writer_PDF_tcPDF
  • Provincia
  • Radiacion
  • SingularValueDecomposition
  • Sistema
  • trendClass
  • xajax
  • xajaxArgumentManager
  • xajaxCallableObject
  • xajaxCallableObjectPlugin
  • xajaxControl
  • xajaxControlContainer
  • xajaxCustomRequest
  • xajaxCustomResponse
  • xajaxEvent
  • xajaxEventPlugin
  • xajaxFunctionPlugin
  • xajaxIncludeClientScriptPlugin
  • xajaxLanguageManager
  • xajaxPlugin
  • xajaxPluginManager
  • xajaxRequest
  • xajaxRequestPlugin
  • xajaxResponse
  • xajaxResponseManager
  • xajaxResponsePlugin
  • xajaxScriptPlugin
  • xajaxUserFunction
  • XMLWriter

Interfaces

  • DateTimeInterface
  • Iterator
  • PHPExcel_CachedObjectStorage_ICache
  • PHPExcel_Cell_IValueBinder
  • PHPExcel_IComparable
  • PHPExcel_Reader_IReader
  • PHPExcel_Reader_IReadFilter
  • PHPExcel_RichText_ITextElement
  • PHPExcel_Writer_IWriter
  • Throwable
  • Traversable

Exceptions

  • Exception
  • PHPExcel_Calculation_Exception
  • PHPExcel_Chart_Exception
  • PHPExcel_Exception
  • PHPExcel_Reader_Exception
  • PHPExcel_Writer_Exception

Functions

  • acosh
  • agregar_elemento
  • asinh
  • atanh
  • borrar_elementos
  • borrar_gdm_ab
  • borrar_irradiacion
  • borrar_latitud
  • borrar_panel
  • borrar_periodo
  • borrar_pmp_min_pmp_max
  • borrar_radiacion
  • borrar_resumen
  • borrar_sistema
  • borrar_sombra
  • gdm_ab
  • grabar_resumen
  • historial
  • hypo
  • irradiacion
  • JAMAError
  • latitud
  • limpiar_historial
  • login
  • mb_str_replace
  • mostrar_energia_total_ch
  • mostrar_panel_md_th
  • mostrar_panel_th
  • mostrar_radiacion_md_th
  • mostrar_radiacion_th
  • mostrar_resumen_th
  • panel
  • PclZipUtilCopyBlock
  • PclZipUtilOptionText
  • PclZipUtilPathInclusion
  • PclZipUtilPathReduction
  • PclZipUtilRename
  • PclZipUtilTranslateWinPath
  • periodo
  • pmp_min_pmp_max
  • preparar_panel
  • preparar_radiacion
  • preparar_radiacion_media
  • radiacion
  • resumen
  • sistema
  • sombra
  • xajaxCompressFile
  • xajaxErrorHandler
  • Overview
  • Package
  • Class
  • Tree
  • Deprecated
  • Todo
  • Download
   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    1.8.0, 2014-03-02
  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: }
2910: 
Autene API documentation generated by ApiGen