diff --git a/Classes/PHPExcel/Reader/Excel2003XML.php b/Classes/PHPExcel/Reader/Excel2003XML.php
index ec31c0f4..95eb9369 100644
--- a/Classes/PHPExcel/Reader/Excel2003XML.php
+++ b/Classes/PHPExcel/Reader/Excel2003XML.php
@@ -659,40 +659,56 @@ class PHPExcel_Reader_Excel2003XML implements PHPExcel_Reader_IReader
}
if ($hasCalculatedValue) {
+// echo 'FORMULA
';
$type = PHPExcel_Cell_DataType::TYPE_FORMULA;
$columnNumber = PHPExcel_Cell::columnIndexFromString($columnID);
- // Convert R1C1 style references to A1 style references (but only when not quoted)
- $temp = explode('"',$cellDataFormula);
- $key = false;
- foreach($temp as &$value) {
- // Only replace in alternate array entries (i.e. non-quoted blocks)
- if ($key = !$key) {
- preg_match_all('/(R(\[?-?\d*\]?))(C(\[?-?\d*\]?))/',$value, $cellReferences,PREG_SET_ORDER+PREG_OFFSET_CAPTURE);
- // Reverse the matches array, otherwise all our offsets will become incorrect if we modify our way
- // through the formula from left to right. Reversing means that we work right to left.through
- // the formula
- $cellReferences = array_reverse($cellReferences);
- // Loop through each R1C1 style reference in turn, converting it to its A1 style equivalent,
- // then modify the formula to use that new reference
- foreach($cellReferences as $cellReference) {
- $rowReference = $cellReference[2][0];
- // Empty R reference is the current row
- if ($rowReference == '') $rowReference = $rowID;
- // Bracketed R references are relative to the current row
- if ($rowReference{0} == '[') $rowReference = $rowID + trim($rowReference,'[]');
- $columnReference = $cellReference[4][0];
- // Empty C reference is the current column
- if ($columnReference == '') $columnReference = $columnNumber;
- // Bracketed C references are relative to the current column
- if ($columnReference{0} == '[') $columnReference = $columnNumber + trim($columnReference,'[]');
- $A1CellReference = PHPExcel_Cell::stringFromColumnIndex($columnReference-1).$rowReference;
- $value = substr_replace($value,$A1CellReference,$cellReference[0][1],strlen($cellReference[0][0]));
+ if (substr($cellDataFormula,0,3) == 'of:') {
+ $cellDataFormula = substr($cellDataFormula,3);
+// echo 'Before: ',$cellDataFormula,'
';
+ $temp = explode('"',$cellDataFormula);
+ $key = false;
+ foreach($temp as &$value) {
+ // Only replace in alternate array entries (i.e. non-quoted blocks)
+ if ($key = !$key) {
+ $value = str_replace(array('[.','.',']'),'',$value);
+ }
+ }
+ } else {
+ // Convert R1C1 style references to A1 style references (but only when not quoted)
+// echo 'Before: ',$cellDataFormula,'
';
+ $temp = explode('"',$cellDataFormula);
+ $key = false;
+ foreach($temp as &$value) {
+ // Only replace in alternate array entries (i.e. non-quoted blocks)
+ if ($key = !$key) {
+ preg_match_all('/(R(\[?-?\d*\]?))(C(\[?-?\d*\]?))/',$value, $cellReferences,PREG_SET_ORDER+PREG_OFFSET_CAPTURE);
+ // Reverse the matches array, otherwise all our offsets will become incorrect if we modify our way
+ // through the formula from left to right. Reversing means that we work right to left.through
+ // the formula
+ $cellReferences = array_reverse($cellReferences);
+ // Loop through each R1C1 style reference in turn, converting it to its A1 style equivalent,
+ // then modify the formula to use that new reference
+ foreach($cellReferences as $cellReference) {
+ $rowReference = $cellReference[2][0];
+ // Empty R reference is the current row
+ if ($rowReference == '') $rowReference = $rowID;
+ // Bracketed R references are relative to the current row
+ if ($rowReference{0} == '[') $rowReference = $rowID + trim($rowReference,'[]');
+ $columnReference = $cellReference[4][0];
+ // Empty C reference is the current column
+ if ($columnReference == '') $columnReference = $columnNumber;
+ // Bracketed C references are relative to the current column
+ if ($columnReference{0} == '[') $columnReference = $columnNumber + trim($columnReference,'[]');
+ $A1CellReference = PHPExcel_Cell::stringFromColumnIndex($columnReference-1).$rowReference;
+ $value = substr_replace($value,$A1CellReference,$cellReference[0][1],strlen($cellReference[0][0]));
+ }
}
}
}
unset($value);
// Then rebuild the formula string
$cellDataFormula = implode('"',$temp);
+// echo 'After: ',$cellDataFormula,'
';
}
// echo 'Cell '.$columnID.$rowID.' is a '.$type.' with a value of '.(($hasCalculatedValue) ? $cellDataFormula : $cellValue).'
';
diff --git a/Tests/XMLReader.php b/Tests/XMLReader.php
index 82e0eab9..5f49530a 100644
--- a/Tests/XMLReader.php
+++ b/Tests/XMLReader.php
@@ -35,7 +35,16 @@ require_once '../Classes/PHPExcel/IOFactory.php';
echo date('H:i:s') . " Load from XML file\n";
-$objPHPExcel = PHPExcel_IOFactory::load("XMLTest.xml");
+$inputFileName = "XMLTest.xml";
+
+/** Identify the type of $inputFileName **/
+$inputFileType = PHPExcel_IOFactory::identify($inputFileName);
+echo 'Loading ',$inputFileName,' using ',$inputFileType," Reader\n";
+
+/** Create a new Reader of the type that has been identified **/
+$objReader = PHPExcel_IOFactory::createReader($inputFileType);
+/** Load $inputFileName to a PHPExcel Object **/
+$objPHPExcel = $objReader->load($inputFileName);
echo date('H:i:s') . " Write to Excel2007 format\n";
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');