Example #1
0
 /**
  * Get an instance of this class
  *
  * @return PHPExcel_ReferenceHelper
  */
 public static function getInstance()
 {
     if (!isset(self::$_instance) || is_null(self::$_instance)) {
         self::$_instance = new PHPExcel_ReferenceHelper();
     }
     return self::$_instance;
 }
Example #2
0
	private function _castToFormula($c, $r, &$cellDataType, &$value, &$calculatedValue, &$sharedFormulas, $castBaseType) {
		// echo '<font color="darkgreen">Formula</font><br />';
		// echo '$c->f is '.$c->f.'<br />';
		$cellDataType = 'f';
		$value = "={$c->f}";
		$calculatedValue = self::$castBaseType ( $c );
		
		// Shared formula?
		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);
			// echo '</pre>';
			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,
						'formula' => $value 
				);
				// echo 'New Shared Formula Array:<pre>';
				// print_r($sharedFormulas);
				// echo '</pre>';
			} else {
				// echo '<font color="darkgreen">GETTING SHARED
				// FORMULA</font><br />';
				// echo 'Master is '.$sharedFormulas[$instance]['master'].'<br
				// />';
				// echo 'Formula is '.$sharedFormulas[$instance]['formula'].'<br
				// />';
				$master = PHPExcel_Cell::coordinateFromString ( $sharedFormulas [$instance] ['master'] );
				$current = PHPExcel_Cell::coordinateFromString ( $r );
				
				$difference = array (
						0,
						0 
				);
				$difference [0] = PHPExcel_Cell::columnIndexFromString ( $current [0] ) - PHPExcel_Cell::columnIndexFromString ( $master [0] );
				$difference [1] = $current [1] - $master [1];
				
				$value = $this->_referenceHelper->updateFormulaReferences ( $sharedFormulas [$instance] ['formula'], 'A1', $difference [0], $difference [1] );
				// echo 'Adjusted Formula is '.$value.'<br />';
			}
		}
	}
 private function _castToFormula($c, $r, &$cellDataType, &$value, &$calculatedValue, &$sharedFormulas, $castBaseType)
 {
     $cellDataType = 'f';
     $value = "={$c->f}";
     $calculatedValue = self::$castBaseType($c);
     // Shared formula ?
     if (isset($c->f['t']) && strtolower((string) $c->f['t']) == 'shared') {
         $instance = (string) $c->f['si'];
         if (!isset($sharedFormulas[(string) $c->f['si']])) {
             $sharedFormulas[$instance] = array('master' => $r, 'formula' => $value);
         } else {
             $master = PHPExcel_Cell::coordinateFromString($sharedFormulas[$instance]['master']);
             $current = PHPExcel_Cell::coordinateFromString($r);
             $difference = array(0, 0);
             $difference[0] = PHPExcel_Cell::columnIndexFromString($current[0]) - PHPExcel_Cell::columnIndexFromString($master[0]);
             $difference[1] = $current[1] - $master[1];
             $value = $this->_referenceHelper->updateFormulaReferences($sharedFormulas[$instance]['formula'], 'A1', $difference[0], $difference[1]);
         }
     }
 }
 private function castToFormula($c, $r, &$cellDataType, &$value, &$calculatedValue, &$sharedFormulas, $castBaseType)
 {
     //        echo 'Formula', PHP_EOL;
     //        echo '$c->f is ', $c->f, PHP_EOL;
     $cellDataType = 'f';
     $value = "={$c->f}";
     $calculatedValue = self::$castBaseType($c);
     // Shared formula?
     if (isset($c->f['t']) && strtolower((string) $c->f['t']) == 'shared') {
         //            echo 'SHARED FORMULA', PHP_EOL;
         $instance = (string) $c->f['si'];
         //            echo 'Instance ID = ', $instance, PHP_EOL;
         //
         //            echo 'Shared Formula Array:', PHP_EOL;
         //            print_r($sharedFormulas);
         if (!isset($sharedFormulas[(string) $c->f['si']])) {
             //                echo 'SETTING NEW SHARED FORMULA', PHP_EOL;
             //                echo 'Master is ', $r, PHP_EOL;
             //                echo 'Formula is ', $value, PHP_EOL;
             $sharedFormulas[$instance] = array('master' => $r, 'formula' => $value);
             //                echo 'New Shared Formula Array:', PHP_EOL;
             //                print_r($sharedFormulas);
         } else {
             //                echo 'GETTING SHARED FORMULA', PHP_EOL;
             //                echo 'Master is ', $sharedFormulas[$instance]['master'], PHP_EOL;
             //                echo 'Formula is ', $sharedFormulas[$instance]['formula'], PHP_EOL;
             $master = PHPExcel_Cell::coordinateFromString($sharedFormulas[$instance]['master']);
             $current = PHPExcel_Cell::coordinateFromString($r);
             $difference = array(0, 0);
             $difference[0] = PHPExcel_Cell::columnIndexFromString($current[0]) - PHPExcel_Cell::columnIndexFromString($master[0]);
             $difference[1] = $current[1] - $master[1];
             $value = $this->referenceHelper->updateFormulaReferences($sharedFormulas[$instance]['formula'], 'A1', $difference[0], $difference[1]);
             //                echo 'Adjusted Formula is ', $value, PHP_EOL;
         }
     }
 }
