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_Writer_HTML
  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_Writer_HTML
  31:  *
  32:  * @category   PHPExcel
  33:  * @package PHPExcel_Writer_HTML
  34:  * @copyright  Copyright (c) 2006 - 2014 PHPExcel (http://www.codeplex.com/PHPExcel)
  35:  */
  36: class PHPExcel_Writer_HTML extends PHPExcel_Writer_Abstract implements PHPExcel_Writer_IWriter {
  37:     /**
  38:      * PHPExcel object
  39:      *
  40:      * @var PHPExcel
  41:      */
  42:     protected $_phpExcel;
  43: 
  44:     /**
  45:      * Sheet index to write
  46:      *
  47:      * @var int
  48:      */
  49:     private $_sheetIndex    = 0;
  50: 
  51:     /**
  52:      * Images root
  53:      *
  54:      * @var string
  55:      */
  56:     private $_imagesRoot    = '.';
  57: 
  58:     /**
  59:      * embed images, or link to images
  60:      *
  61:      * @var boolean
  62:      */
  63:     private $_embedImages   = FALSE;
  64: 
  65:     /**
  66:      * Use inline CSS?
  67:      *
  68:      * @var boolean
  69:      */
  70:     private $_useInlineCss = false;
  71: 
  72:     /**
  73:      * Array of CSS styles
  74:      *
  75:      * @var array
  76:      */
  77:     private $_cssStyles = null;
  78: 
  79:     /**
  80:      * Array of column widths in points
  81:      *
  82:      * @var array
  83:      */
  84:     private $_columnWidths = null;
  85: 
  86:     /**
  87:      * Default font
  88:      *
  89:      * @var PHPExcel_Style_Font
  90:      */
  91:     private $_defaultFont;
  92: 
  93:     /**
  94:      * Flag whether spans have been calculated
  95:      *
  96:      * @var boolean
  97:      */
  98:     private $_spansAreCalculated    = false;
  99: 
 100:     /**
 101:      * Excel cells that should not be written as HTML cells
 102:      *
 103:      * @var array
 104:      */
 105:     private $_isSpannedCell = array();
 106: 
 107:     /**
 108:      * Excel cells that are upper-left corner in a cell merge
 109:      *
 110:      * @var array
 111:      */
 112:     private $_isBaseCell    = array();
 113: 
 114:     /**
 115:      * Excel rows that should not be written as HTML rows
 116:      *
 117:      * @var array
 118:      */
 119:     private $_isSpannedRow  = array();
 120: 
 121:     /**
 122:      * Is the current writer creating PDF?
 123:      *
 124:      * @var boolean
 125:      */
 126:     protected $_isPdf = false;
 127: 
 128:     /**
 129:      * Generate the Navigation block
 130:      *
 131:      * @var boolean
 132:      */
 133:     private $_generateSheetNavigationBlock = true;
 134: 
 135:     /**
 136:      * Create a new PHPExcel_Writer_HTML
 137:      *
 138:      * @param   PHPExcel    $phpExcel   PHPExcel object
 139:      */
 140:     public function __construct(PHPExcel $phpExcel) {
 141:         $this->_phpExcel = $phpExcel;
 142:         $this->_defaultFont = $this->_phpExcel->getDefaultStyle()->getFont();
 143:     }
 144: 
 145:     /**
 146:      * Save PHPExcel to file
 147:      *
 148:      * @param   string      $pFilename
 149:      * @throws  PHPExcel_Writer_Exception
 150:      */
 151:     public function save($pFilename = null) {
 152:         // garbage collect
 153:         $this->_phpExcel->garbageCollect();
 154: 
 155:         $saveDebugLog = PHPExcel_Calculation::getInstance($this->_phpExcel)->getDebugLog()->getWriteDebugLog();
 156:         PHPExcel_Calculation::getInstance($this->_phpExcel)->getDebugLog()->setWriteDebugLog(FALSE);
 157:         $saveArrayReturnType = PHPExcel_Calculation::getArrayReturnType();
 158:         PHPExcel_Calculation::setArrayReturnType(PHPExcel_Calculation::RETURN_ARRAY_AS_VALUE);
 159: 
 160:         // Build CSS
 161:         $this->buildCSS(!$this->_useInlineCss);
 162: 
 163:         // Open file
 164:         $fileHandle = fopen($pFilename, 'wb+');
 165:         if ($fileHandle === false) {
 166:             throw new PHPExcel_Writer_Exception("Could not open file $pFilename for writing.");
 167:         }
 168: 
 169:         // Write headers
 170:         fwrite($fileHandle, $this->generateHTMLHeader(!$this->_useInlineCss));
 171: 
 172:         // Write navigation (tabs)
 173:         if ((!$this->_isPdf) && ($this->_generateSheetNavigationBlock)) {
 174:             fwrite($fileHandle, $this->generateNavigation());
 175:         }
 176: 
 177:         // Write data
 178:         fwrite($fileHandle, $this->generateSheetData());
 179: 
 180:         // Write footer
 181:         fwrite($fileHandle, $this->generateHTMLFooter());
 182: 
 183:         // Close file
 184:         fclose($fileHandle);
 185: 
 186:         PHPExcel_Calculation::setArrayReturnType($saveArrayReturnType);
 187:         PHPExcel_Calculation::getInstance($this->_phpExcel)->getDebugLog()->setWriteDebugLog($saveDebugLog);
 188:     }
 189: 
 190:     /**
 191:      * Map VAlign
 192:      *
 193:      * @param   string      $vAlign     Vertical alignment
 194:      * @return string
 195:      */
 196:     private function _mapVAlign($vAlign) {
 197:         switch ($vAlign) {
 198:             case PHPExcel_Style_Alignment::VERTICAL_BOTTOM:     return 'bottom';
 199:             case PHPExcel_Style_Alignment::VERTICAL_TOP:        return 'top';
 200:             case PHPExcel_Style_Alignment::VERTICAL_CENTER:
 201:             case PHPExcel_Style_Alignment::VERTICAL_JUSTIFY:    return 'middle';
 202:             default: return 'baseline';
 203:         }
 204:     }
 205: 
 206:     /**
 207:      * Map HAlign
 208:      *
 209:      * @param   string      $hAlign     Horizontal alignment
 210:      * @return string|false
 211:      */
 212:     private function _mapHAlign($hAlign) {
 213:         switch ($hAlign) {
 214:             case PHPExcel_Style_Alignment::HORIZONTAL_GENERAL:              return false;
 215:             case PHPExcel_Style_Alignment::HORIZONTAL_LEFT:                 return 'left';
 216:             case PHPExcel_Style_Alignment::HORIZONTAL_RIGHT:                return 'right';
 217:             case PHPExcel_Style_Alignment::HORIZONTAL_CENTER:
 218:             case PHPExcel_Style_Alignment::HORIZONTAL_CENTER_CONTINUOUS:    return 'center';
 219:             case PHPExcel_Style_Alignment::HORIZONTAL_JUSTIFY:              return 'justify';
 220:             default: return false;
 221:         }
 222:     }
 223: 
 224:     /**
 225:      * Map border style
 226:      *
 227:      * @param   int     $borderStyle        Sheet index
 228:      * @return  string
 229:      */
 230:     private function _mapBorderStyle($borderStyle) {
 231:         switch ($borderStyle) {
 232:             case PHPExcel_Style_Border::BORDER_NONE:                return 'none';
 233:             case PHPExcel_Style_Border::BORDER_DASHDOT:             return '1px dashed';
 234:             case PHPExcel_Style_Border::BORDER_DASHDOTDOT:          return '1px dotted';
 235:             case PHPExcel_Style_Border::BORDER_DASHED:              return '1px dashed';
 236:             case PHPExcel_Style_Border::BORDER_DOTTED:              return '1px dotted';
 237:             case PHPExcel_Style_Border::BORDER_DOUBLE:              return '3px double';
 238:             case PHPExcel_Style_Border::BORDER_HAIR:                return '1px solid';
 239:             case PHPExcel_Style_Border::BORDER_MEDIUM:              return '2px solid';
 240:             case PHPExcel_Style_Border::BORDER_MEDIUMDASHDOT:       return '2px dashed';
 241:             case PHPExcel_Style_Border::BORDER_MEDIUMDASHDOTDOT:    return '2px dotted';
 242:             case PHPExcel_Style_Border::BORDER_MEDIUMDASHED:        return '2px dashed';
 243:             case PHPExcel_Style_Border::BORDER_SLANTDASHDOT:        return '2px dashed';
 244:             case PHPExcel_Style_Border::BORDER_THICK:               return '3px solid';
 245:             case PHPExcel_Style_Border::BORDER_THIN:                return '1px solid';
 246:             default: return '1px solid'; // map others to thin
 247:         }
 248:     }
 249: 
 250:     /**
 251:      * Get sheet index
 252:      *
 253:      * @return int
 254:      */
 255:     public function getSheetIndex() {
 256:         return $this->_sheetIndex;
 257:     }
 258: 
 259:     /**
 260:      * Set sheet index
 261:      *
 262:      * @param   int     $pValue     Sheet index
 263:      * @return PHPExcel_Writer_HTML
 264:      */
 265:     public function setSheetIndex($pValue = 0) {
 266:         $this->_sheetIndex = $pValue;
 267:         return $this;
 268:     }
 269: 
 270:     /**
 271:      * Get sheet index
 272:      *
 273:      * @return boolean
 274:      */
 275:     public function getGenerateSheetNavigationBlock() {
 276:         return $this->_generateSheetNavigationBlock;
 277:     }
 278: 
 279:     /**
 280:      * Set sheet index
 281:      *
 282:      * @param   boolean     $pValue     Flag indicating whether the sheet navigation block should be generated or not
 283:      * @return PHPExcel_Writer_HTML
 284:      */
 285:     public function setGenerateSheetNavigationBlock($pValue = true) {
 286:         $this->_generateSheetNavigationBlock = (bool) $pValue;
 287:         return $this;
 288:     }
 289: 
 290:     /**
 291:      * Write all sheets (resets sheetIndex to NULL)
 292:      */
 293:     public function writeAllSheets() {
 294:         $this->_sheetIndex = null;
 295:         return $this;
 296:     }
 297: 
 298:     /**
 299:      * Generate HTML header
 300:      *
 301:      * @param   boolean     $pIncludeStyles     Include styles?
 302:      * @return  string
 303:      * @throws PHPExcel_Writer_Exception
 304:      */
 305:     public function generateHTMLHeader($pIncludeStyles = false) {
 306:         // PHPExcel object known?
 307:         if (is_null($this->_phpExcel)) {
 308:             throw new PHPExcel_Writer_Exception('Internal PHPExcel object not set to an instance of an object.');
 309:         }
 310: 
 311:         // Construct HTML
 312:         $properties = $this->_phpExcel->getProperties();
 313:         $html = '<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">' . PHP_EOL;
 314:         $html .= '<!-- Generated by PHPExcel - http://www.phpexcel.net -->' . PHP_EOL;
 315:         $html .= '<html>' . PHP_EOL;
 316:         $html .= '  <head>' . PHP_EOL;
 317:         $html .= '    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">' . PHP_EOL;
 318:         if ($properties->getTitle() > '')
 319:             $html .= '    <title>' . htmlspecialchars($properties->getTitle()) . '</title>' . PHP_EOL;
 320: 
 321:         if ($properties->getCreator() > '')
 322:             $html .= '    <meta name="author" content="' . htmlspecialchars($properties->getCreator()) . '" />' . PHP_EOL;
 323:         if ($properties->getTitle() > '')
 324:             $html .= '    <meta name="title" content="' . htmlspecialchars($properties->getTitle()) . '" />' . PHP_EOL;
 325:         if ($properties->getDescription() > '')
 326:             $html .= '    <meta name="description" content="' . htmlspecialchars($properties->getDescription()) . '" />' . PHP_EOL;
 327:         if ($properties->getSubject() > '')
 328:             $html .= '    <meta name="subject" content="' . htmlspecialchars($properties->getSubject()) . '" />' . PHP_EOL;
 329:         if ($properties->getKeywords() > '')
 330:             $html .= '    <meta name="keywords" content="' . htmlspecialchars($properties->getKeywords()) . '" />' . PHP_EOL;
 331:         if ($properties->getCategory() > '')
 332:             $html .= '    <meta name="category" content="' . htmlspecialchars($properties->getCategory()) . '" />' . PHP_EOL;
 333:         if ($properties->getCompany() > '')
 334:             $html .= '    <meta name="company" content="' . htmlspecialchars($properties->getCompany()) . '" />' . PHP_EOL;
 335:         if ($properties->getManager() > '')
 336:             $html .= '    <meta name="manager" content="' . htmlspecialchars($properties->getManager()) . '" />' . PHP_EOL;
 337: 
 338:         if ($pIncludeStyles) {
 339:             $html .= $this->generateStyles(true);
 340:         }
 341: 
 342:         $html .= '  </head>' . PHP_EOL;
 343:         $html .= '' . PHP_EOL;
 344:         $html .= '  <body>' . PHP_EOL;
 345: 
 346:         // Return
 347:         return $html;
 348:     }
 349: 
 350:     /**
 351:      * Generate sheet data
 352:      *
 353:      * @return  string
 354:      * @throws PHPExcel_Writer_Exception
 355:      */
 356:     public function generateSheetData() {
 357:         // PHPExcel object known?
 358:         if (is_null($this->_phpExcel)) {
 359:             throw new PHPExcel_Writer_Exception('Internal PHPExcel object not set to an instance of an object.');
 360:         }
 361: 
 362:         // Ensure that Spans have been calculated?
 363:         if (!$this->_spansAreCalculated) {
 364:             $this->_calculateSpans();
 365:         }
 366: 
 367:         // Fetch sheets
 368:         $sheets = array();
 369:         if (is_null($this->_sheetIndex)) {
 370:             $sheets = $this->_phpExcel->getAllSheets();
 371:         } else {
 372:             $sheets[] = $this->_phpExcel->getSheet($this->_sheetIndex);
 373:         }
 374: 
 375:         // Construct HTML
 376:         $html = '';
 377: 
 378:         // Loop all sheets
 379:         $sheetId = 0;
 380:         foreach ($sheets as $sheet) {
 381:             // Write table header
 382:             $html .= $this->_generateTableHeader($sheet);
 383: 
 384:             // Get worksheet dimension
 385:             $dimension = explode(':', $sheet->calculateWorksheetDimension());
 386:             $dimension[0] = PHPExcel_Cell::coordinateFromString($dimension[0]);
 387:             $dimension[0][0] = PHPExcel_Cell::columnIndexFromString($dimension[0][0]) - 1;
 388:             $dimension[1] = PHPExcel_Cell::coordinateFromString($dimension[1]);
 389:             $dimension[1][0] = PHPExcel_Cell::columnIndexFromString($dimension[1][0]) - 1;
 390: 
 391:             // row min,max
 392:             $rowMin = $dimension[0][1];
 393:             $rowMax = $dimension[1][1];
 394: 
 395:             // calculate start of <tbody>, <thead>
 396:             $tbodyStart = $rowMin;
 397:             $theadStart = $theadEnd   = 0; // default: no <thead>   no </thead>
 398:             if ($sheet->getPageSetup()->isRowsToRepeatAtTopSet()) {
 399:                 $rowsToRepeatAtTop = $sheet->getPageSetup()->getRowsToRepeatAtTop();
 400: 
 401:                 // we can only support repeating rows that start at top row
 402:                 if ($rowsToRepeatAtTop[0] == 1) {
 403:                     $theadStart = $rowsToRepeatAtTop[0];
 404:                     $theadEnd   = $rowsToRepeatAtTop[1];
 405:                     $tbodyStart = $rowsToRepeatAtTop[1] + 1;
 406:                 }
 407:             }
 408: 
 409:             // Loop through cells
 410:             $row = $rowMin-1;
 411:             while($row++ < $rowMax) {
 412:                 // <thead> ?
 413:                 if ($row == $theadStart) {
 414:                     $html .= '      <thead>' . PHP_EOL;
 415:                 }
 416: 
 417:                 // <tbody> ?
 418:                 if ($row == $tbodyStart) {
 419:                     $html .= '      <tbody>' . PHP_EOL;
 420:                 }
 421: 
 422:                 // Write row if there are HTML table cells in it
 423:                 if ( !isset($this->_isSpannedRow[$sheet->getParent()->getIndex($sheet)][$row]) ) {
 424:                     // Start a new rowData
 425:                     $rowData = array();
 426:                     // Loop through columns
 427:                     $column = $dimension[0][0] - 1;
 428:                     while($column++ < $dimension[1][0]) {
 429:                         // Cell exists?
 430:                         if ($sheet->cellExistsByColumnAndRow($column, $row)) {
 431:                             $rowData[$column] = PHPExcel_Cell::stringFromColumnIndex($column) . $row;
 432:                         } else {
 433:                             $rowData[$column] = '';
 434:                         }
 435:                     }
 436:                     $html .= $this->_generateRow($sheet, $rowData, $row - 1);
 437:                 }
 438: 
 439:                 // </thead> ?
 440:                 if ($row == $theadEnd) {
 441:                     $html .= '      </thead>' . PHP_EOL;
 442:                 }
 443:             }
 444:             $html .= $this->_extendRowsForChartsAndImages($sheet, $row);
 445: 
 446:             // Close table body.
 447:             $html .= '      </tbody>' . PHP_EOL;
 448: 
 449:             // Write table footer
 450:             $html .= $this->_generateTableFooter();
 451: 
 452:             // Writing PDF?
 453:             if ($this->_isPdf) {
 454:                 if (is_null($this->_sheetIndex) && $sheetId + 1 < $this->_phpExcel->getSheetCount()) {
 455:                     $html .= '<div style="page-break-before:always" />';
 456:                 }
 457:             }
 458: 
 459:             // Next sheet
 460:             ++$sheetId;
 461:         }
 462: 
 463:         // Return
 464:         return $html;
 465:     }
 466: 
 467:     /**
 468:      * Generate sheet tabs
 469:      *
 470:      * @return  string
 471:      * @throws PHPExcel_Writer_Exception
 472:      */
 473:     public function generateNavigation()
 474:     {
 475:         // PHPExcel object known?
 476:         if (is_null($this->_phpExcel)) {
 477:             throw new PHPExcel_Writer_Exception('Internal PHPExcel object not set to an instance of an object.');
 478:         }
 479: 
 480:         // Fetch sheets
 481:         $sheets = array();
 482:         if (is_null($this->_sheetIndex)) {
 483:             $sheets = $this->_phpExcel->getAllSheets();
 484:         } else {
 485:             $sheets[] = $this->_phpExcel->getSheet($this->_sheetIndex);
 486:         }
 487: 
 488:         // Construct HTML
 489:         $html = '';
 490: 
 491:         // Only if there are more than 1 sheets
 492:         if (count($sheets) > 1) {
 493:             // Loop all sheets
 494:             $sheetId = 0;
 495: 
 496:             $html .= '<ul class="navigation">' . PHP_EOL;
 497: 
 498:             foreach ($sheets as $sheet) {
 499:                 $html .= '  <li class="sheet' . $sheetId . '"><a href="#sheet' . $sheetId . '">' . $sheet->getTitle() . '</a></li>' . PHP_EOL;
 500:                 ++$sheetId;
 501:             }
 502: 
 503:             $html .= '</ul>' . PHP_EOL;
 504:         }
 505: 
 506:         return $html;
 507:     }
 508: 
 509:     private function _extendRowsForChartsAndImages(PHPExcel_Worksheet $pSheet, $row) {
 510:         $rowMax = $row;
 511:         $colMax = 'A';
 512:         if ($this->_includeCharts) {
 513:             foreach ($pSheet->getChartCollection() as $chart) {
 514:                 if ($chart instanceof PHPExcel_Chart) {
 515:                     $chartCoordinates = $chart->getTopLeftPosition();
 516:                     $chartTL = PHPExcel_Cell::coordinateFromString($chartCoordinates['cell']);
 517:                     $chartCol = PHPExcel_Cell::columnIndexFromString($chartTL[0]);
 518:                     if ($chartTL[1] > $rowMax) {
 519:                         $rowMax = $chartTL[1];
 520:                         if ($chartCol > PHPExcel_Cell::columnIndexFromString($colMax)) {
 521:                             $colMax = $chartTL[0];
 522:                         }
 523:                     }
 524:                 }
 525:             }
 526:         }
 527: 
 528:         foreach ($pSheet->getDrawingCollection() as $drawing) {
 529:             if ($drawing instanceof PHPExcel_Worksheet_Drawing) {
 530:                 $imageTL = PHPExcel_Cell::coordinateFromString($drawing->getCoordinates());
 531:                 $imageCol = PHPExcel_Cell::columnIndexFromString($imageTL[0]);
 532:                 if ($imageTL[1] > $rowMax) {
 533:                     $rowMax = $imageTL[1];
 534:                     if ($imageCol > PHPExcel_Cell::columnIndexFromString($colMax)) {
 535:                         $colMax = $imageTL[0];
 536:                     }
 537:                 }
 538:             }
 539:         }
 540:         $html = '';
 541:         $colMax++;
 542:         while ($row < $rowMax) {
 543:             $html .= '<tr>';
 544:             for ($col = 'A'; $col != $colMax; ++$col) {
 545:                 $html .= '<td>';
 546:                 $html .= $this->_writeImageInCell($pSheet, $col.$row);
 547:                 if ($this->_includeCharts) {
 548:                     $html .= $this->_writeChartInCell($pSheet, $col.$row);
 549:                 }
 550:                 $html .= '</td>';
 551:             }
 552:             ++$row;
 553:             $html .= '</tr>';
 554:         }
 555:         return $html;
 556:     }
 557: 
 558: 
 559:     /**
 560:      * Generate image tag in cell
 561:      *
 562:      * @param   PHPExcel_Worksheet  $pSheet         PHPExcel_Worksheet
 563:      * @param   string              $coordinates    Cell coordinates
 564:      * @return  string
 565:      * @throws  PHPExcel_Writer_Exception
 566:      */
 567:     private function _writeImageInCell(PHPExcel_Worksheet $pSheet, $coordinates) {
 568:         // Construct HTML
 569:         $html = '';
 570: 
 571:         // Write images
 572:         foreach ($pSheet->getDrawingCollection() as $drawing) {
 573:             if ($drawing instanceof PHPExcel_Worksheet_Drawing) {
 574:                 if ($drawing->getCoordinates() == $coordinates) {
 575:                     $filename = $drawing->getPath();
 576: 
 577:                     // Strip off eventual '.'
 578:                     if (substr($filename, 0, 1) == '.') {
 579:                         $filename = substr($filename, 1);
 580:                     }
 581: 
 582:                     // Prepend images root
 583:                     $filename = $this->getImagesRoot() . $filename;
 584: 
 585:                     // Strip off eventual '.'
 586:                     if (substr($filename, 0, 1) == '.' && substr($filename, 0, 2) != './') {
 587:                         $filename = substr($filename, 1);
 588:                     }
 589: 
 590:                     // Convert UTF8 data to PCDATA
 591:                     $filename = htmlspecialchars($filename);
 592: 
 593:                     $html .= PHP_EOL;
 594:                     if ((!$this->_embedImages) || ($this->_isPdf)) {
 595:                         $imageData = $filename;
 596:                     } else {
 597:                         $imageDetails = getimagesize($filename);
 598:                         if ($fp = fopen($filename,"rb", 0)) {
 599:                             $picture = fread($fp,filesize($filename));
 600:                             fclose($fp);
 601:                             // base64 encode the binary data, then break it
 602:                             // into chunks according to RFC 2045 semantics
 603:                             $base64 = chunk_split(base64_encode($picture));
 604:                             $imageData = 'data:'.$imageDetails['mime'].';base64,' . $base64;
 605:                         } else {
 606:                             $imageData = $filename;
 607:                         }
 608:                     }
 609: 
 610:                     $html .= '<div style="position: relative;">';
 611:                     $html .= '<img style="position: absolute; z-index: 1; left: ' . 
 612:                         $drawing->getOffsetX() . 'px; top: ' . $drawing->getOffsetY() . 'px; width: ' . 
 613:                         $drawing->getWidth() . 'px; height: ' . $drawing->getHeight() . 'px;" src="' . 
 614:                         $imageData . '" border="0" />';
 615:                     $html .= '</div>';
 616:                 }
 617:             }
 618:         }
 619: 
 620:         // Return
 621:         return $html;
 622:     }
 623: 
 624:     /**
 625:      * Generate chart tag in cell
 626:      *
 627:      * @param   PHPExcel_Worksheet  $pSheet         PHPExcel_Worksheet
 628:      * @param   string              $coordinates    Cell coordinates
 629:      * @return  string
 630:      * @throws  PHPExcel_Writer_Exception
 631:      */
 632:     private function _writeChartInCell(PHPExcel_Worksheet $pSheet, $coordinates) {
 633:         // Construct HTML
 634:         $html = '';
 635: 
 636:         // Write charts
 637:         foreach ($pSheet->getChartCollection() as $chart) {
 638:             if ($chart instanceof PHPExcel_Chart) {
 639:                 $chartCoordinates = $chart->getTopLeftPosition();
 640:                 if ($chartCoordinates['cell'] == $coordinates) {
 641:                     $chartFileName = PHPExcel_Shared_File::sys_get_temp_dir().'/'.uniqid().'.png';
 642:                     if (!$chart->render($chartFileName)) {
 643:                         return;
 644:                     }
 645: 
 646:                     $html .= PHP_EOL;
 647:                     $imageDetails = getimagesize($chartFileName);
 648:                     if ($fp = fopen($chartFileName,"rb", 0)) {
 649:                         $picture = fread($fp,filesize($chartFileName));
 650:                         fclose($fp);
 651:                         // base64 encode the binary data, then break it
 652:                         // into chunks according to RFC 2045 semantics
 653:                         $base64 = chunk_split(base64_encode($picture));
 654:                         $imageData = 'data:'.$imageDetails['mime'].';base64,' . $base64;
 655: 
 656:                         $html .= '<div style="position: relative;">';
 657:                         $html .= '<img style="position: absolute; z-index: 1; left: ' . $chartCoordinates['xOffset'] . 'px; top: ' . $chartCoordinates['yOffset'] . 'px; width: ' . $imageDetails[0] . 'px; height: ' . $imageDetails[1] . 'px;" src="' . $imageData . '" border="0" />' . PHP_EOL;
 658:                         $html .= '</div>';
 659: 
 660:                         unlink($chartFileName);
 661:                     }
 662:                 }
 663:             }
 664:         }
 665: 
 666:         // Return
 667:         return $html;
 668:     }
 669: 
 670:     /**
 671:      * Generate CSS styles
 672:      *
 673:      * @param   boolean $generateSurroundingHTML    Generate surrounding HTML tags? (<style> and </style>)
 674:      * @return  string
 675:      * @throws  PHPExcel_Writer_Exception
 676:      */
 677:     public function generateStyles($generateSurroundingHTML = true) {
 678:         // PHPExcel object known?
 679:         if (is_null($this->_phpExcel)) {
 680:             throw new PHPExcel_Writer_Exception('Internal PHPExcel object not set to an instance of an object.');
 681:         }
 682: 
 683:         // Build CSS
 684:         $css = $this->buildCSS($generateSurroundingHTML);
 685: 
 686:         // Construct HTML
 687:         $html = '';
 688: 
 689:         // Start styles
 690:         if ($generateSurroundingHTML) {
 691:             $html .= '  <style type="text/css">' . PHP_EOL;
 692:             $html .= '    html { ' . $this->_assembleCSS($css['html']) . ' }' . PHP_EOL;
 693:         }
 694: 
 695:         // Write all other styles
 696:         foreach ($css as $styleName => $styleDefinition) {
 697:             if ($styleName != 'html') {
 698:                 $html .= '    ' . $styleName . ' { ' . $this->_assembleCSS($styleDefinition) . ' }' . PHP_EOL;
 699:             }
 700:         }
 701: 
 702:         // End styles
 703:         if ($generateSurroundingHTML) {
 704:             $html .= '  </style>' . PHP_EOL;
 705:         }
 706: 
 707:         // Return
 708:         return $html;
 709:     }
 710: 
 711:     /**
 712:      * Build CSS styles
 713:      *
 714:      * @param   boolean $generateSurroundingHTML    Generate surrounding HTML style? (html { })
 715:      * @return  array
 716:      * @throws  PHPExcel_Writer_Exception
 717:      */
 718:     public function buildCSS($generateSurroundingHTML = true) {
 719:         // PHPExcel object known?
 720:         if (is_null($this->_phpExcel)) {
 721:             throw new PHPExcel_Writer_Exception('Internal PHPExcel object not set to an instance of an object.');
 722:         }
 723: 
 724:         // Cached?
 725:         if (!is_null($this->_cssStyles)) {
 726:             return $this->_cssStyles;
 727:         }
 728: 
 729:         // Ensure that spans have been calculated
 730:         if (!$this->_spansAreCalculated) {
 731:             $this->_calculateSpans();
 732:         }
 733: 
 734:         // Construct CSS
 735:         $css = array();
 736: 
 737:         // Start styles
 738:         if ($generateSurroundingHTML) {
 739:             // html { }
 740:             $css['html']['font-family']   = 'Calibri, Arial, Helvetica, sans-serif';
 741:             $css['html']['font-size']       = '11pt';
 742:             $css['html']['background-color'] = 'white';
 743:         }
 744: 
 745: 
 746:         // table { }
 747:         $css['table']['border-collapse']  = 'collapse';
 748:         if (!$this->_isPdf) {
 749:             $css['table']['page-break-after'] = 'always';
 750:         }
 751: 
 752:         // .gridlines td { }
 753:         $css['.gridlines td']['border'] = '1px dotted black';
 754: 
 755:         // .b {}
 756:         $css['.b']['text-align'] = 'center'; // BOOL
 757: 
 758:         // .e {}
 759:         $css['.e']['text-align'] = 'center'; // ERROR
 760: 
 761:         // .f {}
 762:         $css['.f']['text-align'] = 'right'; // FORMULA
 763: 
 764:         // .inlineStr {}
 765:         $css['.inlineStr']['text-align'] = 'left'; // INLINE
 766: 
 767:         // .n {}
 768:         $css['.n']['text-align'] = 'right'; // NUMERIC
 769: 
 770:         // .s {}
 771:         $css['.s']['text-align'] = 'left'; // STRING
 772: 
 773:         // Calculate cell style hashes
 774:         foreach ($this->_phpExcel->getCellXfCollection() as $index => $style) {
 775:             $css['td.style' . $index] = $this->_createCSSStyle( $style );
 776:         }
 777: 
 778:         // Fetch sheets
 779:         $sheets = array();
 780:         if (is_null($this->_sheetIndex)) {
 781:             $sheets = $this->_phpExcel->getAllSheets();
 782:         } else {
 783:             $sheets[] = $this->_phpExcel->getSheet($this->_sheetIndex);
 784:         }
 785: 
 786:         // Build styles per sheet
 787:         foreach ($sheets as $sheet) {
 788:             // Calculate hash code
 789:             $sheetIndex = $sheet->getParent()->getIndex($sheet);
 790: 
 791:             // Build styles
 792:             // Calculate column widths
 793:             $sheet->calculateColumnWidths();
 794: 
 795:             // col elements, initialize
 796:             $highestColumnIndex = PHPExcel_Cell::columnIndexFromString($sheet->getHighestColumn()) - 1;
 797:             $column = -1;
 798:             while($column++ < $highestColumnIndex) {
 799:                 $this->_columnWidths[$sheetIndex][$column] = 42; // approximation
 800:                 $css['table.sheet' . $sheetIndex . ' col.col' . $column]['width'] = '42pt';
 801:             }
 802: 
 803:             // col elements, loop through columnDimensions and set width
 804:             foreach ($sheet->getColumnDimensions() as $columnDimension) {
 805:                 if (($width = PHPExcel_Shared_Drawing::cellDimensionToPixels($columnDimension->getWidth(), $this->_defaultFont)) >= 0) {
 806:                     $width = PHPExcel_Shared_Drawing::pixelsToPoints($width);
 807:                     $column = PHPExcel_Cell::columnIndexFromString($columnDimension->getColumnIndex()) - 1;
 808:                     $this->_columnWidths[$sheetIndex][$column] = $width;
 809:                     $css['table.sheet' . $sheetIndex . ' col.col' . $column]['width'] = $width . 'pt';
 810: 
 811:                     if ($columnDimension->getVisible() === false) {
 812:                         $css['table.sheet' . $sheetIndex . ' col.col' . $column]['visibility'] = 'collapse';
 813:                         $css['table.sheet' . $sheetIndex . ' col.col' . $column]['*display'] = 'none'; // target IE6+7
 814:                     }
 815:                 }
 816:             }
 817: 
 818:             // Default row height
 819:             $rowDimension = $sheet->getDefaultRowDimension();
 820: 
 821:             // table.sheetN tr { }
 822:             $css['table.sheet' . $sheetIndex . ' tr'] = array();
 823: 
 824:             if ($rowDimension->getRowHeight() == -1) {
 825:                 $pt_height = PHPExcel_Shared_Font::getDefaultRowHeightByFont($this->_phpExcel->getDefaultStyle()->getFont());
 826:             } else {
 827:                 $pt_height = $rowDimension->getRowHeight();
 828:             }
 829:             $css['table.sheet' . $sheetIndex . ' tr']['height'] = $pt_height . 'pt';
 830:             if ($rowDimension->getVisible() === false) {
 831:                 $css['table.sheet' . $sheetIndex . ' tr']['display']    = 'none';
 832:                 $css['table.sheet' . $sheetIndex . ' tr']['visibility'] = 'hidden';
 833:             }
 834: 
 835:             // Calculate row heights
 836:             foreach ($sheet->getRowDimensions() as $rowDimension) {
 837:                 $row = $rowDimension->getRowIndex() - 1;
 838: 
 839:                 // table.sheetN tr.rowYYYYYY { }
 840:                 $css['table.sheet' . $sheetIndex . ' tr.row' . $row] = array();
 841: 
 842:                 if ($rowDimension->getRowHeight() == -1) {
 843:                     $pt_height = PHPExcel_Shared_Font::getDefaultRowHeightByFont($this->_phpExcel->getDefaultStyle()->getFont());
 844:                 } else {
 845:                     $pt_height = $rowDimension->getRowHeight();
 846:                 }
 847:                 $css['table.sheet' . $sheetIndex . ' tr.row' . $row]['height'] = $pt_height . 'pt';
 848:                 if ($rowDimension->getVisible() === false) {
 849:                     $css['table.sheet' . $sheetIndex . ' tr.row' . $row]['display'] = 'none';
 850:                     $css['table.sheet' . $sheetIndex . ' tr.row' . $row]['visibility'] = 'hidden';
 851:                 }
 852:             }
 853:         }
 854: 
 855:         // Cache
 856:         if (is_null($this->_cssStyles)) {
 857:             $this->_cssStyles = $css;
 858:         }
 859: 
 860:         // Return
 861:         return $css;
 862:     }
 863: 
 864:     /**
 865:      * Create CSS style
 866:      *
 867:      * @param   PHPExcel_Style      $pStyle         PHPExcel_Style
 868:      * @return  array
 869:      */
 870:     private function _createCSSStyle(PHPExcel_Style $pStyle) {
 871:         // Construct CSS
 872:         $css = '';
 873: 
 874:         // Create CSS
 875:         $css = array_merge(
 876:             $this->_createCSSStyleAlignment($pStyle->getAlignment())
 877:             , $this->_createCSSStyleBorders($pStyle->getBorders())
 878:             , $this->_createCSSStyleFont($pStyle->getFont())
 879:             , $this->_createCSSStyleFill($pStyle->getFill())
 880:         );
 881: 
 882:         // Return
 883:         return $css;
 884:     }
 885: 
 886:     /**
 887:      * Create CSS style (PHPExcel_Style_Alignment)
 888:      *
 889:      * @param   PHPExcel_Style_Alignment        $pStyle         PHPExcel_Style_Alignment
 890:      * @return  array
 891:      */
 892:     private function _createCSSStyleAlignment(PHPExcel_Style_Alignment $pStyle) {
 893:         // Construct CSS
 894:         $css = array();
 895: 
 896:         // Create CSS
 897:         $css['vertical-align'] = $this->_mapVAlign($pStyle->getVertical());
 898:         if ($textAlign = $this->_mapHAlign($pStyle->getHorizontal())) {
 899:             $css['text-align'] = $textAlign;
 900:             if(in_array($textAlign,array('left','right')))
 901:                 $css['padding-'.$textAlign] = (string)((int)$pStyle->getIndent() * 9).'px';
 902:         }
 903: 
 904:         // Return
 905:         return $css;
 906:     }
 907: 
 908:     /**
 909:      * Create CSS style (PHPExcel_Style_Font)
 910:      *
 911:      * @param   PHPExcel_Style_Font     $pStyle         PHPExcel_Style_Font
 912:      * @return  array
 913:      */
 914:     private function _createCSSStyleFont(PHPExcel_Style_Font $pStyle) {
 915:         // Construct CSS
 916:         $css = array();
 917: 
 918:         // Create CSS
 919:         if ($pStyle->getBold()) {
 920:             $css['font-weight'] = 'bold';
 921:         }
 922:         if ($pStyle->getUnderline() != PHPExcel_Style_Font::UNDERLINE_NONE && $pStyle->getStrikethrough()) {
 923:             $css['text-decoration'] = 'underline line-through';
 924:         } else if ($pStyle->getUnderline() != PHPExcel_Style_Font::UNDERLINE_NONE) {
 925:             $css['text-decoration'] = 'underline';
 926:         } else if ($pStyle->getStrikethrough()) {
 927:             $css['text-decoration'] = 'line-through';
 928:         }
 929:         if ($pStyle->getItalic()) {
 930:             $css['font-style'] = 'italic';
 931:         }
 932: 
 933:         $css['color']       = '#' . $pStyle->getColor()->getRGB();
 934:         $css['font-family'] = '\'' . $pStyle->getName() . '\'';
 935:         $css['font-size']   = $pStyle->getSize() . 'pt';
 936: 
 937:         // Return
 938:         return $css;
 939:     }
 940: 
 941:     /**
 942:      * Create CSS style (PHPExcel_Style_Borders)
 943:      *
 944:      * @param   PHPExcel_Style_Borders      $pStyle         PHPExcel_Style_Borders
 945:      * @return  array
 946:      */
 947:     private function _createCSSStyleBorders(PHPExcel_Style_Borders $pStyle) {
 948:         // Construct CSS
 949:         $css = array();
 950: 
 951:         // Create CSS
 952:         $css['border-bottom']   = $this->_createCSSStyleBorder($pStyle->getBottom());
 953:         $css['border-top']      = $this->_createCSSStyleBorder($pStyle->getTop());
 954:         $css['border-left']     = $this->_createCSSStyleBorder($pStyle->getLeft());
 955:         $css['border-right']    = $this->_createCSSStyleBorder($pStyle->getRight());
 956: 
 957:         // Return
 958:         return $css;
 959:     }
 960: 
 961:     /**
 962:      * Create CSS style (PHPExcel_Style_Border)
 963:      *
 964:      * @param   PHPExcel_Style_Border       $pStyle         PHPExcel_Style_Border
 965:      * @return  string
 966:      */
 967:     private function _createCSSStyleBorder(PHPExcel_Style_Border $pStyle) {
 968:         // Create CSS
 969: //      $css = $this->_mapBorderStyle($pStyle->getBorderStyle()) . ' #' . $pStyle->getColor()->getRGB();
 970:         //  Create CSS - add !important to non-none border styles for merged cells  
 971:         $borderStyle = $this->_mapBorderStyle($pStyle->getBorderStyle());  
 972:         $css = $borderStyle . ' #' . $pStyle->getColor()->getRGB() . (($borderStyle == 'none') ? '' : ' !important'); 
 973: 
 974:         // Return
 975:         return $css;
 976:     }
 977: 
 978:     /**
 979:      * Create CSS style (PHPExcel_Style_Fill)
 980:      *
 981:      * @param   PHPExcel_Style_Fill     $pStyle         PHPExcel_Style_Fill
 982:      * @return  array
 983:      */
 984:     private function _createCSSStyleFill(PHPExcel_Style_Fill $pStyle) {
 985:         // Construct HTML
 986:         $css = array();
 987: 
 988:         // Create CSS
 989:         $value = $pStyle->getFillType() == PHPExcel_Style_Fill::FILL_NONE ?
 990:             'white' : '#' . $pStyle->getStartColor()->getRGB();
 991:         $css['background-color'] = $value;
 992: 
 993:         // Return
 994:         return $css;
 995:     }
 996: 
 997:     /**
 998:      * Generate HTML footer
 999:      */
1000:     public function generateHTMLFooter() {
1001:         // Construct HTML
1002:         $html = '';
1003:         $html .= '  </body>' . PHP_EOL;
1004:         $html .= '</html>' . PHP_EOL;
1005: 
1006:         // Return
1007:         return $html;
1008:     }
1009: 
1010:     /**
1011:      * Generate table header
1012:      *
1013:      * @param   PHPExcel_Worksheet  $pSheet     The worksheet for the table we are writing
1014:      * @return  string
1015:      * @throws  PHPExcel_Writer_Exception
1016:      */
1017:     private function _generateTableHeader($pSheet) {
1018:         $sheetIndex = $pSheet->getParent()->getIndex($pSheet);
1019: 
1020:         // Construct HTML
1021:         $html = '';
1022:         $html .= $this->_setMargins($pSheet);
1023:             
1024:         if (!$this->_useInlineCss) {
1025:             $gridlines = $pSheet->getShowGridlines() ? ' gridlines' : '';
1026:             $html .= '  <table border="0" cellpadding="0" cellspacing="0" id="sheet' . $sheetIndex . '" class="sheet' . $sheetIndex . $gridlines . '">' . PHP_EOL;
1027:         } else {
1028:             $style = isset($this->_cssStyles['table']) ?
1029:                 $this->_assembleCSS($this->_cssStyles['table']) : '';
1030: 
1031:             if ($this->_isPdf && $pSheet->getShowGridlines()) {
1032:                 $html .= '  <table border="1" cellpadding="1" id="sheet' . $sheetIndex . '" cellspacing="1" style="' . $style . '">' . PHP_EOL;
1033:             } else {
1034:                 $html .= '  <table border="0" cellpadding="1" id="sheet' . $sheetIndex . '" cellspacing="0" style="' . $style . '">' . PHP_EOL;
1035:             }
1036:         }
1037: 
1038:         // Write <col> elements
1039:         $highestColumnIndex = PHPExcel_Cell::columnIndexFromString($pSheet->getHighestColumn()) - 1;
1040:         $i = -1;
1041:         while($i++ < $highestColumnIndex) {
1042:             if (!$this->_isPdf) {
1043:                 if (!$this->_useInlineCss) {
1044:                     $html .= '      <col class="col' . $i . '">' . PHP_EOL;
1045:                 } else {
1046:                     $style = isset($this->_cssStyles['table.sheet' . $sheetIndex . ' col.col' . $i]) ?
1047:                         $this->_assembleCSS($this->_cssStyles['table.sheet' . $sheetIndex . ' col.col' . $i]) : '';
1048:                     $html .= '      <col style="' . $style . '">' . PHP_EOL;
1049:                 }
1050:             }
1051:         }
1052: 
1053:         // Return
1054:         return $html;
1055:     }
1056: 
1057:     /**
1058:      * Generate table footer
1059:      *
1060:      * @throws  PHPExcel_Writer_Exception
1061:      */
1062:     private function _generateTableFooter() {
1063:         // Construct HTML
1064:         $html = '';
1065:         $html .= '  </table>' . PHP_EOL;
1066: 
1067:         // Return
1068:         return $html;
1069:     }
1070: 
1071:     /**
1072:      * Generate row
1073:      *
1074:      * @param   PHPExcel_Worksheet  $pSheet         PHPExcel_Worksheet
1075:      * @param   array               $pValues        Array containing cells in a row
1076:      * @param   int                 $pRow           Row number (0-based)
1077:      * @return  string
1078:      * @throws  PHPExcel_Writer_Exception
1079:      */
1080:     private function _generateRow(PHPExcel_Worksheet $pSheet, $pValues = null, $pRow = 0) {
1081:         if (is_array($pValues)) {
1082:             // Construct HTML
1083:             $html = '';
1084: 
1085:             // Sheet index
1086:             $sheetIndex = $pSheet->getParent()->getIndex($pSheet);
1087: 
1088:             // DomPDF and breaks
1089:             if ($this->_isPdf && count($pSheet->getBreaks()) > 0) {
1090:                 $breaks = $pSheet->getBreaks();
1091: 
1092:                 // check if a break is needed before this row
1093:                 if (isset($breaks['A' . $pRow])) {
1094:                     // close table: </table>
1095:                     $html .= $this->_generateTableFooter();
1096: 
1097:                     // insert page break
1098:                     $html .= '<div style="page-break-before:always" />';
1099: 
1100:                     // open table again: <table> + <col> etc.
1101:                     $html .= $this->_generateTableHeader($pSheet);
1102:                 }
1103:             }
1104: 
1105:             // Write row start
1106:             if (!$this->_useInlineCss) {
1107:                 $html .= '        <tr class="row' . $pRow . '">' . PHP_EOL;
1108:             } else {
1109:                 $style = isset($this->_cssStyles['table.sheet' . $sheetIndex . ' tr.row' . $pRow])
1110:                     ? $this->_assembleCSS($this->_cssStyles['table.sheet' . $sheetIndex . ' tr.row' . $pRow]) : '';
1111: 
1112:                 $html .= '        <tr style="' . $style . '">' . PHP_EOL;
1113:             }
1114: 
1115:             // Write cells
1116:             $colNum = 0;
1117:             foreach ($pValues as $cellAddress) {
1118:                 $cell = ($cellAddress > '') ? $pSheet->getCell($cellAddress) : '';
1119:                 $coordinate = PHPExcel_Cell::stringFromColumnIndex($colNum) . ($pRow + 1);
1120:                 if (!$this->_useInlineCss) {
1121:                     $cssClass = '';
1122:                     $cssClass = 'column' . $colNum;
1123:                 } else {
1124:                     $cssClass = array();
1125:                     if (isset($this->_cssStyles['table.sheet' . $sheetIndex . ' td.column' . $colNum])) {
1126:                         $this->_cssStyles['table.sheet' . $sheetIndex . ' td.column' . $colNum];
1127:                     }
1128:                 }
1129:                 $colSpan = 1;
1130:                 $rowSpan = 1;
1131: 
1132:                 // initialize
1133:                 $cellData = '&nbsp;';
1134: 
1135:                 // PHPExcel_Cell
1136:                 if ($cell instanceof PHPExcel_Cell) {
1137:                     $cellData = '';
1138:                     if (is_null($cell->getParent())) {
1139:                         $cell->attach($pSheet);
1140:                     }
1141:                     // Value
1142:                     if ($cell->getValue() instanceof PHPExcel_RichText) {
1143:                         // Loop through rich text elements
1144:                         $elements = $cell->getValue()->getRichTextElements();
1145:                         foreach ($elements as $element) {
1146:                             // Rich text start?
1147:                             if ($element instanceof PHPExcel_RichText_Run) {
1148:                                 $cellData .= '<span style="' . $this->_assembleCSS($this->_createCSSStyleFont($element->getFont())) . '">';
1149: 
1150:                                 if ($element->getFont()->getSuperScript()) {
1151:                                     $cellData .= '<sup>';
1152:                                 } else if ($element->getFont()->getSubScript()) {
1153:                                     $cellData .= '<sub>';
1154:                                 }
1155:                             }
1156: 
1157:                             // Convert UTF8 data to PCDATA
1158:                             $cellText = $element->getText();
1159:                             $cellData .= htmlspecialchars($cellText);
1160: 
1161:                             if ($element instanceof PHPExcel_RichText_Run) {
1162:                                 if ($element->getFont()->getSuperScript()) {
1163:                                     $cellData .= '</sup>';
1164:                                 } else if ($element->getFont()->getSubScript()) {
1165:                                     $cellData .= '</sub>';
1166:                                 }
1167: 
1168:                                 $cellData .= '</span>';
1169:                             }
1170:                         }
1171:                     } else {
1172:                         if ($this->_preCalculateFormulas) {
1173:                             $cellData = PHPExcel_Style_NumberFormat::toFormattedString(
1174:                                 $cell->getCalculatedValue(),
1175:                                 $pSheet->getParent()->getCellXfByIndex( $cell->getXfIndex() )->getNumberFormat()->getFormatCode(),
1176:                                 array($this, 'formatColor')
1177:                             );
1178:                         } else {
1179:                             $cellData = PHPExcel_Style_NumberFormat::ToFormattedString(
1180:                                 $cell->getValue(),
1181:                                 $pSheet->getParent()->getCellXfByIndex( $cell->getXfIndex() )->getNumberFormat()->getFormatCode(),
1182:                                 array($this, 'formatColor')
1183:                             );
1184:                         }
1185:                         $cellData = htmlspecialchars($cellData);
1186:                         if ($pSheet->getParent()->getCellXfByIndex( $cell->getXfIndex() )->getFont()->getSuperScript()) {
1187:                             $cellData = '<sup>'.$cellData.'</sup>';
1188:                         } elseif ($pSheet->getParent()->getCellXfByIndex( $cell->getXfIndex() )->getFont()->getSubScript()) {
1189:                             $cellData = '<sub>'.$cellData.'</sub>';
1190:                         }
1191:                     }
1192: 
1193:                     // Converts the cell content so that spaces occuring at beginning of each new line are replaced by &nbsp;
1194:                     // Example: "  Hello\n to the world" is converted to "&nbsp;&nbsp;Hello\n&nbsp;to the world"
1195:                     $cellData = preg_replace("/(?m)(?:^|\\G) /", '&nbsp;', $cellData);
1196: 
1197:                     // convert newline "\n" to '<br>'
1198:                     $cellData = nl2br($cellData);
1199: 
1200:                     // Extend CSS class?
1201:                     if (!$this->_useInlineCss) {
1202:                         $cssClass .= ' style' . $cell->getXfIndex();
1203:                         $cssClass .= ' ' . $cell->getDataType();
1204:                     } else {
1205:                         if (isset($this->_cssStyles['td.style' . $cell->getXfIndex()])) {
1206:                             $cssClass = array_merge($cssClass, $this->_cssStyles['td.style' . $cell->getXfIndex()]);
1207:                         }
1208: 
1209:                         // General horizontal alignment: Actual horizontal alignment depends on dataType
1210:                         $sharedStyle = $pSheet->getParent()->getCellXfByIndex( $cell->getXfIndex() );
1211:                         if ($sharedStyle->getAlignment()->getHorizontal() == PHPExcel_Style_Alignment::HORIZONTAL_GENERAL
1212:                             && isset($this->_cssStyles['.' . $cell->getDataType()]['text-align']))
1213:                         {
1214:                             $cssClass['text-align'] = $this->_cssStyles['.' . $cell->getDataType()]['text-align'];
1215:                         }
1216:                     }
1217:                 }
1218: 
1219:                 // Hyperlink?
1220:                 if ($pSheet->hyperlinkExists($coordinate) && !$pSheet->getHyperlink($coordinate)->isInternal()) {
1221:                     $cellData = '<a href="' . htmlspecialchars($pSheet->getHyperlink($coordinate)->getUrl()) . '" title="' . htmlspecialchars($pSheet->getHyperlink($coordinate)->getTooltip()) . '">' . $cellData . '</a>';
1222:                 }
1223: 
1224:                 // Should the cell be written or is it swallowed by a rowspan or colspan?
1225:                 $writeCell = ! ( isset($this->_isSpannedCell[$pSheet->getParent()->getIndex($pSheet)][$pRow + 1][$colNum])
1226:                             && $this->_isSpannedCell[$pSheet->getParent()->getIndex($pSheet)][$pRow + 1][$colNum] );
1227: 
1228:                 // Colspan and Rowspan
1229:                 $colspan = 1;
1230:                 $rowspan = 1;
1231:                 if (isset($this->_isBaseCell[$pSheet->getParent()->getIndex($pSheet)][$pRow + 1][$colNum])) {
1232:                     $spans = $this->_isBaseCell[$pSheet->getParent()->getIndex($pSheet)][$pRow + 1][$colNum];
1233:                     $rowSpan = $spans['rowspan'];
1234:                     $colSpan = $spans['colspan'];
1235: 
1236:                     //  Also apply style from last cell in merge to fix borders -
1237:                     //      relies on !important for non-none border declarations in _createCSSStyleBorder
1238:                     $endCellCoord = PHPExcel_Cell::stringFromColumnIndex($colNum + $colSpan - 1) . ($pRow + $rowSpan);
1239:                     if (!$this->_useInlineCss) {
1240:                         $cssClass .= ' style' . $pSheet->getCell($endCellCoord)->getXfIndex();
1241:                     }
1242:                 }
1243: 
1244:                 // Write
1245:                 if ($writeCell) {
1246:                     // Column start
1247:                     $html .= '          <td';
1248:                         if (!$this->_useInlineCss) {
1249:                             $html .= ' class="' . $cssClass . '"';
1250:                         } else {
1251:                             //** Necessary redundant code for the sake of PHPExcel_Writer_PDF **
1252:                             // We must explicitly write the width of the <td> element because TCPDF
1253:                             // does not recognize e.g. <col style="width:42pt">
1254:                             $width = 0;
1255:                             $i = $colNum - 1;
1256:                             $e = $colNum + $colSpan - 1;
1257:                             while($i++ < $e) {
1258:                                 if (isset($this->_columnWidths[$sheetIndex][$i])) {
1259:                                     $width += $this->_columnWidths[$sheetIndex][$i];
1260:                                 }
1261:                             }
1262:                             $cssClass['width'] = $width . 'pt';
1263: 
1264:                             // We must also explicitly write the height of the <td> element because TCPDF
1265:                             // does not recognize e.g. <tr style="height:50pt">
1266:                             if (isset($this->_cssStyles['table.sheet' . $sheetIndex . ' tr.row' . $pRow]['height'])) {
1267:                                 $height = $this->_cssStyles['table.sheet' . $sheetIndex . ' tr.row' . $pRow]['height'];
1268:                                 $cssClass['height'] = $height;
1269:                             }
1270:                             //** end of redundant code **
1271: 
1272:                             $html .= ' style="' . $this->_assembleCSS($cssClass) . '"';
1273:                         }
1274:                         if ($colSpan > 1) {
1275:                             $html .= ' colspan="' . $colSpan . '"';
1276:                         }
1277:                         if ($rowSpan > 1) {
1278:                             $html .= ' rowspan="' . $rowSpan . '"';
1279:                         }
1280:                     $html .= '>';
1281: 
1282:                     // Image?
1283:                     $html .= $this->_writeImageInCell($pSheet, $coordinate);
1284: 
1285:                     // Chart?
1286:                     if ($this->_includeCharts) {
1287:                         $html .= $this->_writeChartInCell($pSheet, $coordinate);
1288:                     }
1289: 
1290:                     // Cell data
1291:                     $html .= $cellData;
1292: 
1293:                     // Column end
1294:                     $html .= '</td>' . PHP_EOL;
1295:                 }
1296: 
1297:                 // Next column
1298:                 ++$colNum;
1299:             }
1300: 
1301:             // Write row end
1302:             $html .= '        </tr>' . PHP_EOL;
1303: 
1304:             // Return
1305:             return $html;
1306:         } else {
1307:             throw new PHPExcel_Writer_Exception("Invalid parameters passed.");
1308:         }
1309:     }
1310: 
1311:     /**
1312:      * Takes array where of CSS properties / values and converts to CSS string
1313:      *
1314:      * @param array
1315:      * @return string
1316:      */
1317:     private function _assembleCSS($pValue = array())
1318:     {
1319:         $pairs = array();
1320:         foreach ($pValue as $property => $value) {
1321:             $pairs[] = $property . ':' . $value;
1322:         }
1323:         $string = implode('; ', $pairs);
1324: 
1325:         return $string;
1326:     }
1327: 
1328:     /**
1329:      * Get images root
1330:      *
1331:      * @return string
1332:      */
1333:     public function getImagesRoot() {
1334:         return $this->_imagesRoot;
1335:     }
1336: 
1337:     /**
1338:      * Set images root
1339:      *
1340:      * @param string $pValue
1341:      * @return PHPExcel_Writer_HTML
1342:      */
1343:     public function setImagesRoot($pValue = '.') {
1344:         $this->_imagesRoot = $pValue;
1345:         return $this;
1346:     }
1347: 
1348:     /**
1349:      * Get embed images
1350:      *
1351:      * @return boolean
1352:      */
1353:     public function getEmbedImages() {
1354:         return $this->_embedImages;
1355:     }
1356: 
1357:     /**
1358:      * Set embed images
1359:      *
1360:      * @param boolean $pValue
1361:      * @return PHPExcel_Writer_HTML
1362:      */
1363:     public function setEmbedImages($pValue = '.') {
1364:         $this->_embedImages = $pValue;
1365:         return $this;
1366:     }
1367: 
1368:     /**
1369:      * Get use inline CSS?
1370:      *
1371:      * @return boolean
1372:      */
1373:     public function getUseInlineCss() {
1374:         return $this->_useInlineCss;
1375:     }
1376: 
1377:     /**
1378:      * Set use inline CSS?
1379:      *
1380:      * @param boolean $pValue
1381:      * @return PHPExcel_Writer_HTML
1382:      */
1383:     public function setUseInlineCss($pValue = false) {
1384:         $this->_useInlineCss = $pValue;
1385:         return $this;
1386:     }
1387: 
1388:     /**
1389:      * Add color to formatted string as inline style
1390:      *
1391:      * @param string $pValue Plain formatted value without color
1392:      * @param string $pFormat Format code
1393:      * @return string
1394:      */
1395:     public function formatColor($pValue, $pFormat)
1396:     {
1397:         // Color information, e.g. [Red] is always at the beginning
1398:         $color = null; // initialize
1399:         $matches = array();
1400: 
1401:         $color_regex = '/^\\[[a-zA-Z]+\\]/';
1402:         if (preg_match($color_regex, $pFormat, $matches)) {
1403:             $color = str_replace('[', '', $matches[0]);
1404:             $color = str_replace(']', '', $color);
1405:             $color = strtolower($color);
1406:         }
1407: 
1408:         // convert to PCDATA
1409:         $value = htmlspecialchars($pValue);
1410: 
1411:         // color span tag
1412:         if ($color !== null) {
1413:             $value = '<span style="color:' . $color . '">' . $value . '</span>';
1414:         }
1415: 
1416:         return $value;
1417:     }
1418: 
1419:     /**
1420:      * Calculate information about HTML colspan and rowspan which is not always the same as Excel's
1421:      */
1422:     private function _calculateSpans()
1423:     {
1424:         // Identify all cells that should be omitted in HTML due to cell merge.
1425:         // In HTML only the upper-left cell should be written and it should have
1426:         //   appropriate rowspan / colspan attribute
1427:         $sheetIndexes = $this->_sheetIndex !== null ?
1428:             array($this->_sheetIndex) : range(0, $this->_phpExcel->getSheetCount() - 1);
1429: 
1430:         foreach ($sheetIndexes as $sheetIndex) {
1431:             $sheet = $this->_phpExcel->getSheet($sheetIndex);
1432: 
1433:             $candidateSpannedRow  = array();
1434: 
1435:             // loop through all Excel merged cells
1436:             foreach ($sheet->getMergeCells() as $cells) {
1437:                 list($cells, ) = PHPExcel_Cell::splitRange($cells);
1438:                 $first = $cells[0];
1439:                 $last  = $cells[1];
1440: 
1441:                 list($fc, $fr) = PHPExcel_Cell::coordinateFromString($first);
1442:                 $fc = PHPExcel_Cell::columnIndexFromString($fc) - 1;
1443: 
1444:                 list($lc, $lr) = PHPExcel_Cell::coordinateFromString($last);
1445:                 $lc = PHPExcel_Cell::columnIndexFromString($lc) - 1;
1446: 
1447:                 // loop through the individual cells in the individual merge
1448:                 $r = $fr - 1;
1449:                 while($r++ < $lr) {
1450:                     // also, flag this row as a HTML row that is candidate to be omitted
1451:                     $candidateSpannedRow[$r] = $r;
1452: 
1453:                     $c = $fc - 1;
1454:                     while($c++ < $lc) {
1455:                         if ( !($c == $fc && $r == $fr) ) {
1456:                             // not the upper-left cell (should not be written in HTML)
1457:                             $this->_isSpannedCell[$sheetIndex][$r][$c] = array(
1458:                                 'baseCell' => array($fr, $fc),
1459:                             );
1460:                         } else {
1461:                             // upper-left is the base cell that should hold the colspan/rowspan attribute
1462:                             $this->_isBaseCell[$sheetIndex][$r][$c] = array(
1463:                                 'xlrowspan' => $lr - $fr + 1, // Excel rowspan
1464:                                 'rowspan'   => $lr - $fr + 1, // HTML rowspan, value may change
1465:                                 'xlcolspan' => $lc - $fc + 1, // Excel colspan
1466:                                 'colspan'   => $lc - $fc + 1, // HTML colspan, value may change
1467:                             );
1468:                         }
1469:                     }
1470:                 }
1471:             }
1472: 
1473:             // Identify which rows should be omitted in HTML. These are the rows where all the cells
1474:             //   participate in a merge and the where base cells are somewhere above.
1475:             $countColumns = PHPExcel_Cell::columnIndexFromString($sheet->getHighestColumn());
1476:             foreach ($candidateSpannedRow as $rowIndex) {
1477:                 if (isset($this->_isSpannedCell[$sheetIndex][$rowIndex])) {
1478:                     if (count($this->_isSpannedCell[$sheetIndex][$rowIndex]) == $countColumns) {
1479:                         $this->_isSpannedRow[$sheetIndex][$rowIndex] = $rowIndex;
1480:                     };
1481:                 }
1482:             }
1483: 
1484:             // For each of the omitted rows we found above, the affected rowspans should be subtracted by 1
1485:             if ( isset($this->_isSpannedRow[$sheetIndex]) ) {
1486:                 foreach ($this->_isSpannedRow[$sheetIndex] as $rowIndex) {
1487:                     $adjustedBaseCells = array();
1488:                     $c = -1;
1489:                     $e = $countColumns - 1;
1490:                     while($c++ < $e) {
1491:                         $baseCell = $this->_isSpannedCell[$sheetIndex][$rowIndex][$c]['baseCell'];
1492: 
1493:                         if ( !in_array($baseCell, $adjustedBaseCells) ) {
1494:                             // subtract rowspan by 1
1495:                             --$this->_isBaseCell[$sheetIndex][ $baseCell[0] ][ $baseCell[1] ]['rowspan'];
1496:                             $adjustedBaseCells[] = $baseCell;
1497:                         }
1498:                     }
1499:                 }
1500:             }
1501: 
1502:             // TODO: Same for columns
1503:         }
1504: 
1505:         // We have calculated the spans
1506:         $this->_spansAreCalculated = true;
1507:     }
1508: 
1509:     private function _setMargins(PHPExcel_Worksheet $pSheet) {
1510:         $htmlPage = '@page { ';
1511:         $htmlBody = 'body { ';
1512: 
1513:         $left = PHPExcel_Shared_String::FormatNumber($pSheet->getPageMargins()->getLeft()) . 'in; ';
1514:         $htmlPage .= 'left-margin: ' . $left;
1515:         $htmlBody .= 'left-margin: ' . $left;
1516:         $right = PHPExcel_Shared_String::FormatNumber($pSheet->getPageMargins()->getRight()) . 'in; ';
1517:         $htmlPage .= 'right-margin: ' . $right;
1518:         $htmlBody .= 'right-margin: ' . $right;
1519:         $top = PHPExcel_Shared_String::FormatNumber($pSheet->getPageMargins()->getTop()) . 'in; ';
1520:         $htmlPage .= 'top-margin: ' . $top;
1521:         $htmlBody .= 'top-margin: ' . $top;
1522:         $bottom = PHPExcel_Shared_String::FormatNumber($pSheet->getPageMargins()->getBottom()) . 'in; ';
1523:         $htmlPage .= 'bottom-margin: ' . $bottom;
1524:         $htmlBody .= 'bottom-margin: ' . $bottom;
1525: 
1526:         $htmlPage .= "}\n";
1527:         $htmlBody .= "}\n";
1528: 
1529:         return "<style>\n" . $htmlPage . $htmlBody . "</style>\n";
1530:     }
1531:     
1532: }
1533: 
Autene API documentation generated by ApiGen