Source for file Excel2007.php
Documentation is available at Excel2007.php 
 * Copyright (c) 2006 - 2011 PHPExcel  
 * This library is free software; you can redistribute it and/or  
 * modify it under the terms of the GNU Lesser General Public  
 * License as published by the Free Software Foundation; either  
 * version 2.1 of the License, or (at your option) any later version.  
 * This library is distributed in the hope that it will be useful,  
 * but WITHOUT ANY WARRANTY; without even the implied warranty of  
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU  
 * Lesser General Public License for more details.  
 * You should have received a copy of the GNU Lesser General Public  
 * License along with this library; if not, write to the Free Software  
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA  
 * @package    PHPExcel_Reader  
 * @copyright  Copyright (c) 2006 - 2011 PHPExcel (http://www.codeplex.com/PHPExcel)  
 * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL  
 * @version    1.7.6, 2011-02-27  
/** PHPExcel root directory */  
    define('PHPEXCEL_ROOT', dirname(__FILE__ ) .  '/../../');  
    require (PHPEXCEL_ROOT .  'PHPExcel/Autoloader.php'); 
 *    PHPExcel_Reader_Excel2007  
 *    @package    PHPExcel_Reader  
 *    @copyright    Copyright (c) 2006 - 2011 PHPExcel (http://www.codeplex.com/PHPExcel)  
     *    Identifies whether the Reader should only read data values for cells, and ignore any formatting information;  
     *        or whether it should read both data and formatting  
    private $_readDataOnly =  false;  
     *    Restrict which sheets should be loaded?  
     *    This property holds an array of worksheet names to be loaded. If null, then all worksheets will be loaded.  
    private $_loadSheetsOnly =  null;  
     * PHPExcel_Reader_IReadFilter instance  
     * @var PHPExcel_Reader_IReadFilter   
    private $_readFilter =  null;  
     * PHPExcel_ReferenceHelper instance  
     * @var PHPExcel_ReferenceHelper   
    private $_referenceHelper =  null;  
     * PHPExcel_Reader_Excel2007_Theme instance  
     * @var PHPExcel_Reader_Excel2007_Theme   
    private static $_theme =  null;  
     *        If this is true, then the Reader will only read data values for cells, it will not read any formatting information.  
     *        If false (the default) it will read data and formatting.  
        return $this->_readDataOnly;  
     *        Set to true, to advise the Reader only to read data values for cells, and to ignore any formatting information.  
     *        Set to false (the default) to advise the Reader to read both data and formatting for cells.  
     *    @return    PHPExcel_Reader_Excel2007   
        $this->_readDataOnly =  $pValue;  
     *    Get which sheets to load  
     *        Returns either an array of worksheet names (the list of worksheets that should be loaded), or a null  
     *            indicating that all worksheets in the workbook should be loaded.  
        return $this->_loadSheetsOnly;  
     *    Set which sheets to load  
     *         This should be either an array of worksheet names to be loaded, or a string containing a single worksheet name.  
     *         If NULL, then it tells the Reader to read all worksheets in the workbook  
     *    @return PHPExcel_Reader_Excel2007   
        $this->_loadSheetsOnly =  is_array($value) ?   
     *        Tells the Reader to load all worksheets from the workbook.  
     *    @return PHPExcel_Reader_Excel2007   
        $this->_loadSheetsOnly =  null;  
     * @return PHPExcel_Reader_IReadFilter   
        return $this->_readFilter;  
     * @param PHPExcel_Reader_IReadFilter $pValue   
     * @return PHPExcel_Reader_Excel2007   
    public function setReadFilter(PHPExcel_Reader_IReadFilter $pValue) {  
        $this->_readFilter =  $pValue;  
     * Create a new PHPExcel_Reader_Excel2007 instance  
     * Can the current PHPExcel_Reader_IReader read the file?  
     * @param     string         $pFileName   
    public function canRead($pFilename)  
        // Check if zip class exists  
            throw  new Exception("Could not open " .  $pFilename .  " for reading! File does not exist."); 
        if ($zip->open($pFilename) ===  true) {  
            // check if it is an OOXML archive  
            foreach ($rels->Relationship as $rel) {  
                    case "http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument":   
                        if (basename($rel["Target"]) ==  'workbook.xml') {  
    private static function _castToBool($c) {  
//        echo 'Initial Cast to Boolean<br />';  
        $value = isset ($c->v) ? (string)  $c->v :  null;  
        } elseif ($value ==  '1') {  
    }    //    function _castToBool()  
    private static function _castToError($c) {  
//        echo 'Initial Cast to Error<br />';  
        return isset ($c->v) ? (string)  $c->v :  null;;  
    }    //    function _castToError()  
    private static function _castToString($c) {  
//        echo 'Initial Cast to String<br />';  
        return isset ($c->v) ? (string)  $c->v :  null;;  
    }    //    function _castToString()  
    private function _castToFormula($c,$r,&$cellDataType,&$value,&$calculatedValue,&$sharedFormulas,$castBaseType) {  
//        echo '<font color="darkgreen">Formula</font><br />';  
//        echo '$c->f is '.$c->f.'<br />';  
        $calculatedValue     =  self::$castBaseType($c);  
        if (isset ($c->f['t']) &&  strtolower((string) $c->f['t']) ==  'shared') {  
//            echo '<font color="darkgreen">SHARED FORMULA</font><br />';  
            $instance = (string) $c->f['si'];  
//            echo 'Instance ID = '.$instance.'<br />';  
//            echo 'Shared Formula Array:<pre>';  
//            print_r($sharedFormulas);  
            if (!isset ($sharedFormulas[(string) $c->f['si']])) {  
//                echo '<font color="darkgreen">SETTING NEW SHARED FORMULA</font><br />';  
//                echo 'Master is '.$r.'<br />';  
//                echo 'Formula is '.$value.'<br />';  
                $sharedFormulas[$instance] =  array(    'master' =>  $r,  
//                echo 'New Shared Formula Array:<pre>';  
//                print_r($sharedFormulas);  
//                echo '<font color="darkgreen">GETTING SHARED FORMULA</font><br />';  
//                echo 'Master is '.$sharedFormulas[$instance]['master'].'<br />';  
//                echo 'Formula is '.$sharedFormulas[$instance]['formula'].'<br />';  
                $difference =  array(0, 0);  
                $difference[1] =  $current[1] -  $master[1];  
                $value =  $this->_referenceHelper->updateFormulaReferences(    $sharedFormulas[$instance]['formula'],  
//                echo 'Adjusted Formula is '.$value.'<br />';  
        if (strpos($fileName, '//') !==  false)  
        $contents =  $archive->getFromName($fileName);  
            $contents =  $archive->getFromName(substr($fileName, 1));  
     * Reads names of the worksheets from a file, without parsing the whole file to a PHPExcel object  
     * @param     string         $pFilename   
            throw  new Exception("Could not open " .  $pFilename .  " for reading! File does not exist."); 
        $worksheetNames =  array();  
        foreach ($rels->Relationship as $rel) {  
                case "http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument":   
                    if ($xmlWorkbook->sheets) {  
                        foreach ($xmlWorkbook->sheets->sheet as $eleSheet) {  
                            // Check if sheet should be skipped  
                            $worksheetNames[] = (string)  $eleSheet["name"];  
     * Loads PHPExcel from file  
     * @param     string         $pFilename   
    public function load($pFilename)  
            throw  new Exception("Could not open " .  $pFilename .  " for reading! File does not exist."); 
        $excel->removeSheetByIndex(0);  
        if (!$this->_readDataOnly) {  
            $excel->removeCellStyleXfByIndex(0); // remove the default style  
            $excel->removeCellXfByIndex(0); // remove the default style  
        //    Read the theme first, because we need the colour scheme when reading the styles  
        foreach ($wbRels->Relationship as $rel) {  
                case "http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme":   
                    $themeOrderArray =  array('lt1','dk1','lt2','dk2');  
                    $themeOrderAdditional =  count($themeOrderArray);  
                        $xmlThemeName =  $xmlTheme->attributes();  
                        $xmlTheme =  $xmlTheme->children("http://schemas.openxmlformats.org/drawingml/2006/main");  
                        $themeName = (string) $xmlThemeName['name'];  
                        $colourScheme =  $xmlTheme->themeElements->clrScheme->attributes();  
                        $colourSchemeName = (string) $colourScheme['name'];  
                        $colourScheme =  $xmlTheme->themeElements->clrScheme->children("http://schemas.openxmlformats.org/drawingml/2006/main");  
                        foreach ($colourScheme as $k =>  $xmlColour) {  
                            if ($themePos ===  false) {  
                                $themePos =  $themeOrderAdditional++ ;  
                            if (isset ($xmlColour->sysClr)) {  
                                $xmlColourData =  $xmlColour->sysClr->attributes();  
                                $themeColours[$themePos] =  $xmlColourData['lastClr'];  
                            } elseif (isset ($xmlColour->srgbClr)) {  
                                $xmlColourData =  $xmlColour->srgbClr->attributes();  
                                $themeColours[$themePos] =  $xmlColourData['val'];  
                        self::$_theme =  new PHPExcel_Reader_Excel2007_Theme($themeName,$colourSchemeName,$themeColours);  
        foreach ($rels->Relationship as $rel) {  
                case "http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties":   
                        $xmlCore->registerXPathNamespace("dc", "http://purl.org/dc/elements/1.1/");  
                        $xmlCore->registerXPathNamespace("dcterms", "http://purl.org/dc/terms/");  
                        $xmlCore->registerXPathNamespace("cp", "http://schemas.openxmlformats.org/package/2006/metadata/core-properties");  
                        $docProps =  $excel->getProperties();  
                        $docProps->setCreator((string)  self::array_item($xmlCore->xpath("dc:creator")));  
                        $docProps->setLastModifiedBy((string)  self::array_item($xmlCore->xpath("cp:lastModifiedBy")));  
                        $docProps->setCreated(strtotime(self::array_item($xmlCore->xpath("dcterms:created")))); //! respect xsi:type  
                        $docProps->setModified(strtotime(self::array_item($xmlCore->xpath("dcterms:modified")))); //! respect xsi:type  
                        $docProps->setTitle((string)  self::array_item($xmlCore->xpath("dc:title")));  
                        $docProps->setDescription((string)  self::array_item($xmlCore->xpath("dc:description")));  
                        $docProps->setSubject((string)  self::array_item($xmlCore->xpath("dc:subject")));  
                        $docProps->setKeywords((string)  self::array_item($xmlCore->xpath("cp:keywords")));  
                        $docProps->setCategory((string)  self::array_item($xmlCore->xpath("cp:category")));  
                case "http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties":   
                        $docProps =  $excel->getProperties();  
                        if (isset ($xmlCore->Company))  
                            $docProps->setCompany((string)  $xmlCore->Company);  
                        if (isset ($xmlCore->Manager))  
                            $docProps->setManager((string)  $xmlCore->Manager);  
                case "http://schemas.openxmlformats.org/officeDocument/2006/relationships/custom-properties":   
                        $docProps =  $excel->getProperties();  
                        foreach ($xmlCore as $xmlProperty) {  
                            $cellDataOfficeAttributes =  $xmlProperty->attributes();  
                            if (isset ($cellDataOfficeAttributes['name'])) {  
                                $propertyName = (string)  $cellDataOfficeAttributes['name'];  
                                $cellDataOfficeChildren =  $xmlProperty->children('http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes');  
                                $attributeType =  $cellDataOfficeChildren->getName();  
                                $attributeValue = (string)  $cellDataOfficeChildren->{$attributeType};  
                                $docProps->setCustomProperty($propertyName,$attributeValue,$attributeType);  
                case "http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument":   
                    $relsWorkbook->registerXPathNamespace("rel", "http://schemas.openxmlformats.org/package/2006/relationships");  
                    $sharedStrings =  array();  
                    $xpath =  self::array_item($relsWorkbook->xpath("rel:Relationship[@Type='http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings']"));  
                    if (isset ($xmlStrings) && isset ($xmlStrings->si)) {  
                        foreach ($xmlStrings->si as $val) {  
                            } elseif (isset ($val->r)) {  
                                $sharedStrings[] =  $this->_parseRichText($val);  
                    foreach ($relsWorkbook->Relationship as $ele) {  
                        if ($ele["Type"] ==  "http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet") {  
                            $worksheets[(string)  $ele["Id"]] =  $ele["Target"];  
                    $xpath =  self::array_item($relsWorkbook->xpath("rel:Relationship[@Type='http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles']"));  
                    if ($xmlStyles &&  $xmlStyles->numFmts[0]) {  
                        $numFmts =  $xmlStyles->numFmts[0];  
                    if (isset ($numFmts) &&  !is_null($numFmts)) {  
                        $numFmts->registerXPathNamespace("sml", "http://schemas.openxmlformats.org/spreadsheetml/2006/main");  
                    if (!$this->_readDataOnly &&  $xmlStyles) {  
                        foreach ($xmlStyles->cellXfs->xf as $xf) {  
                                    $tmpNumFmt =  self::array_item($numFmts->xpath("sml:numFmt[@numFmtId=$xf[numFmtId]]"));  
                                    if (isset ($tmpNumFmt["formatCode"])) {  
                                        $numFmt = (string)  $tmpNumFmt["formatCode"];  
                                if ((int) $xf["numFmtId"] <  164) {  
                            //$numFmt = str_replace('mm', 'i', $numFmt);  
                            //$numFmt = str_replace('h', 'H', $numFmt);  
                                "font" =>  $xmlStyles->fonts->font[intval($xf["fontId"])],  
                                "fill" =>  $xmlStyles->fills->fill[intval($xf["fillId"])],  
                                "border" =>  $xmlStyles->borders->border[intval($xf["borderId"])],  
                                "alignment" =>  $xf->alignment,  
                                "protection" =>  $xf->protection,  
                            // add style to cellXf collection  
                            self::_readStyle($objStyle, $style);  
                            $excel->addCellXf($objStyle);  
                        foreach ($xmlStyles->cellStyleXfs->xf as $xf) {  
                            if ($numFmts &&  $xf["numFmtId"]) {  
                                $tmpNumFmt =  self::array_item($numFmts->xpath("sml:numFmt[@numFmtId=$xf[numFmtId]]"));  
                                if (isset ($tmpNumFmt["formatCode"])) {  
                                    $numFmt = (string)  $tmpNumFmt["formatCode"];  
                                } else if ((int) $xf["numFmtId"] <  165) {  
                            $cellStyle = (object)  array(  
                                "font" =>  $xmlStyles->fonts->font[intval($xf["fontId"])],  
                                "fill" =>  $xmlStyles->fills->fill[intval($xf["fillId"])],  
                                "border" =>  $xmlStyles->borders->border[intval($xf["borderId"])],  
                                "alignment" =>  $xf->alignment,  
                                "protection" =>  $xf->protection,  
                            $cellStyles[] =  $cellStyle;  
                            // add style to cellStyleXf collection  
                            self::_readStyle($objStyle, $cellStyle);  
                            $excel->addCellStyleXf($objStyle);  
                    if (!$this->_readDataOnly &&  $xmlStyles) {  
                            foreach ($xmlStyles->dxfs->dxf as $dxf) {  
                                self::_readStyle($style, $dxf);  
                        if ($xmlStyles->cellStyles)  
                            foreach ($xmlStyles->cellStyles->cellStyle as $cellStyle) {  
                                if (intval($cellStyle['builtinId']) ==  0) {  
                                    if (isset ($cellStyles[intval($cellStyle['xfId'])])) {  
                                        self::_readStyle($style, $cellStyles[intval($cellStyle['xfId'])]);  
                                        // normal style, currently not using it for anything  
                    if ($xmlWorkbook->workbookPr) {  
                        if (isset ($xmlWorkbook->workbookPr['date1904'])) {  
                            $date1904 = (string) $xmlWorkbook->workbookPr['date1904'];  
                            if ($date1904 ==  "true" ||  $date1904 ==  "1") {  
                    $sheetId =  0; // keep track of new sheet id in final workbook  
                    $oldSheetId = - 1; // keep track of old sheet id in final workbook  
                    $countSkippedSheets =  0; // keep track of number of skipped sheets  
                    $mapSheetId =  array(); // mapping of sheet ids from old to new  
                    if ($xmlWorkbook->sheets)  
                        foreach ($xmlWorkbook->sheets->sheet as $eleSheet) {  
                            // Check if sheet should be skipped  
                            if (isset ($this->_loadSheetsOnly) &&  !in_array((string)  $eleSheet["name"], $this->_loadSheetsOnly)) {  
                                $mapSheetId[$oldSheetId] =  null;  
                            // Map old sheet id in original workbook to new sheet id.  
                            // They will differ if loadSheetsOnly() is being used  
                            $mapSheetId[$oldSheetId] =  $oldSheetId -  $countSkippedSheets;  
                            $docSheet =  $excel->createSheet();  
                            $docSheet->setTitle((string)  $eleSheet["name"]);  
                            $fileWorksheet =  $worksheets[(string)  self::array_item($eleSheet->attributes("http://schemas.openxmlformats.org/officeDocument/2006/relationships"), "id")];  
                            $sharedFormulas =  array();  
                            if (isset ($eleSheet["state"]) && (string)  $eleSheet["state"] !=  '') {  
                                $docSheet->setSheetState( (string)  $eleSheet["state"] );  
                            if (isset ($xmlSheet->sheetViews) && isset ($xmlSheet->sheetViews->sheetView)) {  
                                if (isset ($xmlSheet->sheetViews->sheetView['zoomScale'])) {  
                                    $docSheet->getSheetView()->setZoomScale( intval($xmlSheet->sheetViews->sheetView['zoomScale']) );  
                                if (isset ($xmlSheet->sheetViews->sheetView['zoomScaleNormal'])) {  
                                    $docSheet->getSheetView()->setZoomScaleNormal( intval($xmlSheet->sheetViews->sheetView['zoomScaleNormal']) );  
                                if (isset ($xmlSheet->sheetViews->sheetView['showGridLines'])) {  
                                    $docSheet->setShowGridLines((string) $xmlSheet->sheetViews->sheetView['showGridLines'] ?  true :  false);  
                                if (isset ($xmlSheet->sheetViews->sheetView['showRowColHeaders'])) {  
                                    $docSheet->setShowRowColHeaders((string) $xmlSheet->sheetViews->sheetView['showRowColHeaders'] ?  true :  false);  
                                if (isset ($xmlSheet->sheetViews->sheetView['rightToLeft'])) {  
                                    $docSheet->setRightToLeft((string) $xmlSheet->sheetViews->sheetView['rightToLeft'] ?  true :  false);  
                                if (isset ($xmlSheet->sheetViews->sheetView->pane)) {  
                                    if (isset ($xmlSheet->sheetViews->sheetView->pane['topLeftCell'])) {  
                                        $docSheet->freezePane( (string) $xmlSheet->sheetViews->sheetView->pane['topLeftCell'] );  
                                        if (isset ($xmlSheet->sheetViews->sheetView->pane['xSplit'])) {  
                                            $xSplit =  1 +  intval($xmlSheet->sheetViews->sheetView->pane['xSplit']);  
                                        if (isset ($xmlSheet->sheetViews->sheetView->pane['ySplit'])) {  
                                            $ySplit =  1 +  intval($xmlSheet->sheetViews->sheetView->pane['ySplit']);  
                                        $docSheet->freezePaneByColumnAndRow($xSplit, $ySplit);  
                                if (isset ($xmlSheet->sheetViews->sheetView->selection)) {  
                                    if (isset ($xmlSheet->sheetViews->sheetView->selection['sqref'])) {  
                                        $sqref = (string) $xmlSheet->sheetViews->sheetView->selection['sqref'];  
                                        $docSheet->setSelectedCells($sqref);  
                            if (isset ($xmlSheet->sheetPr) && isset ($xmlSheet->sheetPr->tabColor)) {  
                                if (isset ($xmlSheet->sheetPr->tabColor['rgb'])) {  
                                    $docSheet->getTabColor()->setARGB( (string) $xmlSheet->sheetPr->tabColor['rgb'] );  
                            if (isset ($xmlSheet->sheetPr) && isset ($xmlSheet->sheetPr->outlinePr)) {  
                                if (isset ($xmlSheet->sheetPr->outlinePr['summaryRight']) &&  $xmlSheet->sheetPr->outlinePr['summaryRight'] ==  false) {  
                                    $docSheet->setShowSummaryRight(false);  
                                    $docSheet->setShowSummaryRight(true);  
                                if (isset ($xmlSheet->sheetPr->outlinePr['summaryBelow']) &&  $xmlSheet->sheetPr->outlinePr['summaryBelow'] ==  false) {  
                                    $docSheet->setShowSummaryBelow(false);  
                                    $docSheet->setShowSummaryBelow(true);  
                            if (isset ($xmlSheet->sheetPr) && isset ($xmlSheet->sheetPr->pageSetUpPr)) {  
                                if (isset ($xmlSheet->sheetPr->pageSetUpPr['fitToPage']) &&  $xmlSheet->sheetPr->pageSetUpPr['fitToPage'] ==  false) {  
                                    $docSheet->getPageSetup()->setFitToPage(false);  
                                    $docSheet->getPageSetup()->setFitToPage(true);  
                            if (isset ($xmlSheet->sheetFormatPr)) {  
                                if (isset ($xmlSheet->sheetFormatPr['customHeight']) &&  ((string) $xmlSheet->sheetFormatPr['customHeight'] ==  '1' ||  strtolower((string) $xmlSheet->sheetFormatPr['customHeight']) ==  'true') && isset ($xmlSheet->sheetFormatPr['defaultRowHeight'])) {  
                                    $docSheet->getDefaultRowDimension()->setRowHeight( (float) $xmlSheet->sheetFormatPr['defaultRowHeight'] );  
                                if (isset ($xmlSheet->sheetFormatPr['defaultColWidth'])) {  
                                    $docSheet->getDefaultColumnDimension()->setWidth( (float) $xmlSheet->sheetFormatPr['defaultColWidth'] );  
                            if (isset ($xmlSheet->cols) &&  !$this->_readDataOnly) {  
                                foreach ($xmlSheet->cols->col as $col) {  
                                    for ($i =  intval($col["min"]) -  1; $i <  intval($col["max"]); ++ $i) {  
                                        if ($col["style"] &&  !$this->_readDataOnly) {  
                                            //$docSheet->getColumnDimension(PHPExcel_Cell::stringFromColumnIndex($i))->setAutoSize(true);  
                                        if ($col["outlineLevel"] >  0) {  
                                        if (intval($col["max"]) ==  16384) {  
                            if (isset ($xmlSheet->printOptions) &&  !$this->_readDataOnly) {  
                                if ($xmlSheet->printOptions['gridLinesSet'] ==  'true' &&  $xmlSheet->printOptions['gridLinesSet'] ==  '1') {  
                                    $docSheet->setShowGridlines(true);  
                                if ($xmlSheet->printOptions['gridLines'] ==  'true' ||  $xmlSheet->printOptions['gridLines'] ==  '1') {  
                                    $docSheet->setPrintGridlines(true);  
                                if ($xmlSheet->printOptions['horizontalCentered']) {  
                                    $docSheet->getPageSetup()->setHorizontalCentered(true);  
                                if ($xmlSheet->printOptions['verticalCentered']) {  
                                    $docSheet->getPageSetup()->setVerticalCentered(true);  
                            if ($xmlSheet &&  $xmlSheet->sheetData &&  $xmlSheet->sheetData->row) {  
                                foreach ($xmlSheet->sheetData->row as $row) {  
                                    if ($row["ht"] &&  !$this->_readDataOnly) {  
                                        $docSheet->getRowDimension(intval($row["r"]))->setRowHeight(floatval($row["ht"]));  
                                    if ($row["hidden"] &&  !$this->_readDataOnly) {  
                                        $docSheet->getRowDimension(intval($row["r"]))->setVisible(false);  
                                        $docSheet->getRowDimension(intval($row["r"]))->setCollapsed(true);  
                                    if ($row["outlineLevel"] >  0) {  
                                        $docSheet->getRowDimension(intval($row["r"]))->setOutlineLevel(intval($row["outlineLevel"]));  
                                    if ($row["s"] &&  !$this->_readDataOnly) {  
                                        $docSheet->getRowDimension(intval($row["r"]))->setXfIndex(intval($row["s"]));  
                                    foreach ($row->c as $c) {  
                                        $cellDataType         = (string)  $c["t"];  
                                            if (!$this->getReadFilter()->readCell($coordinates[0], $coordinates[1], $docSheet->getTitle())) {  
    //                                    echo '<b>Reading cell '.$coordinates[0].$coordinates[1].'</b><br />';  
    //                                    echo 'Cell Data Type is '.$cellDataType.': ';  
                                                if ((string) $c->v !=  '') {  
                                                    $value =  $sharedStrings[intval($c->v)];  
                                                    $value =  self::_castToBool($c);  
                                                    $this->_castToFormula($c,$r,$cellDataType,$value,$calculatedValue,$sharedFormulas,'_castToBool');  
                                                        $docSheet->getCell($r)->setFormulaAttributes($att);  
    //                                                echo '$calculatedValue = '.$calculatedValue.'<br />';  
    //                                            echo 'Inline String<br />';  
                                                $value =  $this->_parseRichText($c->is);  
                                                    $value =  self::_castToError($c);  
                                                    $this->_castToFormula($c,$r,$cellDataType,$value,$calculatedValue,$sharedFormulas,'_castToError');  
    //                                                echo '$calculatedValue = '.$calculatedValue.'<br />';  
    //                                                echo 'Not a Formula<br />';  
                                                    $value =  self::_castToString($c);  
    //                                                echo 'Treat as Formula<br />';  
                                                    $this->_castToFormula($c,$r,$cellDataType,$value,$calculatedValue,$sharedFormulas,'_castToString');  
    //                                                echo '$calculatedValue = '.$calculatedValue.'<br />';  
    //                                    echo 'Value is '.$value.'<br />';  
                                        // Check for numeric values  
                                            if ($value == (int) $value) $value = (int) $value;  
                                            elseif ($value == (float) $value) $value = (float) $value;  
                                            elseif ($value == (double) $value) $value = (double) $value;  
                                            $value =  $value->getPlainText();  
                                        $cell =  $docSheet->getCell($r);  
                                        if ($cellDataType !=  '') {  
                                            $cell->setValueExplicit($value, $cellDataType);  
                                            $cell->setCalculatedValue($calculatedValue);  
                                        if ($c["s"] &&  !$this->_readDataOnly) {  
                                            // no style index means 0, it seems  
                                            $cell->setXfIndex(isset ($styles[intval($c["s"])]) ?   
                            if (!$this->_readDataOnly &&  $xmlSheet &&  $xmlSheet->conditionalFormatting) {  
                                foreach ($xmlSheet->conditionalFormatting as $conditional) {  
                                    foreach ($conditional->cfRule as $cfRule) {  
                                            ) && isset ($dxfs[intval($cfRule["dxfId"])])  
                                            $conditionals[(string)  $conditional["sqref"]][intval($cfRule["priority"])] =  $cfRule;  
                                foreach ($conditionals as $ref =>  $cfRules) {  
                                    $conditionalStyles =  array();  
                                    foreach ($cfRules as $cfRule) {  
                                        $objConditional->setConditionType((string) $cfRule["type"]);  
                                        $objConditional->setOperatorType((string) $cfRule["operator"]);  
                                        if ((string) $cfRule["text"] !=  '') {  
                                            $objConditional->setText((string) $cfRule["text"]);  
                                        if (count($cfRule->formula) >  1) {  
                                            foreach ($cfRule->formula as $formula) {  
                                                $objConditional->addCondition((string) $formula);  
                                            $objConditional->addCondition((string) $cfRule->formula);  
                                        $objConditional->setStyle(clone $dxfs[intval($cfRule["dxfId"])]);  
                                        $conditionalStyles[] =  $objConditional;  
                                    // Extract all cell references in $ref  
                                    foreach ($aReferences as $reference) {  
                                        $docSheet->getStyle($reference)->setConditionalStyles($conditionalStyles);  
                            $aKeys =  array("sheet", "objects", "scenarios", "formatCells", "formatColumns", "formatRows", "insertColumns", "insertRows", "insertHyperlinks", "deleteColumns", "deleteRows", "selectLockedCells", "sort", "autoFilter", "pivotTables", "selectUnlockedCells");  
                            if (!$this->_readDataOnly &&  $xmlSheet &&  $xmlSheet->sheetProtection) {  
                                foreach ($aKeys as $key) {  
                                    $docSheet->getProtection()->$method($xmlSheet->sheetProtection[$key] ==  "true");  
                            if (!$this->_readDataOnly &&  $xmlSheet &&  $xmlSheet->sheetProtection) {  
                                $docSheet->getProtection()->setPassword((string)  $xmlSheet->sheetProtection["password"], true);  
                                if ($xmlSheet->protectedRanges->protectedRange) {  
                                    foreach ($xmlSheet->protectedRanges->protectedRange as $protectedRange) {  
                                        $docSheet->protectCells((string)  $protectedRange["sqref"], (string)  $protectedRange["password"], true);  
                            if ($xmlSheet &&  $xmlSheet->autoFilter &&  !$this->_readDataOnly) {  
                                $docSheet->setAutoFilter((string)  $xmlSheet->autoFilter["ref"]);  
                            if ($xmlSheet &&  $xmlSheet->mergeCells &&  $xmlSheet->mergeCells->mergeCell &&  !$this->_readDataOnly) {  
                                foreach ($xmlSheet->mergeCells->mergeCell as $mergeCell) {  
                                    $docSheet->mergeCells((string)  $mergeCell["ref"]);  
                            if ($xmlSheet &&  $xmlSheet->pageMargins &&  !$this->_readDataOnly) {  
                                $docPageMargins =  $docSheet->getPageMargins();  
                                $docPageMargins->setLeft(floatval($xmlSheet->pageMargins["left"]));  
                                $docPageMargins->setRight(floatval($xmlSheet->pageMargins["right"]));  
                                $docPageMargins->setTop(floatval($xmlSheet->pageMargins["top"]));  
                                $docPageMargins->setBottom(floatval($xmlSheet->pageMargins["bottom"]));  
                                $docPageMargins->setHeader(floatval($xmlSheet->pageMargins["header"]));  
                                $docPageMargins->setFooter(floatval($xmlSheet->pageMargins["footer"]));  
                            if ($xmlSheet &&  $xmlSheet->pageSetup &&  !$this->_readDataOnly) {  
                                $docPageSetup =  $docSheet->getPageSetup();  
                                if (isset ($xmlSheet->pageSetup["orientation"])) {  
                                    $docPageSetup->setOrientation((string)  $xmlSheet->pageSetup["orientation"]);  
                                if (isset ($xmlSheet->pageSetup["paperSize"])) {  
                                    $docPageSetup->setPaperSize(intval($xmlSheet->pageSetup["paperSize"]));  
                                if (isset ($xmlSheet->pageSetup["scale"])) {  
                                    $docPageSetup->setScale(intval($xmlSheet->pageSetup["scale"]), false);  
                                if (isset ($xmlSheet->pageSetup["fitToHeight"]) &&  intval($xmlSheet->pageSetup["fitToHeight"]) >=  0) {  
                                    $docPageSetup->setFitToHeight(intval($xmlSheet->pageSetup["fitToHeight"]), false);  
                                if (isset ($xmlSheet->pageSetup["fitToWidth"]) &&  intval($xmlSheet->pageSetup["fitToWidth"]) >=  0) {  
                                    $docPageSetup->setFitToWidth(intval($xmlSheet->pageSetup["fitToWidth"]), false);  
                                if (isset ($xmlSheet->pageSetup["firstPageNumber"]) && isset ($xmlSheet->pageSetup["useFirstPageNumber"]) &&   
                                    ((string) $xmlSheet->pageSetup["useFirstPageNumber"] ==  'true' || (string) $xmlSheet->pageSetup["useFirstPageNumber"] ==  '1')) {  
                                    $docPageSetup->setFirstPageNumber(intval($xmlSheet->pageSetup["firstPageNumber"]));  
                            if ($xmlSheet &&  $xmlSheet->headerFooter &&  !$this->_readDataOnly) {  
                                $docHeaderFooter =  $docSheet->getHeaderFooter();  
                                if (isset ($xmlSheet->headerFooter["differentOddEven"]) &&   
                                    ((string) $xmlSheet->headerFooter["differentOddEven"] ==  'true' || (string) $xmlSheet->headerFooter["differentOddEven"] ==  '1')) {  
                                    $docHeaderFooter->setDifferentOddEven(true);  
                                    $docHeaderFooter->setDifferentOddEven(false);  
                                if (isset ($xmlSheet->headerFooter["differentFirst"]) &&   
                                    ((string) $xmlSheet->headerFooter["differentFirst"] ==  'true' || (string) $xmlSheet->headerFooter["differentFirst"] ==  '1')) {  
                                    $docHeaderFooter->setDifferentFirst(true);  
                                    $docHeaderFooter->setDifferentFirst(false);  
                                if (isset ($xmlSheet->headerFooter["scaleWithDoc"]) &&   
                                    ((string) $xmlSheet->headerFooter["scaleWithDoc"] ==  'false' || (string) $xmlSheet->headerFooter["scaleWithDoc"] ==  '0')) {  
                                    $docHeaderFooter->setScaleWithDocument(false);  
                                    $docHeaderFooter->setScaleWithDocument(true);  
                                if (isset ($xmlSheet->headerFooter["alignWithMargins"]) &&   
                                    ((string) $xmlSheet->headerFooter["alignWithMargins"] ==  'false' || (string) $xmlSheet->headerFooter["alignWithMargins"] ==  '0')) {  
                                    $docHeaderFooter->setAlignWithMargins(false);  
                                    $docHeaderFooter->setAlignWithMargins(true);  
                                $docHeaderFooter->setOddHeader((string)  $xmlSheet->headerFooter->oddHeader);  
                                $docHeaderFooter->setOddFooter((string)  $xmlSheet->headerFooter->oddFooter);  
                                $docHeaderFooter->setEvenHeader((string)  $xmlSheet->headerFooter->evenHeader);  
                                $docHeaderFooter->setEvenFooter((string)  $xmlSheet->headerFooter->evenFooter);  
                                $docHeaderFooter->setFirstHeader((string)  $xmlSheet->headerFooter->firstHeader);  
                                $docHeaderFooter->setFirstFooter((string)  $xmlSheet->headerFooter->firstFooter);  
                            if ($xmlSheet &&  $xmlSheet->rowBreaks &&  $xmlSheet->rowBreaks->brk &&  !$this->_readDataOnly) {  
                                foreach ($xmlSheet->rowBreaks->brk as $brk) {  
                            if ($xmlSheet &&  $xmlSheet->colBreaks &&  $xmlSheet->colBreaks->brk &&  !$this->_readDataOnly) {  
                                foreach ($xmlSheet->colBreaks->brk as $brk) {  
                            if ($xmlSheet &&  $xmlSheet->dataValidations &&  !$this->_readDataOnly) {  
                                foreach ($xmlSheet->dataValidations->dataValidation as $dataValidation) {  
                                    foreach($rangeSet as $range) {  
                                        $stRange =  $docSheet->shrinkRangeToFit($range);  
                                        // Extract all cell references in $range  
                                        foreach ($aReferences as $reference) {  
                                            $docValidation =  $docSheet->getCell($reference)->getDataValidation();  
                                            $docValidation->setType((string)  $dataValidation["type"]);  
                                            $docValidation->setErrorStyle((string)  $dataValidation["errorStyle"]);  
                                            $docValidation->setOperator((string)  $dataValidation["operator"]);  
                                            $docValidation->setAllowBlank($dataValidation["allowBlank"] !=  0);  
                                            $docValidation->setShowDropDown($dataValidation["showDropDown"] ==  0);  
                                            $docValidation->setShowInputMessage($dataValidation["showInputMessage"] !=  0);  
                                            $docValidation->setShowErrorMessage($dataValidation["showErrorMessage"] !=  0);  
                                            $docValidation->setErrorTitle((string)  $dataValidation["errorTitle"]);  
                                            $docValidation->setError((string)  $dataValidation["error"]);  
                                            $docValidation->setPromptTitle((string)  $dataValidation["promptTitle"]);  
                                            $docValidation->setPrompt((string)  $dataValidation["prompt"]);  
                                            $docValidation->setFormula1((string)  $dataValidation->formula1);  
                                            $docValidation->setFormula2((string)  $dataValidation->formula2);  
                            if (!$this->_readDataOnly) {  
                                // Locate hyperlink relations  
                                if ($zip->locateName(dirname("$dir/$fileWorksheet") .  "/_rels/" .  basename($fileWorksheet) .  ".rels")) {  
                                    foreach ($relsWorksheet->Relationship as $ele) {  
                                        if ($ele["Type"] ==  "http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink") {  
                                            $hyperlinks[(string) $ele["Id"]] = (string) $ele["Target"];  
                                // Loop through hyperlinks  
                                if ($xmlSheet &&  $xmlSheet->hyperlinks) {  
                                    foreach ($xmlSheet->hyperlinks->hyperlink as $hyperlink) {  
                                        $linkRel =  $hyperlink->attributes('http://schemas.openxmlformats.org/officeDocument/2006/relationships');  
                                            $cell =  $docSheet->getCell( $cellReference );  
                                            if (isset ($linkRel['id'])) {  
                                                $cell->getHyperlink()->setUrl( $hyperlinks[ (string) $linkRel['id'] ] );  
                                            if (isset ($hyperlink['location'])) {  
                                                $cell->getHyperlink()->setUrl( 'sheet://' . (string) $hyperlink['location'] );  
                                            if (isset ($hyperlink['tooltip'])) {  
                                                $cell->getHyperlink()->setTooltip( (string) $hyperlink['tooltip'] );  
                            if (!$this->_readDataOnly) {  
                                // Locate comment relations  
                                if ($zip->locateName(dirname("$dir/$fileWorksheet") .  "/_rels/" .  basename($fileWorksheet) .  ".rels")) {  
                                    foreach ($relsWorksheet->Relationship as $ele) {  
                                        if ($ele["Type"] ==  "http://schemas.openxmlformats.org/officeDocument/2006/relationships/comments") {  
                                            $comments[(string) $ele["Id"]] = (string) $ele["Target"];  
                                        if ($ele["Type"] ==  "http://schemas.openxmlformats.org/officeDocument/2006/relationships/vmlDrawing") {  
                                            $vmlComments[(string) $ele["Id"]] = (string) $ele["Target"];  
                                foreach ($comments as $relName =>  $relPath) {  
                                    foreach ($commentsFile->authors->author as $author) {  
                                        $authors[] = (string) $author;  
                                    foreach ($commentsFile->commentList->comment as $comment) {  
                                        $docSheet->getComment( (string) $comment['ref'] )->setAuthor( $authors[(string) $comment['authorId']] );  
                                        $docSheet->getComment( (string) $comment['ref'] )->setText( $this->_parseRichText($comment->text) );  
                                // Loop through VML comments  
                                foreach ($vmlComments as $relName =>  $relPath) {  
                                    // Load VML comments file  
                                    $vmlCommentsFile->registerXPathNamespace('v', 'urn:schemas-microsoft-com:vml');  
                                    $shapes =  $vmlCommentsFile->xpath('//v:shape');  
                                    foreach ($shapes as $shape) {  
                                        $shape->registerXPathNamespace('v', 'urn:schemas-microsoft-com:vml');  
                                        if (isset ($shape['style'])) {  
                                            $style        = (string) $shape['style'];  
                                            $clientData   =  $shape->xpath('.//x:ClientData');  
                                                $clientData   =  $clientData[0];  
                                                if ( isset ($clientData['ObjectType']) && (string) $clientData['ObjectType'] ==  'Note' ) {  
                                                    $temp =  $clientData->xpath('.//x:Row');  
                                                    $temp =  $clientData->xpath('.//x:Column');  
                                                    if (is_array($temp)) $column =  $temp[0];  
                                                // Set comment properties  
                                                $comment =  $docSheet->getCommentByColumnAndRow($column, $row +  1);  
                                                $comment->getFillColor()->setRGB( $fillColor );  
                                                foreach ($styleArray as $stylePair) {  
                                                    $stylePair =  explode(':', $stylePair);  
                                                    if ($stylePair[0] ==  'margin-left')     $comment->setMarginLeft($stylePair[1]);  
                                                    if ($stylePair[0] ==  'margin-top')      $comment->setMarginTop($stylePair[1]);  
                                                    if ($stylePair[0] ==  'width')           $comment->setWidth($stylePair[1]);  
                                                    if ($stylePair[0] ==  'height')          $comment->setHeight($stylePair[1]);  
                                                    if ($stylePair[0] ==  'visibility')      $comment->setVisible( $stylePair[1] ==  'visible' );  
                                if ($xmlSheet &&  $xmlSheet->legacyDrawingHF &&  !$this->_readDataOnly) {  
                                    if ($zip->locateName(dirname("$dir/$fileWorksheet") .  "/_rels/" .  basename($fileWorksheet) .  ".rels")) {  
                                        foreach ($relsWorksheet->Relationship as $ele) {  
                                            if ($ele["Type"] ==  "http://schemas.openxmlformats.org/officeDocument/2006/relationships/vmlDrawing") {  
                                                $vmlRelationship =  self::dir_add("$dir/$fileWorksheet", $ele["Target"]);  
                                        if ($vmlRelationship !=  '') {  
                                            foreach ($relsVML->Relationship as $ele) {  
                                                if ($ele["Type"] ==  "http://schemas.openxmlformats.org/officeDocument/2006/relationships/image") {  
                                                    $drawings[(string)  $ele["Id"]] =  self::dir_add($vmlRelationship, $ele["Target"]);  
                                            $vmlDrawing->registerXPathNamespace('v', 'urn:schemas-microsoft-com:vml');  
                                            $shapes =  $vmlDrawing->xpath('//v:shape');  
                                            foreach ($shapes as $shape) {  
                                                $shape->registerXPathNamespace('v', 'urn:schemas-microsoft-com:vml');  
                                                $imageData =  $shape->xpath('//v:imagedata');  
                                                $imageData =  $imageData[0];  
                                                $imageData =  $imageData->attributes('urn:schemas-microsoft-com:office:office');  
                                                $style =  self::toCSSArray( (string) $shape['style'] );  
                                                if (isset ($imageData['title'])) {  
                                                    $hfImages[ (string) $shape['id'] ]->setName( (string) $imageData['title'] );  
                                                $hfImages[ (string) $shape['id'] ]->setPath("zip://$pFilename#" .  $drawings[(string) $imageData['relid']], false);  
                                                $hfImages[ (string) $shape['id'] ]->setResizeProportional(false);  
                                                $hfImages[ (string) $shape['id'] ]->setWidth($style['width']);  
                                                $hfImages[ (string) $shape['id'] ]->setHeight($style['height']);  
                                                $hfImages[ (string) $shape['id'] ]->setOffsetX($style['margin-left']);  
                                                $hfImages[ (string) $shape['id'] ]->setOffsetY($style['margin-top']);  
                                                $hfImages[ (string) $shape['id'] ]->setResizeProportional(true);  
                                            $docSheet->getHeaderFooter()->setImages($hfImages);  
    // TODO: Make sure drawings and graph are loaded differently!  
                            if ($zip->locateName(dirname("$dir/$fileWorksheet") .  "/_rels/" .  basename($fileWorksheet) .  ".rels")) {  
                                foreach ($relsWorksheet->Relationship as $ele) {  
                                    if ($ele["Type"] ==  "http://schemas.openxmlformats.org/officeDocument/2006/relationships/drawing") {  
                                        $drawings[(string)  $ele["Id"]] =  self::dir_add("$dir/$fileWorksheet", $ele["Target"]);  
                                if ($xmlSheet->drawing &&  !$this->_readDataOnly) {  
                                    foreach ($xmlSheet->drawing as $drawing) {  
                                        $fileDrawing =  $drawings[(string)  self::array_item($drawing->attributes("http://schemas.openxmlformats.org/officeDocument/2006/relationships"), "id")];  
                                        if ($relsDrawing &&  $relsDrawing->Relationship) {  
                                            foreach ($relsDrawing->Relationship as $ele) {  
                                                if ($ele["Type"] ==  "http://schemas.openxmlformats.org/officeDocument/2006/relationships/image") {  
                                                    $images[(string)  $ele["Id"]] =  self::dir_add($fileDrawing, $ele["Target"]);  
                                        if ($xmlDrawing->oneCellAnchor) {  
                                            foreach ($xmlDrawing->oneCellAnchor as $oneCellAnchor) {  
                                                if ($oneCellAnchor->pic->blipFill) {  
                                                    $blip =  $oneCellAnchor->pic->blipFill->children("http://schemas.openxmlformats.org/drawingml/2006/main")->blip;  
                                                    $xfrm =  $oneCellAnchor->pic->spPr->children("http://schemas.openxmlformats.org/drawingml/2006/main")->xfrm;  
                                                    $outerShdw =  $oneCellAnchor->pic->spPr->children("http://schemas.openxmlformats.org/drawingml/2006/main")->effectLst->outerShdw;  
                                                    $objDrawing->setName((string)  self::array_item($oneCellAnchor->pic->nvPicPr->cNvPr->attributes(), "name"));  
                                                    $objDrawing->setDescription((string)  self::array_item($oneCellAnchor->pic->nvPicPr->cNvPr->attributes(), "descr"));  
                                                    $objDrawing->setPath("zip://$pFilename#" .  $images[(string)  self::array_item($blip->attributes("http://schemas.openxmlformats.org/officeDocument/2006/relationships"), "embed")], false);  
                                                    $objDrawing->setResizeProportional(false);  
                                                        $shadow =  $objDrawing->getShadow();  
                                                        $shadow->setVisible(true);  
                                                        $shadow->setBlurRadius(PHPExcel_Shared_Drawing::EMUTopixels(self::array_item($outerShdw->attributes(), "blurRad")));  
                                                        $shadow->setAlignment((string)  self::array_item($outerShdw->attributes(), "algn"));  
                                                        $shadow->getColor()->setRGB(self::array_item($outerShdw->srgbClr->attributes(), "val"));  
                                                        $shadow->setAlpha(self::array_item($outerShdw->srgbClr->alpha->attributes(), "val") /  1000);  
                                                    $objDrawing->setWorksheet($docSheet);  
                                        if ($xmlDrawing->twoCellAnchor) {  
                                            foreach ($xmlDrawing->twoCellAnchor as $twoCellAnchor) {  
                                                if ($twoCellAnchor->pic->blipFill) {  
                                                    $blip =  $twoCellAnchor->pic->blipFill->children("http://schemas.openxmlformats.org/drawingml/2006/main")->blip;  
                                                    $xfrm =  $twoCellAnchor->pic->spPr->children("http://schemas.openxmlformats.org/drawingml/2006/main")->xfrm;  
                                                    $outerShdw =  $twoCellAnchor->pic->spPr->children("http://schemas.openxmlformats.org/drawingml/2006/main")->effectLst->outerShdw;  
                                                    $objDrawing->setName((string)  self::array_item($twoCellAnchor->pic->nvPicPr->cNvPr->attributes(), "name"));  
                                                    $objDrawing->setDescription((string)  self::array_item($twoCellAnchor->pic->nvPicPr->cNvPr->attributes(), "descr"));  
                                                    $objDrawing->setPath("zip://$pFilename#" .  $images[(string)  self::array_item($blip->attributes("http://schemas.openxmlformats.org/officeDocument/2006/relationships"), "embed")], false);  
                                                    $objDrawing->setResizeProportional(false);  
                                                        $shadow =  $objDrawing->getShadow();  
                                                        $shadow->setVisible(true);  
                                                        $shadow->setBlurRadius(PHPExcel_Shared_Drawing::EMUTopixels(self::array_item($outerShdw->attributes(), "blurRad")));  
                                                        $shadow->setAlignment((string)  self::array_item($outerShdw->attributes(), "algn"));  
                                                        $shadow->getColor()->setRGB(self::array_item($outerShdw->srgbClr->attributes(), "val"));  
                                                        $shadow->setAlpha(self::array_item($outerShdw->srgbClr->alpha->attributes(), "val") /  1000);  
                                                    $objDrawing->setWorksheet($docSheet);  
                            // Loop through definedNames  
                            if ($xmlWorkbook->definedNames) {  
                                foreach ($xmlWorkbook->definedNames->definedName as $definedName) {  
                                    $extractedRange = (string) $definedName;  
                                    $extractedRange =  preg_replace('/\'(\w+)\'\!/', '', $extractedRange);  
                                    if (($spos =  strpos($extractedRange,'!')) !==  false) {  
                                        $extractedRange =  str_replace('$', '', $extractedRange);  
                                    if (stripos((string) $definedName, '#REF!') !==  false ||  $extractedRange ==  '') {  
                                    // Some definedNames are only applicable if we are on the same sheet...  
                                    if ((string) $definedName['localSheetId'] !=  '' && (string) $definedName['localSheetId'] ==  $sheetId) {  
                                        switch ((string) $definedName['name']) {  
                                            case '_xlnm._FilterDatabase':   
                                                $docSheet->setAutoFilter($extractedRange);  
                                            case '_xlnm.Print_Titles':   
                                                $extractedRange =  explode(',', $extractedRange);  
                                                foreach ($extractedRange as $range) {  
                                                    // check for repeating columns, e g. 'A:A' or 'A:D'  
                                                    if (preg_match('/^([A-Z]+)\:([A-Z]+)$/', $range, $matches)) {  
                                                        $docSheet->getPageSetup()->setColumnsToRepeatAtLeft(array($matches[1], $matches[2]));  
                                                    // check for repeating rows, e.g. '1:1' or '1:5'  
                                                    elseif (preg_match('/^(\d+)\:(\d+)$/', $range, $matches)) {  
                                                        $docSheet->getPageSetup()->setRowsToRepeatAtTop(array($matches[1], $matches[2]));  
                                                $rangeSets =  explode(',', $extractedRange);        // FIXME: what if sheetname contains comma?  
                                                foreach($rangeSets as $rangeSet) {  
                                                    $range =  explode('!', $rangeSet);    // FIXME: what if sheetname contains exclamation mark?  
                                                    $rangeSet = isset ($range[1]) ?  $range[1] :  $range[0];  
                                                $docSheet->getPageSetup()->setPrintArea(implode(',',$newRangeSets));  
                        // Loop through definedNames  
                        if ($xmlWorkbook->definedNames) {  
                            foreach ($xmlWorkbook->definedNames->definedName as $definedName) {  
                                $extractedRange = (string) $definedName;  
                                $extractedRange =  preg_replace('/\'(\w+)\'\!/', '', $extractedRange);  
                                if (($spos =  strpos($extractedRange,'!')) !==  false) {  
                                    $extractedRange =  str_replace('$', '', $extractedRange);  
                                if (stripos((string) $definedName, '#REF!') !==  false ||  $extractedRange ==  '') {  
                                // Some definedNames are only applicable if we are on the same sheet...  
                                if ((string) $definedName['localSheetId'] !=  '') {  
                                    switch ((string) $definedName['name']) {  
                                        case '_xlnm._FilterDatabase':   
                                        case '_xlnm.Print_Titles':   
                                            $range =  explode('!', (string) $definedName);  
                                            if (count($range) ==  2) {  
                                                if ($worksheet =  $docSheet->getParent()->getSheetByName($range[0])) {  
                                                    $scope =  $docSheet->getParent()->getSheet((string) $definedName['localSheetId']);  
                                                    $excel->addNamedRange( new PHPExcel_NamedRange((string) $definedName['name'], $worksheet, $extractedRange, true, $scope) );  
                                } else if (!isset ($definedName['localSheetId'])) {  
                                    $extractedSheetName =  '';  
                                    if (strpos( (string) $definedName, '!' ) !==  false) {  
                                        $extractedSheetName =  $extractedSheetName[0];  
                                        $locatedSheet =  $excel->getSheetByName($extractedSheetName);  
                                        $range =  explode('!', $extractedRange);  
                                        $extractedRange = isset ($range[1]) ?  $range[1] :  $range[0];  
                                        $excel->addNamedRange( new PHPExcel_NamedRange((string) $definedName['name'], $locatedSheet, $extractedRange, false) );  
                    if (!$this->_readDataOnly) {  
                        $activeTab =  intval($xmlWorkbook->bookViews->workbookView["activeTab"]); // refers to old sheet index  
                        // keep active sheet index if sheet is still loaded, else first sheet is set as the active  
                        if (isset ($mapSheetId[$activeTab]) &&  $mapSheetId[$activeTab] !==  null) {  
                            $excel->setActiveSheetIndex($mapSheetId[$activeTab]);  
                            if ($excel->getSheetCount() ==  0)  
                            $excel->setActiveSheetIndex(0);  
    private static function _readColor($color, $background= false) {  
        if (isset ($color["rgb"])) {  
            return (string) $color["rgb"];  
        } else if (isset ($color["indexed"])) {  
        } else if (isset ($color["theme"])) {  
                $returnColour =  self::$_theme->getColourByIndex((int) $color["theme"]);  
                if (isset ($color["tint"])) {  
                    $tintAdjust = (float)  $color["tint"];  
                return 'FF'. $returnColour;  
    private static function _readStyle($docStyle, $style) {  
        if (isset ($style->numFmt)) {  
            $docStyle->getNumberFormat()->setFormatCode($style->numFmt);  
        if (isset ($style->font)) {  
            $docStyle->getFont()->setName((string)  $style->font->name["val"]);  
            $docStyle->getFont()->setSize((string)  $style->font->sz["val"]);  
            if (isset ($style->font->b)) {  
                $docStyle->getFont()->setBold(!isset ($style->font->b["val"]) ||  $style->font->b["val"] ==  'true' ||  $style->font->b["val"] ==  '1');  
            if (isset ($style->font->i)) {  
                $docStyle->getFont()->setItalic(!isset ($style->font->i["val"]) ||  $style->font->i["val"] ==  'true' ||  $style->font->i["val"] ==  '1');  
            if (isset ($style->font->strike)) {  
                $docStyle->getFont()->setStrikethrough(!isset ($style->font->strike["val"]) ||  $style->font->strike["val"] ==  'true' ||  $style->font->strike["val"] ==  '1');  
            $docStyle->getFont()->getColor()->setARGB(self::_readColor($style->font->color));  
            if (isset ($style->font->u) &&  !isset ($style->font->u["val"])) {  
            } else if (isset ($style->font->u) && isset ($style->font->u["val"])) {  
                $docStyle->getFont()->setUnderline((string) $style->font->u["val"]);  
            if (isset ($style->font->vertAlign) && isset ($style->font->vertAlign["val"])) {  
                $vertAlign =  strtolower((string) $style->font->vertAlign["val"]);  
                if ($vertAlign ==  'superscript') {  
                    $docStyle->getFont()->setSuperScript(true);  
                if ($vertAlign ==  'subscript') {  
                    $docStyle->getFont()->setSubScript(true);  
        if (isset ($style->fill)) {  
            if ($style->fill->gradientFill) {  
                $gradientFill =  $style->fill->gradientFill[0];  
                if(!empty($gradientFill["type"])) {  
                    $docStyle->getFill()->setFillType((string)  $gradientFill["type"]);  
                $docStyle->getFill()->setRotation(floatval($gradientFill["degree"]));  
                $gradientFill->registerXPathNamespace("sml", "http://schemas.openxmlformats.org/spreadsheetml/2006/main");  
                $docStyle->getFill()->getStartColor()->setARGB(self::_readColor( self::array_item($gradientFill->xpath("sml:stop[@position=0]"))->color) );  
                $docStyle->getFill()->getEndColor()->setARGB(self::_readColor( self::array_item($gradientFill->xpath("sml:stop[@position=1]"))->color) );  
            } elseif ($style->fill->patternFill) {  
                $patternType = (string) $style->fill->patternFill["patternType"] !=  '' ? (string) $style->fill->patternFill["patternType"] :  'solid';  
                $docStyle->getFill()->setFillType($patternType);  
                if ($style->fill->patternFill->fgColor) {  
                    $docStyle->getFill()->getStartColor()->setARGB(self::_readColor($style->fill->patternFill->fgColor,true));  
                    $docStyle->getFill()->getStartColor()->setARGB('FF000000');  
                if ($style->fill->patternFill->bgColor) {  
                    $docStyle->getFill()->getEndColor()->setARGB(self::_readColor($style->fill->patternFill->bgColor,true));  
        if (isset ($style->border)) {  
            if ($style->border["diagonalUp"] ==  'true' ||  $style->border["diagonalUp"] ==  1) {  
            if ($style->border["diagonalDown"] ==  'true' ||  $style->border["diagonalDown"] ==  1) {  
            if ($diagonalUp ==  false &&  $diagonalDown ==  false) {  
            } elseif ($diagonalUp ==  true &&  $diagonalDown ==  false) {  
            } elseif ($diagonalUp ==  false &&  $diagonalDown ==  true) {  
            } elseif ($diagonalUp ==  true &&  $diagonalDown ==  true) {  
            self::_readBorder($docStyle->getBorders()->getLeft(), $style->border->left);  
            self::_readBorder($docStyle->getBorders()->getRight(), $style->border->right);  
            self::_readBorder($docStyle->getBorders()->getTop(), $style->border->top);  
            self::_readBorder($docStyle->getBorders()->getBottom(), $style->border->bottom);  
            self::_readBorder($docStyle->getBorders()->getDiagonal(), $style->border->diagonal);  
        if (isset ($style->alignment)) {  
            $docStyle->getAlignment()->setHorizontal((string)  $style->alignment["horizontal"]);  
            $docStyle->getAlignment()->setVertical((string)  $style->alignment["vertical"]);  
            if ((int) $style->alignment["textRotation"] <=  90) {  
                $textRotation = (int) $style->alignment["textRotation"];  
            } else if ((int) $style->alignment["textRotation"] >  90) {  
                $textRotation =  90 - (int) $style->alignment["textRotation"];  
            $docStyle->getAlignment()->setTextRotation(intval($textRotation));  
            $docStyle->getAlignment()->setWrapText( (string) $style->alignment["wrapText"] ==  "true" || (string) $style->alignment["wrapText"] ==  "1" );  
            $docStyle->getAlignment()->setShrinkToFit( (string) $style->alignment["shrinkToFit"] ==  "true" || (string) $style->alignment["shrinkToFit"] ==  "1" );  
            $docStyle->getAlignment()->setIndent( intval((string) $style->alignment["indent"]) >  0 ?  intval((string) $style->alignment["indent"]) :  0 );  
        if (isset ($style->protection)) {  
            if (isset ($style->protection['locked'])) {  
                if ((string) $style->protection['locked'] ==  'true') {  
            if (isset ($style->protection['hidden'])) {  
                if ((string) $style->protection['hidden'] ==  'true') {  
    private static function _readBorder($docBorder, $eleBorder) {  
        if (isset ($eleBorder["style"])) {  
            $docBorder->setBorderStyle((string)  $eleBorder["style"]);  
        if (isset ($eleBorder->color)) {  
            $docBorder->getColor()->setARGB(self::_readColor($eleBorder->color));  
    private function _parseRichText($is =  null) {  
            foreach ($is->r as $run) {  
                    if (isset ($run->rPr->rFont["val"])) {  
                        $objText->getFont()->setName((string)  $run->rPr->rFont["val"]);  
                    if (isset ($run->rPr->sz["val"])) {  
                        $objText->getFont()->setSize((string)  $run->rPr->sz["val"]);  
                    if (isset ($run->rPr->color)) {  
                    if ( (isset ($run->rPr->b["val"]) &&  ((string)  $run->rPr->b["val"] ==  'true' || (string)  $run->rPr->b["val"] ==  '1'))  
                         ||  (isset ($run->rPr->b) &&  !isset ($run->rPr->b["val"])) ) { 
                        $objText->getFont()->setBold(true);  
                    if ( (isset ($run->rPr->i["val"]) &&  ((string)  $run->rPr->i["val"] ==  'true' || (string)  $run->rPr->i["val"] ==  '1'))  
                         ||  (isset ($run->rPr->i) &&  !isset ($run->rPr->i["val"])) ) { 
                        $objText->getFont()->setItalic(true);  
                    if (isset ($run->rPr->vertAlign) && isset ($run->rPr->vertAlign["val"])) {  
                        $vertAlign =  strtolower((string) $run->rPr->vertAlign["val"]);  
                        if ($vertAlign ==  'superscript') {  
                            $objText->getFont()->setSuperScript(true);  
                        if ($vertAlign ==  'subscript') {  
                            $objText->getFont()->setSubScript(true);  
                    if (isset ($run->rPr->u) &&  !isset ($run->rPr->u["val"])) {  
                    } else if (isset ($run->rPr->u) && isset ($run->rPr->u["val"])) {  
                        $objText->getFont()->setUnderline((string) $run->rPr->u["val"]);  
                    if ( (isset ($run->rPr->strike["val"])  &&  ((string)  $run->rPr->strike["val"] ==  'true' || (string)  $run->rPr->strike["val"] ==  '1'))  
                         ||  (isset ($run->rPr->strike) &&  !isset ($run->rPr->strike["val"])) ) { 
                        $objText->getFont()->setStrikethrough(true);  
    private static function array_item($array, $key =  0) {  
        return (isset ($array[$key]) ?  $array[$key] :  null);  
    private static function dir_add($base, $add) {  
    private static function toCSSArray($style) {  
        foreach ($temp as $item) {  
            if (strpos($item[1], 'px') !==  false) {  
            if (strpos($item[1], 'pt') !==  false) {  
            if (strpos($item[1], 'in') !==  false) {  
            if (strpos($item[1], 'cm') !==  false) {  
            $style[$item[0]] =  $item[1];  
 
 
        
       |