Example #5
0
 /**
  * Remove a column, updating all possible related data
  *
  * @param int $pColumn    Remove starting with this one
  * @param int $pNumCols    Number of columns to remove
  * @throws    PHPExcel_Exception
  * @return PHPExcel_Worksheet
  */
 public function removeColumn($pColumn = 'A', $pNumCols = 1)
 {
     if (!is_numeric($pColumn)) {
         $pColumn = PHPExcel_Cell::stringFromColumnIndex(PHPExcel_Cell::columnIndexFromString($pColumn) - 1 + $pNumCols);
         $objReferenceHelper = PHPExcel_ReferenceHelper::getInstance();
         $objReferenceHelper->insertNewBefore($pColumn . '1', -$pNumCols, 0, $this);
     } else {
         throw new PHPExcel_Exception("Column references should not be numeric.");
     }
     return $this;
 }
Example #6
0
 /**
  * Loads PHPExcel from file
  *
  * @param 	string 		$pFilename
  * @throws 	Exception
  */
 public function load($pFilename)
 {
     // Check if file exists
     if (!file_exists($pFilename)) {
         throw new Exception("Could not open " . $pFilename . " for reading! File does not exist.");
     }
     // Initialisations
     $excel = new PHPExcel();
     $excel->removeSheetByIndex(0);
     $zip = new ZipArchive();
     $zip->open($pFilename);
     $rels = simplexml_load_string($zip->getFromName("_rels/.rels"));
     //~ http://schemas.openxmlformats.org/package/2006/relationships");
     foreach ($rels->Relationship as $rel) {
         switch ($rel["Type"]) {
             case "http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties":
                 $xmlCore = simplexml_load_string($zip->getFromName("{$rel['Target']}"));
                 $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")));
                 break;
             case "http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument":
                 $dir = dirname($rel["Target"]);
                 $relsWorkbook = simplexml_load_string($zip->getFromName("{$dir}/_rels/" . basename($rel["Target"]) . ".rels"));
                 //~ http://schemas.openxmlformats.org/package/2006/relationships");
                 $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']"));
                 $xmlStrings = simplexml_load_string($zip->getFromName("{$dir}/{$xpath['Target']}"));
                 //~ http://schemas.openxmlformats.org/spreadsheetml/2006/main");
                 if (isset($xmlStrings) && isset($xmlStrings->si)) {
                     foreach ($xmlStrings->si as $val) {
                         if (isset($val->t)) {
                             $sharedStrings[] = PHPExcel_Shared_String::ControlCharacterOOXML2PHP((string) $val->t);
                         } elseif (isset($val->r)) {
                             $sharedStrings[] = $this->_parseRichText($val);
                         }
                     }
                 }
                 $worksheets = array();
                 foreach ($relsWorkbook->Relationship as $ele) {
                     if ($ele["Type"] == "http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet") {
                         $worksheets[(string) $ele["Id"]] = $ele["Target"];
                     }
                 }
                 $styles = array();
                 $cellStyles = array();
                 $xpath = self::array_item($relsWorkbook->xpath("rel:Relationship[@Type='http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles']"));
                 $xmlStyles = simplexml_load_string($zip->getFromName("{$dir}/{$xpath['Target']}"));
                 //~ http://schemas.openxmlformats.org/spreadsheetml/2006/main");
                 $numFmts = $xmlStyles->numFmts[0];
                 if ($numFmts) {
                     $numFmts->registerXPathNamespace("sml", "http://schemas.openxmlformats.org/spreadsheetml/2006/main");
                 }
                 if (!$this->_readDataOnly) {
                     foreach ($xmlStyles->cellXfs->xf as $xf) {
                         $numFmt = PHPExcel_Style_NumberFormat::FORMAT_GENERAL;
                         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) {
                                     $numFmt = PHPExcel_Style_NumberFormat::builtInFormatCode((int) $xf["numFmtId"]);
                                 }
                             }
                         }
                         //$numFmt = str_replace('mm', 'i', $numFmt);
                         //$numFmt = str_replace('h', 'H', $numFmt);
                         $styles[] = (object) array("numFmt" => $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, "applyAlignment" => isset($xf["applyAlignment"]) && ((string) $xf["applyAlignment"] == 'true' || (string) $xf["applyAlignment"] == '1'), "applyBorder" => isset($xf["applyBorder"]) && ((string) $xf["applyBorder"] == 'true' || (string) $xf["applyBorder"] == '1'), "applyFill" => isset($xf["applyFill"]) && ((string) $xf["applyFill"] == 'true' || (string) $xf["applyFill"] == '1'), "applyFont" => isset($xf["applyFont"]) && ((string) $xf["applyFont"] == 'true' || (string) $xf["applyFont"] == '1'), "applyNumberFormat" => isset($xf["applyNumberFormat"]) && ((string) $xf["applyNumberFormat"] == 'true' || (string) $xf["applyNumberFormat"] == '1'), "applyProtection" => isset($xf["applyProtection"]) && ((string) $xf["applyProtection"] == 'true' || (string) $xf["applyProtection"] == '1'));
                     }
                     foreach ($xmlStyles->cellStyleXfs->xf as $xf) {
                         $numFmt = PHPExcel_Style_NumberFormat::FORMAT_GENERAL;
                         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) {
                                     $numFmt = PHPExcel_Style_NumberFormat::builtInFormatCode((int) $xf["numFmtId"]);
                                 }
                             }
                         }
                         $cellStyles[] = (object) array("numFmt" => $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, "applyAlignment" => true, "applyBorder" => true, "applyFill" => true, "applyFont" => true, "applyNumberFormat" => true, "applyProtection" => true);
                     }
                 }
                 $dxfs = array();
                 if (!$this->_readDataOnly) {
                     foreach ($xmlStyles->dxfs->dxf as $dxf) {
                         $style = new PHPExcel_Style();
                         $this->_readStyle($style, $dxf);
                         $dxfs[] = $style;
                     }
                     foreach ($xmlStyles->cellStyles->cellStyle as $cellStyle) {
                         if (intval($cellStyle['builtinId']) == 0) {
                             if (isset($cellStyles[intval($cellStyle['xfId'])])) {
                                 // Set default style
                                 $style = new PHPExcel_Style();
                                 $this->_readStyle($style, $cellStyles[intval($cellStyle['xfId'])]);
                                 PHPExcel_Style::setDefaultStyle($style);
                             }
                         }
                     }
                 }
                 $xmlWorkbook = simplexml_load_string($zip->getFromName("{$rel['Target']}"));
                 //~ http://schemas.openxmlformats.org/spreadsheetml/2006/main");
                 // Set base date
                 if ($xmlWorkbook->workbookPr) {
                     if (isset($xmlWorkbook->workbookPr['date1904'])) {
                         $date1904 = (string) $xmlWorkbook->workbookPr['date1904'];
                         if ($date1904 == "true" || $date1904 == "1") {
                             PHPExcel_Shared_Date::setExcelCalendar(PHPExcel_Shared_Date::CALENDAR_MAC_1904);
                         }
                     }
                 }
                 $sheetId = 0;
                 foreach ($xmlWorkbook->sheets->sheet as $eleSheet) {
                     // Check if sheet should be skipped
                     if (isset($this->_loadSheetsOnly) && !in_array((string) $eleSheet["name"], $this->_loadSheetsOnly)) {
                         continue;
                     }
                     // Load sheet
                     $docSheet = $excel->createSheet();
                     $docSheet->setTitle((string) $eleSheet["name"]);
                     $fileWorksheet = $worksheets[(string) self::array_item($eleSheet->attributes("http://schemas.openxmlformats.org/officeDocument/2006/relationships"), "id")];
                     $xmlSheet = simplexml_load_string($zip->getFromName("{$dir}/{$fileWorksheet}"));
                     //~ http://schemas.openxmlformats.org/spreadsheetml/2006/main");
                     $sharedFormulas = array();
                     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($xmlSheet->sheetViews->sheetView['showGridLines'] ? true : false);
                         }
                         if (isset($xmlSheet->sheetViews->sheetView->pane)) {
                             if (isset($xmlSheet->sheetViews->sheetView->pane['topLeftCell'])) {
                                 $docSheet->freezePane((string) $xmlSheet->sheetViews->sheetView->pane['topLeftCell']);
                             } else {
                                 $xSplit = 0;
                                 $ySplit = 0;
                                 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->sheetPr) && isset($xmlSheet->sheetPr->outlinePr)) {
                         if (isset($xmlSheet->sheetPr->outlinePr['summaryRight']) && $xmlSheet->sheetPr->outlinePr['summaryRight'] == false) {
                             $docSheet->setShowSummaryRight(false);
                         } else {
                             $docSheet->setShowSummaryRight(true);
                         }
                         if (isset($xmlSheet->sheetPr->outlinePr['summaryBelow']) && $xmlSheet->sheetPr->outlinePr['summaryBelow'] == false) {
                             $docSheet->setShowSummaryBelow(false);
                         } else {
                             $docSheet->setShowSummaryBelow(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((double) $xmlSheet->sheetFormatPr['defaultRowHeight']);
                         }
                         if (isset($xmlSheet->sheetFormatPr['defaultColWidth'])) {
                             $docSheet->getDefaultColumnDimension()->setWidth((double) $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["bestFit"]) {
                                     $docSheet->getColumnDimension(PHPExcel_Cell::stringFromColumnIndex($i))->setAutoSize(true);
                                 }
                                 if ($col["hidden"]) {
                                     $docSheet->getColumnDimension(PHPExcel_Cell::stringFromColumnIndex($i))->setVisible(false);
                                 }
                                 if ($col["collapsed"]) {
                                     $docSheet->getColumnDimension(PHPExcel_Cell::stringFromColumnIndex($i))->setCollapsed(true);
                                 }
                                 if ($col["outlineLevel"] > 0) {
                                     $docSheet->getColumnDimension(PHPExcel_Cell::stringFromColumnIndex($i))->setOutlineLevel(intval($col["outlineLevel"]));
                                 }
                                 $docSheet->getColumnDimension(PHPExcel_Cell::stringFromColumnIndex($i))->setWidth(floatval($col["width"]));
                                 if (intval($col["max"]) == 16384) {
                                     break;
                                 }
                             }
                         }
                     }
                     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);
                         }
                     }
                     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);
                         }
                         if ($row["collapsed"]) {
                             $docSheet->getRowDimension(intval($row["r"]))->setCollapsed(true);
                         }
                         if ($row["outlineLevel"] > 0) {
                             $docSheet->getRowDimension(intval($row["r"]))->setOutlineLevel(intval($row["outlineLevel"]));
                         }
                         foreach ($row->c as $c) {
                             $r = (string) $c["r"];
                             $cellDataType = (string) $c["t"];
                             // Read cell?
                             if (!is_null($this->getReadFilter())) {
                                 $coordinates = PHPExcel_Cell::coordinateFromString($r);
                                 if (!$this->getReadFilter()->readCell($coordinates[0], $coordinates[1], $docSheet->getTitle())) {
                                     break;
                                 }
                             }
                             // Read cell!
                             switch ($cellDataType) {
                                 case "s":
                                     if ((string) $c->v != '') {
                                         $value = $sharedStrings[intval($c->v)];
                                         if ($value instanceof PHPExcel_RichText) {
                                             $value = clone $value;
                                         }
                                     } else {
                                         $value = '';
                                     }
                                     break;
                                 case "b":
                                     $value = (string) $c->v;
                                     if ($value == '0') {
                                         $value = false;
                                     } else {
                                         if ($value == '1') {
                                             $value = true;
                                         } else {
                                             $value = (bool) $c->v;
                                         }
                                     }
                                     break;
                                 case "inlineStr":
                                     $value = $this->_parseRichText($c->is);
                                     break;
                                 case "e":
                                     if (!isset($c->f)) {
                                         $value = (string) $c->v;
                                     } else {
                                         $value = "={$c->f}";
                                     }
                                     break;
                                 default:
                                     if (!isset($c->f)) {
                                         $value = (string) $c->v;
                                     } else {
                                         // Formula
                                         $value = "={$c->f}";
                                         $cellDataType = 'f';
                                         // Shared formula?
                                         if (isset($c->f['t']) && strtolower((string) $c->f['t']) == 'shared') {
                                             $instance = (string) $c->f['si'];
                                             if (!isset($sharedFormulas[(string) $c->f['si']])) {
                                                 $sharedFormulas[$instance] = array('master' => $r, 'formula' => $value);
                                             } else {
                                                 $master = PHPExcel_Cell::coordinateFromString($sharedFormulas[$instance]['master']);
                                                 $current = PHPExcel_Cell::coordinateFromString($r);
                                                 $difference = array(0, 0);
                                                 $difference[0] = PHPExcel_Cell::columnIndexFromString($current[0]) - PHPExcel_Cell::columnIndexFromString($master[0]);
                                                 $difference[1] = $current[1] - $master[1];
                                                 $helper = PHPExcel_ReferenceHelper::getInstance();
                                                 $x = $helper->updateFormulaReferences($sharedFormulas[$instance]['formula'], 'A1', $difference[0], $difference[1]);
                                                 $value = $x;
                                             }
                                         }
                                     }
                                     break;
                             }
                             // Check for numeric values
                             if (is_numeric($value) && $cellDataType != 's') {
                                 if ($value == (int) $value) {
                                     $value = (int) $value;
                                 } elseif ($value == (double) $value) {
                                     $value = (double) $value;
                                 } elseif ($value == (double) $value) {
                                     $value = (double) $value;
                                 }
                             }
                             // Rich text?
                             if ($value instanceof PHPExcel_RichText && $this->_readDataOnly) {
                                 $value = $value->getPlainText();
                             }
                             // Assign value
                             if ($cellDataType != '') {
                                 $docSheet->setCellValueExplicit($r, $value, $cellDataType);
                             } else {
                                 $docSheet->setCellValue($r, $value);
                             }
                             // Style information?
                             if ($c["s"] && !$this->_readDataOnly) {
                                 if (isset($styles[intval($c["s"])])) {
                                     $this->_readStyle($docSheet->getStyle($r), $styles[intval($c["s"])]);
                                 }
                                 if ($cellDataType != 's' && PHPExcel_Shared_Date::isDateTimeFormat($docSheet->getStyle($r)->getNumberFormat())) {
                                     if (preg_match("/^([0-9.,-]+)\$/", $value)) {
                                         $docSheet->setCellValue($r, PHPExcel_Shared_Date::ExcelToPHP($value));
                                     }
                                 }
                             }
                             // Set rich text parent
                             if ($value instanceof PHPExcel_RichText && !$this->_readDataOnly) {
                                 $value->setParent($docSheet->getCell($r));
                             }
                         }
                     }
                     $conditionals = array();
                     if (!$this->_readDataOnly) {
                         foreach ($xmlSheet->conditionalFormatting as $conditional) {
                             foreach ($conditional->cfRule as $cfRule) {
                                 if (((string) $cfRule["type"] == PHPExcel_Style_Conditional::CONDITION_NONE || (string) $cfRule["type"] == PHPExcel_Style_Conditional::CONDITION_CELLIS || (string) $cfRule["type"] == PHPExcel_Style_Conditional::CONDITION_CONTAINSTEXT) && isset($dxfs[intval($cfRule["dxfId"])])) {
                                     $conditionals[(string) $conditional["sqref"]][intval($cfRule["priority"])] = $cfRule;
                                 }
                             }
                         }
                         foreach ($conditionals as $ref => $cfRules) {
                             ksort($cfRules);
                             $conditionalStyles = array();
                             foreach ($cfRules as $cfRule) {
                                 $objConditional = new PHPExcel_Style_Conditional();
                                 $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);
                                     }
                                 } else {
                                     $objConditional->addCondition((string) $cfRule->formula);
                                 }
                                 $objConditional->setStyle(clone $dxfs[intval($cfRule["dxfId"])]);
                                 $conditionalStyles[] = $objConditional;
                             }
                             // Extract all cell references in $ref
                             $aReferences = PHPExcel_Cell::extractAllCellReferencesInRange($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) {
                         foreach ($aKeys as $key) {
                             $method = "set" . ucfirst($key);
                             $docSheet->getProtection()->{$method}($xmlSheet->sheetProtection[$key] == "true");
                         }
                     }
                     if (!$this->_readDataOnly) {
                         $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->autoFilter && !$this->_readDataOnly) {
                         $docSheet->setAutoFilter((string) $xmlSheet->autoFilter["ref"]);
                     }
                     if ($xmlSheet->mergeCells->mergeCell && !$this->_readDataOnly) {
                         foreach ($xmlSheet->mergeCells->mergeCell as $mergeCell) {
                             $docSheet->mergeCells((string) $mergeCell["ref"]);
                         }
                     }
                     if (!$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 (!$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"]));
                         }
                         if (isset($xmlSheet->pageSetup["fitToHeight"]) && intval($xmlSheet->pageSetup["fitToHeight"]) > 0) {
                             $docPageSetup->setFitToHeight(intval($xmlSheet->pageSetup["fitToHeight"]));
                         }
                         if (isset($xmlSheet->pageSetup["fitToWidth"]) && intval($xmlSheet->pageSetup["fitToWidth"]) > 0) {
                             $docPageSetup->setFitToWidth(intval($xmlSheet->pageSetup["fitToWidth"]));
                         }
                     }
                     if (!$this->_readDataOnly) {
                         $docHeaderFooter = $docSheet->getHeaderFooter();
                         $docHeaderFooter->setDifferentOddEven($xmlSheet->headerFooter["differentOddEven"] == 'true');
                         $docHeaderFooter->setDifferentFirst($xmlSheet->headerFooter["differentFirst"] == 'true');
                         $docHeaderFooter->setScaleWithDocument($xmlSheet->headerFooter["scaleWithDoc"] == 'true');
                         $docHeaderFooter->setAlignWithMargins($xmlSheet->headerFooter["alignWithMargins"] == '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->rowBreaks->brk && !$this->_readDataOnly) {
                         foreach ($xmlSheet->rowBreaks->brk as $brk) {
                             if ($brk["man"]) {
                                 $docSheet->setBreak("A{$brk['id']}", PHPExcel_Worksheet::BREAK_ROW);
                             }
                         }
                     }
                     if ($xmlSheet->colBreaks->brk && !$this->_readDataOnly) {
                         foreach ($xmlSheet->colBreaks->brk as $brk) {
                             if ($brk["man"]) {
                                 $docSheet->setBreak(PHPExcel_Cell::stringFromColumnIndex($brk["id"]) . "1", PHPExcel_Worksheet::BREAK_COLUMN);
                             }
                         }
                     }
                     if ($xmlSheet->dataValidations && !$this->_readDataOnly) {
                         foreach ($xmlSheet->dataValidations->dataValidation as $dataValidation) {
                             // Uppercase coordinate
                             $range = strtoupper($dataValidation["sqref"]);
                             // Extract all cell references in $range
                             $aReferences = PHPExcel_Cell::extractAllCellReferencesInRange($range);
                             foreach ($aReferences as $reference) {
                                 // Create validation
                                 $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);
                             }
                         }
                     }
                     // Add hyperlinks
                     $hyperlinks = array();
                     if (!$this->_readDataOnly) {
                         // Locate hyperlink relations
                         if ($zip->locateName(dirname("{$dir}/{$fileWorksheet}") . "/_rels/" . basename($fileWorksheet) . ".rels")) {
                             $relsWorksheet = simplexml_load_string($zip->getFromName(dirname("{$dir}/{$fileWorksheet}") . "/_rels/" . basename($fileWorksheet) . ".rels"));
                             //~ http://schemas.openxmlformats.org/package/2006/relationships");
                             foreach ($relsWorksheet->Relationship as $ele) {
                                 if ($ele["Type"] == "http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink") {
                                     $hyperlinks[(string) $ele["Id"]] = (string) $ele["Target"];
                                 }
                             }
                         }
                         // Loop trough hyperlinks
                         if ($xmlSheet->hyperlinks) {
                             foreach ($xmlSheet->hyperlinks->hyperlink as $hyperlink) {
                                 // Link url
                                 $linkRel = $hyperlink->attributes('http://schemas.openxmlformats.org/officeDocument/2006/relationships');
                                 if (isset($linkRel['id'])) {
                                     $docSheet->getCell($hyperlink['ref'])->getHyperlink()->setUrl($hyperlinks[(string) $linkRel['id']]);
                                 }
                                 if (isset($hyperlink['location'])) {
                                     $docSheet->getCell($hyperlink['ref'])->getHyperlink()->setUrl('sheet://' . (string) $hyperlink['location']);
                                 }
                                 // Tooltip
                                 if (isset($hyperlink['tooltip'])) {
                                     $docSheet->getCell($hyperlink['ref'])->getHyperlink()->setTooltip((string) $hyperlink['tooltip']);
                                 }
                             }
                         }
                     }
                     // Add comments
                     $comments = array();
                     $vmlComments = array();
                     if (!$this->_readDataOnly) {
                         // Locate comment relations
                         if ($zip->locateName(dirname("{$dir}/{$fileWorksheet}") . "/_rels/" . basename($fileWorksheet) . ".rels")) {
                             $relsWorksheet = simplexml_load_string($zip->getFromName(dirname("{$dir}/{$fileWorksheet}") . "/_rels/" . basename($fileWorksheet) . ".rels"));
                             //~ http://schemas.openxmlformats.org/package/2006/relationships");
                             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"];
                                 }
                             }
                         }
                         // Loop trough comments
                         foreach ($comments as $relName => $relPath) {
                             // Load comments file
                             $relPath = PHPExcel_Shared_File::realpath(dirname("{$dir}/{$fileWorksheet}") . "/" . $relPath);
                             $commentsFile = simplexml_load_string($zip->getFromName($relPath));
                             // Utility variables
                             $authors = array();
                             // Loop trough authors
                             foreach ($commentsFile->authors->author as $author) {
                                 $authors[] = (string) $author;
                             }
                             // Loop trough contents
                             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 trough VML comments
                         foreach ($vmlComments as $relName => $relPath) {
                             // Load VML comments file
                             $relPath = PHPExcel_Shared_File::realpath(dirname("{$dir}/{$fileWorksheet}") . "/" . $relPath);
                             $vmlCommentsFile = simplexml_load_string($zip->getFromName($relPath));
                             $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'];
                                     $fillColor = strtoupper(substr((string) $shape['fillcolor'], 1));
                                     $column = null;
                                     $row = null;
                                     $clientData = $shape->xpath('.//x:ClientData');
                                     if (is_array($clientData)) {
                                         $clientData = $clientData[0];
                                         if (isset($clientData['ObjectType']) && (string) $clientData['ObjectType'] == 'Note') {
                                             $temp = $clientData->xpath('.//x:Row');
                                             if (is_array($temp)) {
                                                 $row = $temp[0];
                                             }
                                             $temp = $clientData->xpath('.//x:Column');
                                             if (is_array($temp)) {
                                                 $column = $temp[0];
                                             }
                                         }
                                     }
                                     if (!is_null($column) && !is_null($row)) {
                                         // Set comment properties
                                         $comment = $docSheet->getCommentByColumnAndRow($column, $row + 1);
                                         $comment->getFillColor()->setRGB($fillColor);
                                         // Parse style
                                         $styleArray = explode(';', str_replace(' ', '', $style));
                                         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');
                                             }
                                         }
                                     }
                                 }
                             }
                         }
                         // Header/footer images
                         if ($xmlSheet->legacyDrawingHF && !$this->_readDataOnly) {
                             if ($zip->locateName(dirname("{$dir}/{$fileWorksheet}") . "/_rels/" . basename($fileWorksheet) . ".rels")) {
                                 $relsWorksheet = simplexml_load_string($zip->getFromName(dirname("{$dir}/{$fileWorksheet}") . "/_rels/" . basename($fileWorksheet) . ".rels"));
                                 //~ http://schemas.openxmlformats.org/package/2006/relationships");
                                 $vmlRelationship = '';
                                 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 != '') {
                                     // Fetch linked images
                                     $relsVML = simplexml_load_string($zip->getFromName(dirname($vmlRelationship) . '/_rels/' . basename($vmlRelationship) . '.rels'));
                                     //~ http://schemas.openxmlformats.org/package/2006/relationships");
                                     $drawings = array();
                                     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"]);
                                         }
                                     }
                                     // Fetch VML document
                                     $vmlDrawing = simplexml_load_string($zip->getFromName($vmlRelationship));
                                     $vmlDrawing->registerXPathNamespace('v', 'urn:schemas-microsoft-com:vml');
                                     $hfImages = array();
                                     $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']);
                                         $hfImages[(string) $shape['id']] = new PHPExcel_Worksheet_HeaderFooterDrawing();
                                         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")) {
                         $relsWorksheet = simplexml_load_string($zip->getFromName(dirname("{$dir}/{$fileWorksheet}") . "/_rels/" . basename($fileWorksheet) . ".rels"));
                         //~ http://schemas.openxmlformats.org/package/2006/relationships");
                         $drawings = array();
                         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")];
                                 $relsDrawing = simplexml_load_string($zip->getFromName(dirname($fileDrawing) . "/_rels/" . basename($fileDrawing) . ".rels"));
                                 //~ http://schemas.openxmlformats.org/package/2006/relationships");
                                 $images = array();
                                 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"]);
                                         }
                                     }
                                 }
                                 $xmlDrawing = simplexml_load_string($zip->getFromName($fileDrawing))->children("http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing");
                                 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 = new PHPExcel_Worksheet_Drawing();
                                             $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->setCoordinates(PHPExcel_Cell::stringFromColumnIndex($oneCellAnchor->from->col) . ($oneCellAnchor->from->row + 1));
                                             $objDrawing->setOffsetX(PHPExcel_Shared_Drawing::EMUToPixels($oneCellAnchor->from->colOff));
                                             $objDrawing->setOffsetY(PHPExcel_Shared_Drawing::EMUToPixels($oneCellAnchor->from->rowOff));
                                             $objDrawing->setResizeProportional(false);
                                             $objDrawing->setWidth(PHPExcel_Shared_Drawing::EMUToPixels(self::array_item($oneCellAnchor->ext->attributes(), "cx")));
                                             $objDrawing->setHeight(PHPExcel_Shared_Drawing::EMUToPixels(self::array_item($oneCellAnchor->ext->attributes(), "cy")));
                                             if ($xfrm) {
                                                 $objDrawing->setRotation(PHPExcel_Shared_Drawing::angleToDegrees(self::array_item($xfrm->attributes(), "rot")));
                                             }
                                             if ($outerShdw) {
                                                 $shadow = $objDrawing->getShadow();
                                                 $shadow->setVisible(true);
                                                 $shadow->setBlurRadius(PHPExcel_Shared_Drawing::EMUTopixels(self::array_item($outerShdw->attributes(), "blurRad")));
                                                 $shadow->setDistance(PHPExcel_Shared_Drawing::EMUTopixels(self::array_item($outerShdw->attributes(), "dist")));
                                                 $shadow->setDirection(PHPExcel_Shared_Drawing::angleToDegrees(self::array_item($outerShdw->attributes(), "dir")));
                                                 $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 = new PHPExcel_Worksheet_Drawing();
                                             $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->setCoordinates(PHPExcel_Cell::stringFromColumnIndex($twoCellAnchor->from->col) . ($twoCellAnchor->from->row + 1));
                                             $objDrawing->setOffsetX(PHPExcel_Shared_Drawing::EMUToPixels($twoCellAnchor->from->colOff));
                                             $objDrawing->setOffsetY(PHPExcel_Shared_Drawing::EMUToPixels($twoCellAnchor->from->rowOff));
                                             $objDrawing->setResizeProportional(false);
                                             $objDrawing->setWidth(PHPExcel_Shared_Drawing::EMUToPixels(self::array_item($xfrm->ext->attributes(), "cx")));
                                             $objDrawing->setHeight(PHPExcel_Shared_Drawing::EMUToPixels(self::array_item($xfrm->ext->attributes(), "cy")));
                                             if ($xfrm) {
                                                 $objDrawing->setRotation(PHPExcel_Shared_Drawing::angleToDegrees(self::array_item($xfrm->attributes(), "rot")));
                                             }
                                             if ($outerShdw) {
                                                 $shadow = $objDrawing->getShadow();
                                                 $shadow->setVisible(true);
                                                 $shadow->setBlurRadius(PHPExcel_Shared_Drawing::EMUTopixels(self::array_item($outerShdw->attributes(), "blurRad")));
                                                 $shadow->setDistance(PHPExcel_Shared_Drawing::EMUTopixels(self::array_item($outerShdw->attributes(), "dist")));
                                                 $shadow->setDirection(PHPExcel_Shared_Drawing::angleToDegrees(self::array_item($outerShdw->attributes(), "dir")));
                                                 $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 trough definedNames
                     if ($xmlWorkbook->definedNames) {
                         foreach ($xmlWorkbook->definedNames->definedName as $definedName) {
                             // Extract range
                             $extractedRange = (string) $definedName;
                             if (strpos($extractedRange, '!') !== false) {
                                 $extractedRange = substr($extractedRange, strpos($extractedRange, '!') + 1);
                             }
                             $extractedRange = str_replace('$', '', $extractedRange);
                             // Valid range?
                             if (stripos((string) $definedName, '#REF!') !== false || $extractedRange == '') {
                                 continue;
                             }
                             // Some definedNames are only applicable if we are on the same sheet...
                             if ($definedName['localSheetId'] == $sheetId) {
                                 // Switch on type
                                 switch ((string) $definedName['name']) {
                                     case '_xlnm._FilterDatabase':
                                         $docSheet->setAutoFilter($extractedRange);
                                         break;
                                     case '_xlnm.Print_Titles':
                                         // Split $extractedRange
                                         $extractedRange = explode(',', $extractedRange);
                                         // Set print titles
                                         if (isset($extractedRange[0])) {
                                             $range = explode(':', $extractedRange[0]);
                                             if (PHPExcel_Worksheet::extractSheetTitle($range[0]) != '') {
                                                 $range[0] = PHPExcel_Worksheet::extractSheetTitle($range[0]);
                                             }
                                             $range[0] = str_replace('$', '', $range[0]);
                                             if (PHPExcel_Worksheet::extractSheetTitle($range[1]) != '') {
                                                 $range[1] = PHPExcel_Worksheet::extractSheetTitle($range[1]);
                                             }
                                             $range[1] = str_replace('$', '', $range[1]);
                                             $docSheet->getPageSetup()->setColumnsToRepeatAtLeft($range);
                                         }
                                         if (isset($extractedRange[1])) {
                                             $range = explode(':', $extractedRange[1]);
                                             if (PHPExcel_Worksheet::extractSheetTitle($range[0]) != '') {
                                                 $range[0] = PHPExcel_Worksheet::extractSheetTitle($range[0]);
                                             }
                                             $range[0] = str_replace('$', '', $range[0]);
                                             if (PHPExcel_Worksheet::extractSheetTitle($range[1]) != '') {
                                                 $range[1] = PHPExcel_Worksheet::extractSheetTitle($range[1]);
                                             }
                                             $range[1] = str_replace('$', '', $range[1]);
                                             $docSheet->getPageSetup()->setRowsToRepeatAtTop($range);
                                         }
                                         break;
                                     case '_xlnm.Print_Area':
                                         $docSheet->getPageSetup()->setPrintArea($extractedRange);
                                         break;
                                     default:
                                         $excel->addNamedRange(new PHPExcel_NamedRange((string) $definedName['name'], $docSheet, $extractedRange, true));
                                         break;
                                 }
                             } else {
                                 // "Global" definedNames
                                 $locatedSheet = null;
                                 $extractedSheetName = '';
                                 if (strpos((string) $definedName, '!') !== false) {
                                     // Extract sheet name
                                     $extractedSheetName = PHPExcel_Worksheet::extractSheetTitle((string) $definedName);
                                     // Locate sheet
                                     $locatedSheet = $excel->getSheetByName($extractedSheetName);
                                 }
                                 if (!is_null($locatedSheet)) {
                                     $excel->addNamedRange(new PHPExcel_NamedRange((string) $definedName['name'], $locatedSheet, $extractedRange, false));
                                 }
                             }
                         }
                     }
                     // Garbage collect...
                     $docSheet->garbageCollect();
                     // Next sheet id
                     ++$sheetId;
                 }
                 if (!$this->_readDataOnly) {
                     $excel->setActiveSheetIndex(intval($xmlWorkbook->bookView->workbookView["activeTab"]));
                 }
                 break;
         }
     }
     return $excel;
 }
