diff --git a/Classes/PHPExcel.php b/Classes/PHPExcel.php
index c3ec051..dcba067 100644
--- a/Classes/PHPExcel.php
+++ b/Classes/PHPExcel.php
@@ -364,7 +364,7 @@ class PHPExcel
public function __construct()
{
$this->uniqueID = uniqid();
- $this->calculationEngine = PHPExcel_Calculation::getInstance($this);
+ $this->calculationEngine = new PHPExcel_Calculation($this);
// Initialise worksheet collection and add one worksheet
$this->workSheetCollection = array();
@@ -395,7 +395,7 @@ class PHPExcel
*/
public function __destruct()
{
- PHPExcel_Calculation::unsetInstance($this);
+ $this->calculationEngine = null;
$this->disconnectWorksheets();
}
diff --git a/Classes/PHPExcel/Calculation.php b/Classes/PHPExcel/Calculation.php
index d6fdd9e..a2d9ab8 100644
--- a/Classes/PHPExcel/Calculation.php
+++ b/Classes/PHPExcel/Calculation.php
@@ -1497,7 +1497,7 @@ class PHPExcel_Calculation
'OFFSET' => array(
'category' => PHPExcel_Calculation_Function::CATEGORY_LOOKUP_AND_REFERENCE,
'functionCall' => 'PHPExcel_Calculation_LookupRef::OFFSET',
- 'argumentCount' => '3,5',
+ 'argumentCount' => '3-5',
'passCellReference' => true,
'passByReference' => array(true)
),
@@ -1814,8 +1814,8 @@ class PHPExcel_Calculation
),
'SUMIFS' => array(
'category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG,
- 'functionCall' => 'PHPExcel_Calculation_Functions::DUMMY',
- 'argumentCount' => '?'
+ 'functionCall' => 'PHPExcel_Calculation_MathTrig::SUMIFS',
+ 'argumentCount' => '3+'
),
'SUMPRODUCT' => array(
'category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG,
@@ -2068,14 +2068,10 @@ class PHPExcel_Calculation
);
- private function __construct(PHPExcel $workbook = null)
+ public function __construct(PHPExcel $workbook = null)
{
$this->delta = 1 * pow(10, 0 - ini_get('precision'));
- if ($workbook !== null) {
- self::$workbookSets[$workbook->getID()] = $this;
- }
-
$this->workbook = $workbook;
$this->cyclicReferenceStack = new PHPExcel_CalcEngine_CyclicReferenceStack();
$this->_debugLog = new PHPExcel_CalcEngine_Logger($this->cyclicReferenceStack);
@@ -2104,16 +2100,15 @@ class PHPExcel_Calculation
public static function getInstance(PHPExcel $workbook = null)
{
if ($workbook !== null) {
- if (isset(self::$workbookSets[$workbook->getID()])) {
- return self::$workbookSets[$workbook->getID()];
+ $instance = $workbook->getCalculationEngine();
+ if (isset($instance)) {
+ return $instance;
}
- return new PHPExcel_Calculation($workbook);
}
if (!isset(self::$instance) || (self::$instance === null)) {
self::$instance = new PHPExcel_Calculation();
}
-
return self::$instance;
}
@@ -2121,15 +2116,10 @@ class PHPExcel_Calculation
* Unset an instance of this class
*
* @access public
- * @param PHPExcel $workbook Injected workbook identifying the instance to unset
*/
- public static function unsetInstance(PHPExcel $workbook = null)
+ public function __destruct()
{
- if ($workbook !== null) {
- if (isset(self::$workbookSets[$workbook->getID()])) {
- unset(self::$workbookSets[$workbook->getID()]);
- }
- }
+ $this->workbook = null;
}
/**
diff --git a/Classes/PHPExcel/Calculation/Financial.php b/Classes/PHPExcel/Calculation/Financial.php
index 8865e56..fdf4894 100644
--- a/Classes/PHPExcel/Calculation/Financial.php
+++ b/Classes/PHPExcel/Calculation/Financial.php
@@ -2146,9 +2146,9 @@ class PHPExcel_Calculation_Financial
if ((!is_array($values)) && (!is_array($dates))) {
return PHPExcel_Calculation_Functions::VALUE();
}
- $values = PHPExcel_Calculation_Functions::flattenArray($values);
- $dates = PHPExcel_Calculation_Functions::flattenArray($dates);
- $guess = PHPExcel_Calculation_Functions::flattenSingleValue($guess);
+ $values = PHPExcel_Calculation_Functions::flattenArray($values);
+ $dates = PHPExcel_Calculation_Functions::flattenArray($dates);
+ $guess = PHPExcel_Calculation_Functions::flattenSingleValue($guess);
if (count($values) != count($dates)) {
return PHPExcel_Calculation_Functions::NaN();
}
diff --git a/Classes/PHPExcel/Calculation/Functions.php b/Classes/PHPExcel/Calculation/Functions.php
index 9e7a5db..5a1e5ee 100644
--- a/Classes/PHPExcel/Calculation/Functions.php
+++ b/Classes/PHPExcel/Calculation/Functions.php
@@ -555,10 +555,8 @@ class PHPExcel_Calculation_Functions
case 'float':
case 'integer':
return $value;
- break;
case 'boolean':
return (integer) $value;
- break;
case 'string':
// Errors
if ((strlen($value) > 0) && ($value{0} == '#')) {
diff --git a/Classes/PHPExcel/Calculation/MathTrig.php b/Classes/PHPExcel/Calculation/MathTrig.php
index dae2aa1..894ba9c 100644
--- a/Classes/PHPExcel/Calculation/MathTrig.php
+++ b/Classes/PHPExcel/Calculation/MathTrig.php
@@ -1220,6 +1220,66 @@ class PHPExcel_Calculation_MathTrig
}
+ /**
+ * SUMIFS
+ *
+ * Counts the number of cells that contain numbers within the list of arguments
+ *
+ * Excel Function:
+ * SUMIFS(value1[,value2[, ...]],condition)
+ *
+ * @access public
+ * @category Mathematical and Trigonometric Functions
+ * @param mixed $arg,... Data values
+ * @param string $condition The criteria that defines which cells will be summed.
+ * @return float
+ */
+ public static function SUMIFS() {
+ $arrayList = func_get_args();
+
+ $sumArgs = PHPExcel_Calculation_Functions::flattenArray(array_shift($arrayList));
+
+ while (count($arrayList) > 0) {
+ $aArgsArray[] = PHPExcel_Calculation_Functions::flattenArray(array_shift($arrayList));
+ $conditions[] = PHPExcel_Calculation_Functions::ifCondition(array_shift($arrayList));
+ }
+
+ // Loop through each set of arguments and conditions
+ foreach ($conditions as $index => $condition) {
+ $aArgs = $aArgsArray[$index];
+ $wildcard = false;
+ if ((strpos($condition, '*') !== false) || (strpos($condition, '?') !== false)) {
+ // * and ? are wildcard characters.
+ // Use ~* and ~? for literal star and question mark
+ // Code logic doesn't yet handle escaping
+ $condition = trim(ltrim($condition, '=<>'), '"');
+ $wildcard = true;
+ }
+ // Loop through arguments
+ foreach ($aArgs as $key => $arg) {
+ if ($wildcard) {
+ if (!fnmatch($condition, $arg, FNM_CASEFOLD)) {
+ // Is it a value within our criteria
+ $sumArgs[$key] = 0.0;
+ }
+ } else {
+ if (!is_numeric($arg)) {
+ $arg = PHPExcel_Calculation::wrapResult(strtoupper($arg));
+ }
+ $testCondition = '='.$arg.$condition;
+ if (!PHPExcel_Calculation::getInstance()->_calculateFormulaValue($testCondition)) {
+ // Is it a value within our criteria
+ $sumArgs[$key] = 0.0;
+ }
+ }
+ }
+ }
+
+ // Return
+ return array_sum($sumArgs);
+ }
+
+
/**
* SUMPRODUCT
*
diff --git a/Classes/PHPExcel/Reader/Excel2003XML.php b/Classes/PHPExcel/Reader/Excel2003XML.php
index fb1ebc0..c007f9b 100644
--- a/Classes/PHPExcel/Reader/Excel2003XML.php
+++ b/Classes/PHPExcel/Reader/Excel2003XML.php
@@ -401,11 +401,7 @@ class PHPExcel_Reader_Excel2003XML extends PHPExcel_Reader_Abstract implements P
$style_ss = $style->attributes($namespaces['ss']);
$styleID = (string) $style_ss['ID'];
// echo 'Style ID = '.$styleID.'
';
- if ($styleID == 'Default') {
- $this->styles['Default'] = array();
- } else {
- $this->styles[$styleID] = $this->styles['Default'];
- }
+ $this->styles[$styleID] = (isset($this->styles['Default'])) ? $this->styles['Default'] : array();
foreach ($style as $styleType => $styleData) {
$styleAttributes = $styleData->attributes($namespaces['ss']);
// echo $styleType.'
';
diff --git a/Classes/PHPExcel/Reader/Excel2007.php b/Classes/PHPExcel/Reader/Excel2007.php
index 5ab5a42..bf387a0 100644
--- a/Classes/PHPExcel/Reader/Excel2007.php
+++ b/Classes/PHPExcel/Reader/Excel2007.php
@@ -307,10 +307,17 @@ class PHPExcel_Reader_Excel2007 extends PHPExcel_Reader_Abstract implements PHPE
}
$fileName = PHPExcel_Shared_File::realpath($fileName);
+ // Sadly, some 3rd party xlsx generators don't use consistent case for filenaming
+ // so we need to load case-insensitively from the zip file
+
// Apache POI fixes
- $contents = $archive->getFromName($fileName);
+ $contents = $archive->getFromIndex(
+ $archive->locateName($fileName, ZIPARCHIVE::FL_NOCASE)
+ );
if ($contents === false) {
- $contents = $archive->getFromName(substr($fileName, 1));
+ $contents = $archive->getFromIndex(
+ $archive->locateName(substr($fileName, 1), ZIPARCHIVE::FL_NOCASE)
+ );
}
return $contents;
diff --git a/Classes/PHPExcel/Reader/Excel2007/Chart.php b/Classes/PHPExcel/Reader/Excel2007/Chart.php
index 88f336b..590bf2d 100644
--- a/Classes/PHPExcel/Reader/Excel2007/Chart.php
+++ b/Classes/PHPExcel/Reader/Excel2007/Chart.php
@@ -351,10 +351,6 @@ class PHPExcel_Reader_Excel2007_Chart
}
}
- if (empty($seriesVal)) {
- $seriesVal = null;
- }
-
return array(
'formatCode' => $formatCode,
'pointCount' => $pointCount,
diff --git a/Classes/PHPExcel/Reader/Excel5.php b/Classes/PHPExcel/Reader/Excel5.php
index ec22fe5..770d435 100644
--- a/Classes/PHPExcel/Reader/Excel5.php
+++ b/Classes/PHPExcel/Reader/Excel5.php
@@ -1753,7 +1753,7 @@ class PHPExcel_Reader_Excel5 extends PHPExcel_Reader_Abstract implements PHPExce
// move stream pointer to next record
$this->pos += 4 + $length;
-
+
if (!$this->verifyPassword('VelvetSweatshop', substr($recordData, 6, 16), substr($recordData, 22, 16), substr($recordData, 38, 16), $this->md5Ctxt)) {
throw new PHPExcel_Reader_Exception('Decryption password incorrect');
}
diff --git a/Classes/PHPExcel/Shared/CodePage.php b/Classes/PHPExcel/Shared/CodePage.php
index b9df3b4..b3e440e 100644
--- a/Classes/PHPExcel/Shared/CodePage.php
+++ b/Classes/PHPExcel/Shared/CodePage.php
@@ -116,18 +116,30 @@ class PHPExcel_Shared_CodePage
return 'CP950'; // Macintosh Chinese Traditional
case 10003:
return 'CP1361'; // Macintosh Korean
+ case 10004:
+ return 'MACARABIC'; // Apple Arabic
+ case 10005:
+ return 'MACHEBREW'; // Apple Hebrew
case 10006:
return 'MACGREEK'; // Macintosh Greek
case 10007:
return 'MACCYRILLIC'; // Macintosh Cyrillic
case 10008:
return 'CP936'; // Macintosh - Simplified Chinese (GB 2312)
+ case 10010:
+ return 'MACROMANIA'; // Macintosh Romania
+ case 10017:
+ return 'MACUKRAINE'; // Macintosh Ukraine
+ case 10021:
+ return 'MACTHAI'; // Macintosh Thai
case 10029:
return 'MACCENTRALEUROPE'; // Macintosh Central Europe
case 10079:
return 'MACICELAND'; // Macintosh Icelandic
case 10081:
return 'MACTURKISH'; // Macintosh Turkish
+ case 10082:
+ return 'MACCROATIAN'; // Macintosh Croatian
case 21010:
return 'UTF-16LE'; // UTF-16 (BIFF8) This isn't correct, but some Excel writer libraries erroneously use Codepage 21010 for UTF-16LE
case 32768:
diff --git a/Classes/PHPExcel/Shared/ZipArchive.php b/Classes/PHPExcel/Shared/ZipArchive.php
index 806a2fe..9eac8ca 100644
--- a/Classes/PHPExcel/Shared/ZipArchive.php
+++ b/Classes/PHPExcel/Shared/ZipArchive.php
@@ -107,17 +107,19 @@ class PHPExcel_Shared_ZipArchive
*/
public function locateName($fileName)
{
+ $fileName = strtolower($fileName);
+
$list = $this->zip->listContent();
$listCount = count($list);
- $list_index = -1;
+ $index = -1;
for ($i = 0; $i < $listCount; ++$i) {
- if (strtolower($list[$i]["filename"]) == strtolower($fileName) ||
- strtolower($list[$i]["stored_filename"]) == strtolower($fileName)) {
- $list_index = $i;
+ if (strtolower($list[$i]["filename"]) == $fileName ||
+ strtolower($list[$i]["stored_filename"]) == $fileName) {
+ $index = $i;
break;
}
}
- return ($list_index > -1);
+ return ($index > -1) ? $index : false;
}
/**
@@ -128,32 +130,30 @@ class PHPExcel_Shared_ZipArchive
*/
public function getFromName($fileName)
{
- $list = $this->zip->listContent();
- $listCount = count($list);
- $list_index = -1;
- for ($i = 0; $i < $listCount; ++$i) {
- if (strtolower($list[$i]["filename"]) == strtolower($fileName) ||
- strtolower($list[$i]["stored_filename"]) == strtolower($fileName)) {
- $list_index = $i;
- break;
+ $index = $this->locateName($fileName);
+
+ if ($index !== false) {
+ $extracted = $this->getFromIndex($index);
+ } else {
+ $fileName = substr($fileName, 1);
+ $index = $this->locateName($fileName);
+ if ($index === false) {
+ return false;
}
+ $extracted = $this->zip->getFromIndex($index);
}
- $extracted = "";
- if ($list_index != -1) {
- $extracted = $this->zip->extractByIndex($list_index, PCLZIP_OPT_EXTRACT_AS_STRING);
- } else {
- $filename = substr($fileName, 1);
- $list_index = -1;
- for ($i = 0; $i < $listCount; ++$i) {
- if (strtolower($list[$i]["filename"]) == strtolower($fileName) ||
- strtolower($list[$i]["stored_filename"]) == strtolower($fileName)) {
- $list_index = $i;
- break;
- }
- }
- $extracted = $this->zip->extractByIndex($list_index, PCLZIP_OPT_EXTRACT_AS_STRING);
+ $contents = $extracted;
+ if ((is_array($extracted)) && ($extracted != 0)) {
+ $contents = $extracted[0]["content"];
}
+
+ return $contents;
+ }
+
+ public function getFromIndex($index) {
+ $extracted = $this->zip->extractByIndex($index, PCLZIP_OPT_EXTRACT_AS_STRING);
+ $contents = '';
if ((is_array($extracted)) && ($extracted != 0)) {
$contents = $extracted[0]["content"];
}
diff --git a/Classes/PHPExcel/Worksheet.php b/Classes/PHPExcel/Worksheet.php
index 0f44c77..51470c3 100644
--- a/Classes/PHPExcel/Worksheet.php
+++ b/Classes/PHPExcel/Worksheet.php
@@ -861,10 +861,10 @@ class PHPExcel_Worksheet implements PHPExcel_IComparable
$this->title = $pValue;
$this->dirty = true;
- if ($this->parent) {
+ if ($this->parent && $this->parent->getCalculationEngine()) {
// New title
$newTitle = $this->getTitle();
- PHPExcel_Calculation::getInstance($this->parent)
+ $this->parent->getCalculationEngine()
->renameCalculationCacheForWorksheet($oldTitle, $newTitle);
if ($updateFormulaCellReferences) {
PHPExcel_ReferenceHelper::getInstance()->updateNamedFormulas($this->parent, $oldTitle, $newTitle);
diff --git a/Classes/PHPExcel/Worksheet/ColumnIterator.php b/Classes/PHPExcel/Worksheet/ColumnIterator.php
index 270bca6..0db3e53 100644
--- a/Classes/PHPExcel/Worksheet/ColumnIterator.php
+++ b/Classes/PHPExcel/Worksheet/ColumnIterator.php
@@ -85,11 +85,19 @@ class PHPExcel_Worksheet_ColumnIterator implements Iterator
*
* @param integer $startColumn The column address at which to start iterating
* @return PHPExcel_Worksheet_ColumnIterator
+ * @throws PHPExcel_Exception
*/
public function resetStart($startColumn = 'A')
{
$startColumnIndex = PHPExcel_Cell::columnIndexFromString($startColumn) - 1;
+ if ($startColumnIndex > PHPExcel_Cell::columnIndexFromString($this->subject->getHighestColumn()) - 1) {
+ throw new PHPExcel_Exception("Start column ({$startColumn}) is beyond highest column ({$this->subject->getHighestColumn()})");
+ }
+
$this->startColumn = $startColumnIndex;
+ if ($this->endColumn < $this->startColumn) {
+ $this->endColumn = $this->startColumn;
+ }
$this->seek($startColumn);
return $this;
diff --git a/Classes/PHPExcel/Worksheet/RowIterator.php b/Classes/PHPExcel/Worksheet/RowIterator.php
index 6c88d50..9ddb3e0 100644
--- a/Classes/PHPExcel/Worksheet/RowIterator.php
+++ b/Classes/PHPExcel/Worksheet/RowIterator.php
@@ -64,7 +64,7 @@ class PHPExcel_Worksheet_RowIterator implements Iterator
* @param integer $startRow The row number at which to start iterating
* @param integer $endRow Optionally, the row number at which to stop iterating
*/
- public function __construct(PHPExcel_Worksheet $subject = null, $startRow = 1, $endRow = null)
+ public function __construct(PHPExcel_Worksheet $subject, $startRow = 1, $endRow = null)
{
// Set subject
$this->subject = $subject;
@@ -85,10 +85,18 @@ class PHPExcel_Worksheet_RowIterator implements Iterator
*
* @param integer $startRow The row number at which to start iterating
* @return PHPExcel_Worksheet_RowIterator
+ * @throws PHPExcel_Exception
*/
public function resetStart($startRow = 1)
{
+ if ($startRow > $this->subject->getHighestRow()) {
+ throw new PHPExcel_Exception("Start row ({$startRow}) is beyond highest row ({$this->subject->getHighestRow()})");
+ }
+
$this->startRow = $startRow;
+ if ($this->endRow < $this->startRow) {
+ $this->endRow = $this->startRow;
+ }
$this->seek($startRow);
return $this;
diff --git a/Classes/PHPExcel/Writer/Excel2007.php b/Classes/PHPExcel/Writer/Excel2007.php
index 8f2eaa0..11d354b 100644
--- a/Classes/PHPExcel/Writer/Excel2007.php
+++ b/Classes/PHPExcel/Writer/Excel2007.php
@@ -297,7 +297,7 @@ class PHPExcel_Writer_Excel2007 extends PHPExcel_Writer_Abstract implements PHPE
$charts = $this->spreadSheet->getSheet($i)->getChartCollection();
if (count($charts) > 0) {
foreach ($charts as $chart) {
- $objZip->addFromString('xl/charts/chart' . ($chartCount + 1) . '.xml', $this->getWriterPart('Chart')->writeChart($chart));
+ $objZip->addFromString('xl/charts/chart' . ($chartCount + 1) . '.xml', $this->getWriterPart('Chart')->writeChart($chart, $this->preCalculateFormulas));
$chartCount++;
}
}
diff --git a/Classes/PHPExcel/Writer/Excel2007/Chart.php b/Classes/PHPExcel/Writer/Excel2007/Chart.php
index ebe0018..c0f86bf 100644
--- a/Classes/PHPExcel/Writer/Excel2007/Chart.php
+++ b/Classes/PHPExcel/Writer/Excel2007/Chart.php
@@ -27,6 +27,8 @@
*/
class PHPExcel_Writer_Excel2007_Chart extends PHPExcel_Writer_Excel2007_WriterPart
{
+ protected $calculateCellValues;
+
/**
* Write charts to XML format
*
@@ -35,8 +37,10 @@ class PHPExcel_Writer_Excel2007_Chart extends PHPExcel_Writer_Excel2007_WriterPa
* @return string XML Output
* @throws PHPExcel_Writer_Exception
*/
- public function writeChart(PHPExcel_Chart $pChart = null)
+ public function writeChart(PHPExcel_Chart $pChart = null, $calculateCellValues = true)
{
+ $this->calculateCellValues = $calculateCellValues;
+
// Create XML writer
$objWriter = null;
if ($this->getParentWriter()->getUseDiskCaching()) {
@@ -45,7 +49,9 @@ class PHPExcel_Writer_Excel2007_Chart extends PHPExcel_Writer_Excel2007_WriterPa
$objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_MEMORY);
}
// Ensure that data series values are up-to-date before we save
- $pChart->refresh();
+ if ($this->calculateCellValues) {
+ $pChart->refresh();
+ }
// XML header
$objWriter->startDocument('1.0', 'UTF-8', 'yes');
diff --git a/Classes/PHPExcel/Writer/Excel2007/Rels.php b/Classes/PHPExcel/Writer/Excel2007/Rels.php
index dd1faf9..14ff337 100644
--- a/Classes/PHPExcel/Writer/Excel2007/Rels.php
+++ b/Classes/PHPExcel/Writer/Excel2007/Rels.php
@@ -88,7 +88,7 @@ class PHPExcel_Writer_Excel2007_Rels extends PHPExcel_Writer_Excel2007_WriterPar
);
// a custom UI in workbook ?
if ($pPHPExcel->hasRibbon()) {
- $this->_writeRelationShip(
+ $this->writeRelationShip(
$objWriter,
5,
'http://schemas.microsoft.com/office/2006/relationships/ui/extensibility',
@@ -162,7 +162,7 @@ class PHPExcel_Writer_Excel2007_Rels extends PHPExcel_Writer_Excel2007_WriterPar
// Relationships for vbaProject if needed
// id : just after the last sheet
if ($pPHPExcel->hasMacros()) {
- $this->_writeRelationShip(
+ $this->writeRelationShip(
$objWriter,
($i + 1 + 3),
'http://schemas.microsoft.com/office/2006/relationships/vbaProject',
diff --git a/Examples/.gitignore b/Examples/.gitignore
index 1888a98..d53fd7f 100644
--- a/Examples/.gitignore
+++ b/Examples/.gitignore
@@ -1,3 +1,5 @@
-
*.xls
-*.xlsx
\ No newline at end of file
+*.xlsx
+*.csv
+*.jpg
+*.pdf
diff --git a/Examples/01simple.php b/Examples/01simple.php
index 5e1912b..e9671be 100644
--- a/Examples/01simple.php
+++ b/Examples/01simple.php
@@ -71,6 +71,14 @@ $objPHPExcel->getActiveSheet()->getRowDimension(8)->setRowHeight(-1);
$objPHPExcel->getActiveSheet()->getStyle('A8')->getAlignment()->setWrapText(true);
+$value = "-ValueA\n-Value B\n-Value C";
+$objPHPExcel->getActiveSheet()->setCellValue('A10', $value);
+$objPHPExcel->getActiveSheet()->getRowDimension(10)->setRowHeight(-1);
+$objPHPExcel->getActiveSheet()->getStyle('A10')->getAlignment()->setWrapText(true);
+$objPHPExcel->getActiveSheet()->getStyle('A10')->setQuotePrefix(true);
+
+
+
// Rename worksheet
echo date('H:i:s') , " Rename worksheet" , EOL;
$objPHPExcel->getActiveSheet()->setTitle('Simple');
diff --git a/Examples/28iterator.php b/Examples/28iterator.php
index 92c4192..1ba9cbe 100644
--- a/Examples/28iterator.php
+++ b/Examples/28iterator.php
@@ -38,15 +38,11 @@ date_default_timezone_set('Europe/London');
require_once dirname(__FILE__) . '/../Classes/PHPExcel/IOFactory.php';
-if (!file_exists("05featuredemo.xlsx")) {
- exit("Please run 05featuredemo.php first." . EOL);
-}
-
echo date('H:i:s') , " Load from Excel2007 file" , EOL;
$objReader = PHPExcel_IOFactory::createReader('Excel2007');
-$objPHPExcel = $objReader->load("05featuredemo.xlsx");
+$objPHPExcel = $objReader->load("./templates/28iterators.xlsx");
-echo date('H:i:s') , " Iterate worksheets" , EOL;
+echo date('H:i:s') , " Iterate worksheets by Row" , EOL;
foreach ($objPHPExcel->getWorksheetIterator() as $worksheet) {
echo 'Worksheet - ' , $worksheet->getTitle() , EOL;
@@ -64,5 +60,23 @@ foreach ($objPHPExcel->getWorksheetIterator() as $worksheet) {
}
+echo date('H:i:s') , " Iterate worksheets by Column" , EOL;
+foreach ($objPHPExcel->getWorksheetIterator() as $worksheet) {
+ echo 'Worksheet - ' , $worksheet->getTitle() , EOL;
+
+ foreach ($worksheet->getColumnIterator() as $column) {
+ echo ' Column index - ' , $column->getColumnIndex() , EOL;
+
+ $cellIterator = $column->getCellIterator();
+ $cellIterator->setIterateOnlyExistingCells(true); // Loop all cells, even if it is not set
+ foreach ($cellIterator as $cell) {
+ if (!is_null($cell)) {
+ echo ' Cell - ' , $cell->getCoordinate() , ' - ' , $cell->getCalculatedValue() , EOL;
+ }
+ }
+ }
+}
+
+
// Echo memory peak usage
echo date('H:i:s') , " Peak memory usage: " , (memory_get_peak_usage(true) / 1024 / 1024) , " MB" , EOL;
diff --git a/changelog.txt b/changelog.txt
index eaefe2a..4d1605b 100644
--- a/changelog.txt
+++ b/changelog.txt
@@ -26,8 +26,11 @@
Planned for 1.8.2
- Bugfix: (MBaker) - Fix to getCell() method when cell reference includes a worksheet reference
- Bugfix: (ncrypthic) Work Item GH-570 - Ignore inlineStr type if formula element exists
+- Bugfix: (hernst42) Work Item GH-709 - Fixed missing renames of writeRelationShip (from _writeRelationShip)
- General: (umpirsky) Work Item GH-548 - Optimize vlookup() sort
- Bugfix: (MBaker) Work Item GH-554 - Whitespace after toRichTextObject()
+- Feature: (MBaker) - Initial implementation of SUMIFS() function
+- Feature: (MBaker) - Additional codepages
2015-04-30 (v1.8.1):
@@ -68,8 +71,7 @@ Planned for 1.8.2
(see http://projects.webappsec.org/w/page/13247002/XML%20Entity%20Expansion for an explanation of XEE injection) attacks
Reference CVE-2015-3542 - Identification of problem courtesy of Dawid Golunski (Pentest Ltd.)
-
- 2014-03-02 (v1.8.0):
+2014-03-02 (v1.8.0):
- Bugfix: (MBaker) Work item CP19830 - Undefined variable: fileHandle in CSV Reader
- Bugfix: (MBaker) Work item CP19968 - Out of memory in style/supervisor.php
- Bugfix: (MBaker) - Style error with merged cells in PDF Writer
diff --git a/composer.json b/composer.json
index 188f3af..81e83e7 100644
--- a/composer.json
+++ b/composer.json
@@ -22,7 +22,7 @@
}
],
"require": {
- "php": ">=5.2.0",
+ "php": "^5.2|^7.0",
"ext-mbstring": "*",
"ext-xml": "*",
"ext-xmlwriter": "*"
diff --git a/unitTests/Classes/PHPExcel/Calculation/MathTrigTest.php b/unitTests/Classes/PHPExcel/Calculation/MathTrigTest.php
index 40d1c50..2f2bc2b 100644
--- a/unitTests/Classes/PHPExcel/Calculation/MathTrigTest.php
+++ b/unitTests/Classes/PHPExcel/Calculation/MathTrigTest.php
@@ -418,6 +418,22 @@ class MathTrigTest extends PHPUnit_Framework_TestCase
return new testDataFileIterator('rawTestData/Calculation/MathTrig/SERIESSUM.data');
}
+ /**
+ * @dataProvider providerSUMIFS
+ */
+ public function testSUMIFS()
+ {
+ $args = func_get_args();
+ $expectedResult = array_pop($args);
+ $result = call_user_func_array(array('PHPExcel_Calculation_MathTrig','SUMIFS'), $args);
+ $this->assertEquals($expectedResult, $result, null, 1E-12);
+ }
+
+ public function providerSUMIFS()
+ {
+ return new testDataFileIterator('rawTestData/Calculation/MathTrig/SUMIFS.data');
+ }
+
/**
* @dataProvider providerSUMSQ
*/
diff --git a/unitTests/Classes/PHPExcel/Worksheet/ColumnIteratorTest.php b/unitTests/Classes/PHPExcel/Worksheet/ColumnIteratorTest.php
index e013210..20108e8 100644
--- a/unitTests/Classes/PHPExcel/Worksheet/ColumnIteratorTest.php
+++ b/unitTests/Classes/PHPExcel/Worksheet/ColumnIteratorTest.php
@@ -68,6 +68,14 @@ class ColumnIteratorTest extends PHPUnit_Framework_TestCase
}
}
+ /**
+ * @expectedException PHPExcel_Exception
+ */
+ public function testStartOutOfRange()
+ {
+ $iterator = new PHPExcel_Worksheet_ColumnIterator($this->mockWorksheet, 'IA', 'IV');
+ }
+
/**
* @expectedException PHPExcel_Exception
*/
diff --git a/unitTests/Classes/PHPExcel/Worksheet/RowIteratorTest.php b/unitTests/Classes/PHPExcel/Worksheet/RowIteratorTest.php
index ec0b279..346941c 100644
--- a/unitTests/Classes/PHPExcel/Worksheet/RowIteratorTest.php
+++ b/unitTests/Classes/PHPExcel/Worksheet/RowIteratorTest.php
@@ -56,16 +56,24 @@ class RowIteratorTest extends PHPUnit_Framework_TestCase
public function testIteratorSeekAndPrev()
{
$iterator = new PHPExcel_Worksheet_RowIterator($this->mockWorksheet, 2, 4);
- $columnIndexResult = 4;
- $iterator->seek(4);
- $this->assertEquals($columnIndexResult, $iterator->key());
+ $rowIndexResult = 4;
+ $iterator->seek($rowIndexResult);
+ $this->assertEquals($rowIndexResult, $iterator->key());
- for ($i = 1; $i < $columnIndexResult-1; $i++) {
+ for ($i = 1; $i < $rowIndexResult-1; $i++) {
$iterator->prev();
- $this->assertEquals($columnIndexResult - $i, $iterator->key());
+ $this->assertEquals($rowIndexResult - $i, $iterator->key());
}
}
+ /**
+ * @expectedException PHPExcel_Exception
+ */
+ public function testStartOutOfRange()
+ {
+ $iterator = new PHPExcel_Worksheet_RowIterator($this->mockWorksheet, 256, 512);
+ }
+
/**
* @expectedException PHPExcel_Exception
*/
diff --git a/unitTests/rawTestData/Calculation/MathTrig/SUMIFS.data b/unitTests/rawTestData/Calculation/MathTrig/SUMIFS.data
new file mode 100644
index 0000000..8d85945
--- /dev/null
+++ b/unitTests/rawTestData/Calculation/MathTrig/SUMIFS.data
@@ -0,0 +1,6 @@
+{12.25;10.5;5.1;8.35;13.45;7.95;6;4.55}, {2013;2012;2012;2013;2013;2011;2013;2009}, "=2013", 40.05
+{12.25;10.5;5.1;8.35;13.45;7.95;6;4.55}, {"Oranges";"Bananas";"Apples";"Bananas";"Oranges";"Apples";"Pears";"Oranges"}, "=Oranges", 30.25
+{12.25;10.5;5.1;8.35;13.45;7.95;6;4.55}, {2013;2012;2012;2013;2013;2011;2013;2009}, "=2013", {"Oranges";"Bananas";"Apples";"Bananas";"Oranges";"Apples";"Pears";"Oranges"}, "=Oranges", 25.7
+{12.25;10.5;5.1;8.35;13.45;7.95;6;4.55}, {2013;2012;2012;2013;2013;2011;2013;2009}, ">=2009", {"Oranges";"Bananas";"Apples";"Bananas";"Oranges";"Apples";"Pears";"Oranges"}, "=Oranges", {2013;2012;2012;2013;2013;2011;2013;2009}, "<=2012", 4.55
+{12.25;10.5;5.1;8.35;13.45;7.95;6;4.55}, {2013;2012;2012;2013;2013;2011;2013;2009}, ">=2009", {"Oranges";"Bananas";"Apples";"Bananas";"Oranges";"Apples";"Pears";"Oranges"}, "=B*", 18.85
+{12.25;10.5;5.1;8.35;13.45;7.95;6;4.55}, {2013;2012;2012;2013;2013;2011;2013;2009}, ">=2009", {"Oranges";"Bananas";"Apples";"Bananas";"Oranges";"Apples";"Pears";"Oranges"}, "=B?nanas", 18.85