Example #7
0
 /**
  * Set name
  *
  * @param string $value
  * @return PHPExcel_NamedRange
  */
 public function setName($value = null)
 {
     if ($value !== null) {
         // Old title
         $oldTitle = $this->name;
         // Re-attach
         if ($this->worksheet !== null) {
             $this->worksheet->getParent()->removeNamedRange($this->name, $this->worksheet);
         }
         $this->name = $value;
         if ($this->worksheet !== null) {
             $this->worksheet->getParent()->addNamedRange($this);
         }
         // New title
         $newTitle = $this->name;
         PHPExcel_ReferenceHelper::getInstance()->updateNamedFormulas($this->worksheet->getParent(), $oldTitle, $newTitle);
     }
     return $this;
 }
Example #8
0
 /**
  * Create a new PHPExcel_Reader_Excel2007 instance
  */
 public function __construct()
 {
     $this->_readFilter = new PHPExcel_Reader_DefaultReadFilter();
     $this->_referenceHelper = PHPExcel_ReferenceHelper::getInstance();
 }
Example #9
0
 /**
  * Remove a column, updating all possible related data
  *
  * @param string    $pColumn     Remove starting with this one
  * @param int       $pNumCols    Number of columns to remove
  * @throws    PHPExcel_Exception
  * @return PHPExcel_Worksheet
  */
 public function removeColumn($pColumn = 'A', $pNumCols = 1)
 {
     if (!is_numeric($pColumn)) {
         $highestColumn = $this->getHighestDataColumn();
         $pColumn = PHPExcel_Cell::stringFromColumnIndex(PHPExcel_Cell::columnIndexFromString($pColumn) - 1 + $pNumCols);
         $objReferenceHelper = PHPExcel_ReferenceHelper::getInstance();
         $objReferenceHelper->insertNewBefore($pColumn . '1', -$pNumCols, 0, $this);
         for ($c = 0; $c < $pNumCols; ++$c) {
             $this->getCellCacheController()->removeColumn($highestColumn);
             $highestColumn = PHPExcel_Cell::stringFromColumnIndex(PHPExcel_Cell::columnIndexFromString($highestColumn) - 2);
         }
     } else {
         throw new PHPExcel_Exception("Column references should not be numeric.");
     }
     return $this;
 }