Completed
Push — master ( 2adc2b...82365f )
by Reginaldo
22:34
created
app/Vendor/PHPExcel/PHPExcel/Reader/Excel5.php 1 patch
Switch Indentation   +890 added lines, -890 removed lines patch added patch discarded remove patch
@@ -969,55 +969,55 @@  discard block
 block discarded – undo
969 969
 
970 970
 				switch ($obj['otObjType']) {
971 971
 
972
-				case 0x19:
973
-					// Note
974
-//					echo 'Cell Annotation Object<br />';
975
-//					echo 'Object ID is ',$obj['idObjID'],'<br />';
976
-//
977
-					if (isset($this->_cellNotes[$obj['idObjID']])) {
978
-						$cellNote = $this->_cellNotes[$obj['idObjID']];
979
-
980
-//						echo '_cellNotes[',$obj['idObjID'],']: ';
981
-//						var_dump($cellNote);
982
-//						echo '<br />';
983
-//
984
-						if (isset($this->_textObjects[$obj['idObjID']])) {
985
-							$textObject = $this->_textObjects[$obj['idObjID']];
986
-//							echo '_textObject: ';
987
-//							var_dump($textObject);
988
-//							echo '<br />';
989
-//
990
-							$this->_cellNotes[$obj['idObjID']]['objTextData'] = $textObject;
991
-							$text = $textObject['text'];
972
+					case 0x19:
973
+						// Note
974
+	//					echo 'Cell Annotation Object<br />';
975
+	//					echo 'Object ID is ',$obj['idObjID'],'<br />';
976
+	//
977
+						if (isset($this->_cellNotes[$obj['idObjID']])) {
978
+							$cellNote = $this->_cellNotes[$obj['idObjID']];
979
+
980
+	//						echo '_cellNotes[',$obj['idObjID'],']: ';
981
+	//						var_dump($cellNote);
982
+	//						echo '<br />';
983
+	//
984
+							if (isset($this->_textObjects[$obj['idObjID']])) {
985
+								$textObject = $this->_textObjects[$obj['idObjID']];
986
+	//							echo '_textObject: ';
987
+	//							var_dump($textObject);
988
+	//							echo '<br />';
989
+	//
990
+								$this->_cellNotes[$obj['idObjID']]['objTextData'] = $textObject;
991
+								$text = $textObject['text'];
992
+							}
993
+	//						echo $text,'<br />';
992 994
 						}
993
-//						echo $text,'<br />';
994
-					}
995
-					break;
995
+						break;
996 996
 
997
-				case 0x08:
998
-//					echo 'Picture Object<br />';
999
-					// picture
1000
-
1001
-					// get index to BSE entry (1-based)
1002
-					$BSEindex = $spContainer->getOPT(0x0104);
1003
-					$BSECollection = $escherWorkbook->getDggContainer()->getBstoreContainer()->getBSECollection();
1004
-					$BSE = $BSECollection[$BSEindex - 1];
1005
-					$blipType = $BSE->getBlipType();
1006
-
1007
-					// need check because some blip types are not supported by Escher reader such as EMF
1008
-					if ($blip = $BSE->getBlip()) {
1009
-						$ih = imagecreatefromstring($blip->getData());
1010
-						$drawing = new PHPExcel_Worksheet_MemoryDrawing();
1011
-						$drawing->setImageResource($ih);
1012
-
1013
-						// width, height, offsetX, offsetY
1014
-						$drawing->setResizeProportional(false);
1015
-						$drawing->setWidth($width);
1016
-						$drawing->setHeight($height);
1017
-						$drawing->setOffsetX($offsetX);
1018
-						$drawing->setOffsetY($offsetY);
1019
-
1020
-						switch ($blipType) {
997
+					case 0x08:
998
+	//					echo 'Picture Object<br />';
999
+						// picture
1000
+
1001
+						// get index to BSE entry (1-based)
1002
+						$BSEindex = $spContainer->getOPT(0x0104);
1003
+						$BSECollection = $escherWorkbook->getDggContainer()->getBstoreContainer()->getBSECollection();
1004
+						$BSE = $BSECollection[$BSEindex - 1];
1005
+						$blipType = $BSE->getBlipType();
1006
+
1007
+						// need check because some blip types are not supported by Escher reader such as EMF
1008
+						if ($blip = $BSE->getBlip()) {
1009
+							$ih = imagecreatefromstring($blip->getData());
1010
+							$drawing = new PHPExcel_Worksheet_MemoryDrawing();
1011
+							$drawing->setImageResource($ih);
1012
+
1013
+							// width, height, offsetX, offsetY
1014
+							$drawing->setResizeProportional(false);
1015
+							$drawing->setWidth($width);
1016
+							$drawing->setHeight($height);
1017
+							$drawing->setOffsetX($offsetX);
1018
+							$drawing->setOffsetY($offsetY);
1019
+
1020
+							switch ($blipType) {
1021 1021
 							case PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE::BLIPTYPE_JPEG:
1022 1022
 								$drawing->setRenderingFunction(PHPExcel_Worksheet_MemoryDrawing::RENDERING_JPEG);
1023 1023
 								$drawing->setMimeType(PHPExcel_Worksheet_MemoryDrawing::MIMETYPE_JPEG);
@@ -1027,7 +1027,7 @@  discard block
 block discarded – undo
1027 1027
 								$drawing->setRenderingFunction(PHPExcel_Worksheet_MemoryDrawing::RENDERING_PNG);
1028 1028
 								$drawing->setMimeType(PHPExcel_Worksheet_MemoryDrawing::MIMETYPE_PNG);
1029 1029
 								break;
1030
-						}
1030
+							}
1031 1031
 
1032 1032
 						$drawing->setWorksheet($this->_phpSheet);
1033 1033
 						$drawing->setCoordinates($spContainer->getStartCoordinates());
@@ -1035,9 +1035,9 @@  discard block
 block discarded – undo
1035 1035
 
1036 1036
 					break;
1037 1037
 
1038
-				default:
1039
-					// other object type
1040
-					break;
1038
+					default:
1039
+						// other object type
1040
+						break;
1041 1041
 
1042 1042
 				}
1043 1043
 			}
@@ -1071,74 +1071,74 @@  discard block
 block discarded – undo
1071 1071
 			if ($definedName['isBuiltInName']) {
1072 1072
 				switch ($definedName['name']) {
1073 1073
 
1074
-				case pack('C', 0x06):
1075
-					// print area
1076
-					//	in general, formula looks like this: Foo!$C$7:$J$66,Bar!$A$1:$IV$2
1074
+					case pack('C', 0x06):
1075
+						// print area
1076
+						//	in general, formula looks like this: Foo!$C$7:$J$66,Bar!$A$1:$IV$2
1077 1077
 
1078
-					$ranges = explode(',', $definedName['formula']); // FIXME: what if sheetname contains comma?
1078
+						$ranges = explode(',', $definedName['formula']); // FIXME: what if sheetname contains comma?
1079 1079
 
1080
-					$extractedRanges = array();
1081
-					foreach ($ranges as $range) {
1082
-						// $range should look like one of these
1083
-						//		Foo!$C$7:$J$66
1084
-						//		Bar!$A$1:$IV$2
1080
+						$extractedRanges = array();
1081
+						foreach ($ranges as $range) {
1082
+							// $range should look like one of these
1083
+							//		Foo!$C$7:$J$66
1084
+							//		Bar!$A$1:$IV$2
1085 1085
 
1086
-						$explodes = explode('!', $range);	// FIXME: what if sheetname contains exclamation mark?
1087
-						$sheetName = $explodes[0];
1086
+							$explodes = explode('!', $range);	// FIXME: what if sheetname contains exclamation mark?
1087
+							$sheetName = $explodes[0];
1088 1088
 
1089
-						if (count($explodes) == 2) {
1090
-							$extractedRanges[] = str_replace('$', '', $explodes[1]); // C7:J66
1089
+							if (count($explodes) == 2) {
1090
+								$extractedRanges[] = str_replace('$', '', $explodes[1]); // C7:J66
1091
+							}
1091 1092
 						}
1092
-					}
1093
-					if ($docSheet = $this->_phpExcel->getSheetByName($sheetName)) {
1094
-						$docSheet->getPageSetup()->setPrintArea(implode(',', $extractedRanges)); // C7:J66,A1:IV2
1095
-					}
1096
-					break;
1093
+						if ($docSheet = $this->_phpExcel->getSheetByName($sheetName)) {
1094
+							$docSheet->getPageSetup()->setPrintArea(implode(',', $extractedRanges)); // C7:J66,A1:IV2
1095
+						}
1096
+						break;
1097 1097
 
1098
-				case pack('C', 0x07):
1099
-					// print titles (repeating rows)
1100
-					// Assuming BIFF8, there are 3 cases
1101
-					// 1. repeating rows
1102
-					//		formula looks like this: Sheet!$A$1:$IV$2
1103
-					//		rows 1-2 repeat
1104
-					// 2. repeating columns
1105
-					//		formula looks like this: Sheet!$A$1:$B$65536
1106
-					//		columns A-B repeat
1107
-					// 3. both repeating rows and repeating columns
1108
-					//		formula looks like this: Sheet!$A$1:$B$65536,Sheet!$A$1:$IV$2
1109
-
1110
-					$ranges = explode(',', $definedName['formula']); // FIXME: what if sheetname contains comma?
1111
-
1112
-					foreach ($ranges as $range) {
1113
-						// $range should look like this one of these
1114
-						//		Sheet!$A$1:$B$65536
1115
-						//		Sheet!$A$1:$IV$2
1116
-
1117
-						$explodes = explode('!', $range);
1118
-
1119
-						if (count($explodes) == 2) {
1120
-							if ($docSheet = $this->_phpExcel->getSheetByName($explodes[0])) {
1121
-
1122
-								$extractedRange = $explodes[1];
1123
-								$extractedRange = str_replace('$', '', $extractedRange);
1124
-
1125
-								$coordinateStrings = explode(':', $extractedRange);
1126
-								if (count($coordinateStrings) == 2) {
1127
-									list($firstColumn, $firstRow) = PHPExcel_Cell::coordinateFromString($coordinateStrings[0]);
1128
-									list($lastColumn, $lastRow) = PHPExcel_Cell::coordinateFromString($coordinateStrings[1]);
1129
-
1130
-									if ($firstColumn == 'A' and $lastColumn == 'IV') {
1131
-										// then we have repeating rows
1132
-										$docSheet->getPageSetup()->setRowsToRepeatAtTop(array($firstRow, $lastRow));
1133
-									} elseif ($firstRow == 1 and $lastRow == 65536) {
1134
-										// then we have repeating columns
1135
-										$docSheet->getPageSetup()->setColumnsToRepeatAtLeft(array($firstColumn, $lastColumn));
1098
+					case pack('C', 0x07):
1099
+						// print titles (repeating rows)
1100
+						// Assuming BIFF8, there are 3 cases
1101
+						// 1. repeating rows
1102
+						//		formula looks like this: Sheet!$A$1:$IV$2
1103
+						//		rows 1-2 repeat
1104
+						// 2. repeating columns
1105
+						//		formula looks like this: Sheet!$A$1:$B$65536
1106
+						//		columns A-B repeat
1107
+						// 3. both repeating rows and repeating columns
1108
+						//		formula looks like this: Sheet!$A$1:$B$65536,Sheet!$A$1:$IV$2
1109
+
1110
+						$ranges = explode(',', $definedName['formula']); // FIXME: what if sheetname contains comma?
1111
+
1112
+						foreach ($ranges as $range) {
1113
+							// $range should look like this one of these
1114
+							//		Sheet!$A$1:$B$65536
1115
+							//		Sheet!$A$1:$IV$2
1116
+
1117
+							$explodes = explode('!', $range);
1118
+
1119
+							if (count($explodes) == 2) {
1120
+								if ($docSheet = $this->_phpExcel->getSheetByName($explodes[0])) {
1121
+
1122
+									$extractedRange = $explodes[1];
1123
+									$extractedRange = str_replace('$', '', $extractedRange);
1124
+
1125
+									$coordinateStrings = explode(':', $extractedRange);
1126
+									if (count($coordinateStrings) == 2) {
1127
+										list($firstColumn, $firstRow) = PHPExcel_Cell::coordinateFromString($coordinateStrings[0]);
1128
+										list($lastColumn, $lastRow) = PHPExcel_Cell::coordinateFromString($coordinateStrings[1]);
1129
+
1130
+										if ($firstColumn == 'A' and $lastColumn == 'IV') {
1131
+											// then we have repeating rows
1132
+											$docSheet->getPageSetup()->setRowsToRepeatAtTop(array($firstRow, $lastRow));
1133
+										} elseif ($firstRow == 1 and $lastRow == 65536) {
1134
+											// then we have repeating columns
1135
+											$docSheet->getPageSetup()->setColumnsToRepeatAtLeft(array($firstColumn, $lastColumn));
1136
+										}
1136 1137
 									}
1137 1138
 								}
1138 1139
 							}
1139 1140
 						}
1140
-					}
1141
-					break;
1141
+						break;
1142 1142
 
1143 1143
 				}
1144 1144
 			} else {
@@ -2368,12 +2368,12 @@  discard block
 block discarded – undo
2368 2368
 				$builtInId = ord($recordData{2});
2369 2369
 
2370 2370
 				switch ($builtInId) {
2371
-				case 0x00:
2372
-					// currently, we are not using this for anything
2373
-					break;
2371
+					case 0x00:
2372
+						// currently, we are not using this for anything
2373
+						break;
2374 2374
 
2375
-				default:
2376
-					break;
2375
+					default:
2376
+						break;
2377 2377
 				}
2378 2378
 
2379 2379
 			} else {
@@ -3181,8 +3181,8 @@  discard block
 block discarded – undo
3181 3181
 			if (!$isNotInit) {
3182 3182
 				$this->_phpSheet->getPageSetup()->setPaperSize($paperSize);
3183 3183
 				switch ($isPortrait) {
3184
-				case 0: $this->_phpSheet->getPageSetup()->setOrientation(PHPExcel_Worksheet_PageSetup::ORIENTATION_LANDSCAPE); break;
3185
-				case 1: $this->_phpSheet->getPageSetup()->setOrientation(PHPExcel_Worksheet_PageSetup::ORIENTATION_PORTRAIT); break;
3184
+					case 0: $this->_phpSheet->getPageSetup()->setOrientation(PHPExcel_Worksheet_PageSetup::ORIENTATION_LANDSCAPE); break;
3185
+					case 1: $this->_phpSheet->getPageSetup()->setOrientation(PHPExcel_Worksheet_PageSetup::ORIENTATION_PORTRAIT); break;
3186 3186
 				}
3187 3187
 
3188 3188
 				$this->_phpSheet->getPageSetup()->setScale($scale, false);
@@ -4356,90 +4356,90 @@  discard block
 block discarded – undo
4356 4356
 			}
4357 4357
 
4358 4358
 			switch ($hyperlinkType) {
4359
-			case 'URL':
4360
-				// section 5.58.2: Hyperlink containing a URL
4361
-				// e.g. http://example.org/index.php
4362
-
4363
-				// offset: var; size: 16; GUID of URL Moniker
4364
-				$offset += 16;
4365
-				// offset: var; size: 4; size (in bytes) of character array of the URL including trailing zero word
4366
-				$us = self::_GetInt4d($recordData, $offset);
4367
-				$offset += 4;
4368
-				// offset: var; size: $us; character array of the URL, no Unicode string header, always 16-bit characters, zero-terminated
4369
-				$url = self::_encodeUTF16(substr($recordData, $offset, $us - 2), false);
4370
-				$url .= $hasText ? '#' : '';
4371
-				$offset += $us;
4372
-				break;
4373
-
4374
-			case 'local':
4375
-				// section 5.58.3: Hyperlink to local file
4376
-				// examples:
4377
-				//   mydoc.txt
4378
-				//   ../../somedoc.xls#Sheet!A1
4359
+				case 'URL':
4360
+					// section 5.58.2: Hyperlink containing a URL
4361
+					// e.g. http://example.org/index.php
4362
+
4363
+					// offset: var; size: 16; GUID of URL Moniker
4364
+					$offset += 16;
4365
+					// offset: var; size: 4; size (in bytes) of character array of the URL including trailing zero word
4366
+					$us = self::_GetInt4d($recordData, $offset);
4367
+					$offset += 4;
4368
+					// offset: var; size: $us; character array of the URL, no Unicode string header, always 16-bit characters, zero-terminated
4369
+					$url = self::_encodeUTF16(substr($recordData, $offset, $us - 2), false);
4370
+					$url .= $hasText ? '#' : '';
4371
+					$offset += $us;
4372
+					break;
4379 4373
 
4380
-				// offset: var; size: 16; GUI of File Moniker
4381
-				$offset += 16;
4374
+				case 'local':
4375
+					// section 5.58.3: Hyperlink to local file
4376
+					// examples:
4377
+					//   mydoc.txt
4378
+					//   ../../somedoc.xls#Sheet!A1
4382 4379
 
4383
-				// offset: var; size: 2; directory up-level count.
4384
-				$upLevelCount = self::_GetInt2d($recordData, $offset);
4385
-				$offset += 2;
4380
+					// offset: var; size: 16; GUI of File Moniker
4381
+					$offset += 16;
4386 4382
 
4387
-				// offset: var; size: 4; character count of the shortened file path and name, including trailing zero word
4388
-				$sl = self::_GetInt4d($recordData, $offset);
4389
-				$offset += 4;
4383
+					// offset: var; size: 2; directory up-level count.
4384
+					$upLevelCount = self::_GetInt2d($recordData, $offset);
4385
+					$offset += 2;
4390 4386
 
4391
-				// offset: var; size: sl; character array of the shortened file path and name in 8.3-DOS-format (compressed Unicode string)
4392
-				$shortenedFilePath = substr($recordData, $offset, $sl);
4393
-				$shortenedFilePath = self::_encodeUTF16($shortenedFilePath, true);
4394
-				$shortenedFilePath = substr($shortenedFilePath, 0, -1); // remove trailing zero
4387
+					// offset: var; size: 4; character count of the shortened file path and name, including trailing zero word
4388
+					$sl = self::_GetInt4d($recordData, $offset);
4389
+					$offset += 4;
4395 4390
 
4396
-				$offset += $sl;
4391
+					// offset: var; size: sl; character array of the shortened file path and name in 8.3-DOS-format (compressed Unicode string)
4392
+					$shortenedFilePath = substr($recordData, $offset, $sl);
4393
+					$shortenedFilePath = self::_encodeUTF16($shortenedFilePath, true);
4394
+					$shortenedFilePath = substr($shortenedFilePath, 0, -1); // remove trailing zero
4397 4395
 
4398
-				// offset: var; size: 24; unknown sequence
4399
-				$offset += 24;
4396
+					$offset += $sl;
4400 4397
 
4401
-				// extended file path
4402
-				// offset: var; size: 4; size of the following file link field including string lenth mark
4403
-				$sz = self::_GetInt4d($recordData, $offset);
4404
-				$offset += 4;
4398
+					// offset: var; size: 24; unknown sequence
4399
+					$offset += 24;
4405 4400
 
4406
-				// only present if $sz > 0
4407
-				if ($sz > 0) {
4408
-					// offset: var; size: 4; size of the character array of the extended file path and name
4409
-					$xl = self::_GetInt4d($recordData, $offset);
4401
+					// extended file path
4402
+					// offset: var; size: 4; size of the following file link field including string lenth mark
4403
+					$sz = self::_GetInt4d($recordData, $offset);
4410 4404
 					$offset += 4;
4411 4405
 
4412
-					// offset: var; size 2; unknown
4413
-					$offset += 2;
4406
+					// only present if $sz > 0
4407
+					if ($sz > 0) {
4408
+						// offset: var; size: 4; size of the character array of the extended file path and name
4409
+						$xl = self::_GetInt4d($recordData, $offset);
4410
+						$offset += 4;
4414 4411
 
4415
-					// offset: var; size $xl; character array of the extended file path and name.
4416
-					$extendedFilePath = substr($recordData, $offset, $xl);
4417
-					$extendedFilePath = self::_encodeUTF16($extendedFilePath, false);
4418
-					$offset += $xl;
4419
-				}
4412
+						// offset: var; size 2; unknown
4413
+						$offset += 2;
4420 4414
 
4421
-				// construct the path
4422
-				$url = str_repeat('..\\', $upLevelCount);
4423
-				$url .= ($sz > 0) ?
4424
-					$extendedFilePath : $shortenedFilePath; // use extended path if available
4425
-				$url .= $hasText ? '#' : '';
4415
+						// offset: var; size $xl; character array of the extended file path and name.
4416
+						$extendedFilePath = substr($recordData, $offset, $xl);
4417
+						$extendedFilePath = self::_encodeUTF16($extendedFilePath, false);
4418
+						$offset += $xl;
4419
+					}
4426 4420
 
4427
-				break;
4421
+					// construct the path
4422
+					$url = str_repeat('..\\', $upLevelCount);
4423
+					$url .= ($sz > 0) ?
4424
+						$extendedFilePath : $shortenedFilePath; // use extended path if available
4425
+					$url .= $hasText ? '#' : '';
4428 4426
 
4427
+					break;
4429 4428
 
4430
-			case 'UNC':
4431
-				// section 5.58.4: Hyperlink to a File with UNC (Universal Naming Convention) Path
4432
-				// todo: implement
4433
-				return;
4434 4429
 
4435
-			case 'workbook':
4436
-				// section 5.58.5: Hyperlink to the Current Workbook
4437
-				// e.g. Sheet2!B1:C2, stored in text mark field
4438
-				$url = 'sheet://';
4439
-				break;
4430
+				case 'UNC':
4431
+					// section 5.58.4: Hyperlink to a File with UNC (Universal Naming Convention) Path
4432
+					// todo: implement
4433
+					return;
4440 4434
 
4441
-			default:
4442
-				return;
4435
+				case 'workbook':
4436
+					// section 5.58.5: Hyperlink to the Current Workbook
4437
+					// e.g. Sheet2!B1:C2, stored in text mark field
4438
+					$url = 'sheet://';
4439
+					break;
4440
+
4441
+				default:
4442
+					return;
4443 4443
 
4444 4444
 			}
4445 4445
 
@@ -4861,54 +4861,54 @@  discard block
 block discarded – undo
4861 4861
 		$iData = substr($recordData, 8);
4862 4862
 
4863 4863
 		switch ($cf) {
4864
-		case 0x09: // Windows bitmap format
4865
-			// BITMAPCOREINFO
4866
-			// 1. BITMAPCOREHEADER
4867
-			// offset: 0; size: 4; bcSize, Specifies the number of bytes required by the structure
4868
-			$bcSize = self::_GetInt4d($iData, 0);
4869
-//			var_dump($bcSize);
4870
-
4871
-			// offset: 4; size: 2; bcWidth, specifies the width of the bitmap, in pixels
4872
-			$bcWidth = self::_GetInt2d($iData, 4);
4873
-//			var_dump($bcWidth);
4874
-
4875
-			// offset: 6; size: 2; bcHeight, specifies the height of the bitmap, in pixels.
4876
-			$bcHeight = self::_GetInt2d($iData, 6);
4877
-//			var_dump($bcHeight);
4878
-			$ih = imagecreatetruecolor($bcWidth, $bcHeight);
4879
-
4880
-			// offset: 8; size: 2; bcPlanes, specifies the number of planes for the target device. This value must be 1
4881
-
4882
-			// offset: 10; size: 2; bcBitCount specifies the number of bits-per-pixel. This value must be 1, 4, 8, or 24
4883
-			$bcBitCount = self::_GetInt2d($iData, 10);
4884
-//			var_dump($bcBitCount);
4885
-
4886
-			$rgbString = substr($iData, 12);
4887
-			$rgbTriples = array();
4888
-			while (strlen($rgbString) > 0) {
4889
-				$rgbTriples[] = unpack('Cb/Cg/Cr', $rgbString);
4890
-				$rgbString = substr($rgbString, 3);
4891
-			}
4892
-			$x = 0;
4893
-			$y = 0;
4894
-			foreach ($rgbTriples as $i => $rgbTriple) {
4895
-				$color = imagecolorallocate($ih, $rgbTriple['r'], $rgbTriple['g'], $rgbTriple['b']);
4896
-				imagesetpixel($ih, $x, $bcHeight - 1 - $y, $color);
4897
-				$x = ($x + 1) % $bcWidth;
4898
-				$y = $y + floor(($x + 1) / $bcWidth);
4899
-			}
4900
-			//imagepng($ih, 'image.png');
4864
+			case 0x09: // Windows bitmap format
4865
+				// BITMAPCOREINFO
4866
+				// 1. BITMAPCOREHEADER
4867
+				// offset: 0; size: 4; bcSize, Specifies the number of bytes required by the structure
4868
+				$bcSize = self::_GetInt4d($iData, 0);
4869
+	//			var_dump($bcSize);
4870
+
4871
+				// offset: 4; size: 2; bcWidth, specifies the width of the bitmap, in pixels
4872
+				$bcWidth = self::_GetInt2d($iData, 4);
4873
+	//			var_dump($bcWidth);
4874
+
4875
+				// offset: 6; size: 2; bcHeight, specifies the height of the bitmap, in pixels.
4876
+				$bcHeight = self::_GetInt2d($iData, 6);
4877
+	//			var_dump($bcHeight);
4878
+				$ih = imagecreatetruecolor($bcWidth, $bcHeight);
4879
+
4880
+				// offset: 8; size: 2; bcPlanes, specifies the number of planes for the target device. This value must be 1
4881
+
4882
+				// offset: 10; size: 2; bcBitCount specifies the number of bits-per-pixel. This value must be 1, 4, 8, or 24
4883
+				$bcBitCount = self::_GetInt2d($iData, 10);
4884
+	//			var_dump($bcBitCount);
4885
+
4886
+				$rgbString = substr($iData, 12);
4887
+				$rgbTriples = array();
4888
+				while (strlen($rgbString) > 0) {
4889
+					$rgbTriples[] = unpack('Cb/Cg/Cr', $rgbString);
4890
+					$rgbString = substr($rgbString, 3);
4891
+				}
4892
+				$x = 0;
4893
+				$y = 0;
4894
+				foreach ($rgbTriples as $i => $rgbTriple) {
4895
+					$color = imagecolorallocate($ih, $rgbTriple['r'], $rgbTriple['g'], $rgbTriple['b']);
4896
+					imagesetpixel($ih, $x, $bcHeight - 1 - $y, $color);
4897
+					$x = ($x + 1) % $bcWidth;
4898
+					$y = $y + floor(($x + 1) / $bcWidth);
4899
+				}
4900
+				//imagepng($ih, 'image.png');
4901 4901
 
4902
-			$drawing = new PHPExcel_Worksheet_Drawing();
4903
-			$drawing->setPath($filename);
4904
-			$drawing->setWorksheet($this->_phpSheet);
4902
+				$drawing = new PHPExcel_Worksheet_Drawing();
4903
+				$drawing->setPath($filename);
4904
+				$drawing->setWorksheet($this->_phpSheet);
4905 4905
 
4906
-			break;
4906
+				break;
4907 4907
 
4908
-		case 0x02: // Windows metafile or Macintosh PICT format
4909
-		case 0x0e: // native format
4910
-		default;
4911
-			break;
4908
+			case 0x02: // Windows metafile or Macintosh PICT format
4909
+			case 0x0e: // native format
4910
+			default;
4911
+				break;
4912 4912
 
4913 4913
 		}
4914 4914
 
@@ -5100,132 +5100,132 @@  discard block
 block discarded – undo
5100 5100
 			$space5 = isset($space5) ? $space5 : ''; // carriage returns before closing parenthesis
5101 5101
 
5102 5102
 			switch ($token['name']) {
5103
-			case 'tAdd': // addition
5104
-			case 'tConcat': // addition
5105
-			case 'tDiv': // division
5106
-			case 'tEQ': // equality
5107
-			case 'tGE': // greater than or equal
5108
-			case 'tGT': // greater than
5109
-			case 'tIsect': // intersection
5110
-			case 'tLE': // less than or equal
5111
-			case 'tList': // less than or equal
5112
-			case 'tLT': // less than
5113
-			case 'tMul': // multiplication
5114
-			case 'tNE': // multiplication
5115
-			case 'tPower': // power
5116
-			case 'tRange': // range
5117
-			case 'tSub': // subtraction
5118
-				$op2 = array_pop($formulaStrings);
5119
-				$op1 = array_pop($formulaStrings);
5120
-				$formulaStrings[] = "$op1$space1$space0{$token['data']}$op2";
5121
-				unset($space0, $space1);
5122
-				break;
5123
-			case 'tUplus': // unary plus
5124
-			case 'tUminus': // unary minus
5125
-				$op = array_pop($formulaStrings);
5126
-				$formulaStrings[] = "$space1$space0{$token['data']}$op";
5127
-				unset($space0, $space1);
5128
-				break;
5129
-			case 'tPercent': // percent sign
5130
-				$op = array_pop($formulaStrings);
5131
-				$formulaStrings[] = "$op$space1$space0{$token['data']}";
5132
-				unset($space0, $space1);
5133
-				break;
5134
-			case 'tAttrVolatile': // indicates volatile function
5135
-			case 'tAttrIf':
5136
-			case 'tAttrSkip':
5137
-			case 'tAttrChoose':
5138
-				// token is only important for Excel formula evaluator
5139
-				// do nothing
5140
-				break;
5141
-			case 'tAttrSpace': // space / carriage return
5142
-				// space will be used when next token arrives, do not alter formulaString stack
5143
-				switch ($token['data']['spacetype']) {
5144
-				case 'type0':
5145
-					$space0 = str_repeat(' ', $token['data']['spacecount']);
5146
-					break;
5147
-				case 'type1':
5148
-					$space1 = str_repeat("\n", $token['data']['spacecount']);
5149
-					break;
5150
-				case 'type2':
5151
-					$space2 = str_repeat(' ', $token['data']['spacecount']);
5103
+				case 'tAdd': // addition
5104
+				case 'tConcat': // addition
5105
+				case 'tDiv': // division
5106
+				case 'tEQ': // equality
5107
+				case 'tGE': // greater than or equal
5108
+				case 'tGT': // greater than
5109
+				case 'tIsect': // intersection
5110
+				case 'tLE': // less than or equal
5111
+				case 'tList': // less than or equal
5112
+				case 'tLT': // less than
5113
+				case 'tMul': // multiplication
5114
+				case 'tNE': // multiplication
5115
+				case 'tPower': // power
5116
+				case 'tRange': // range
5117
+				case 'tSub': // subtraction
5118
+					$op2 = array_pop($formulaStrings);
5119
+					$op1 = array_pop($formulaStrings);
5120
+					$formulaStrings[] = "$op1$space1$space0{$token['data']}$op2";
5121
+					unset($space0, $space1);
5152 5122
 					break;
5153
-				case 'type3':
5154
-					$space3 = str_repeat("\n", $token['data']['spacecount']);
5123
+				case 'tUplus': // unary plus
5124
+				case 'tUminus': // unary minus
5125
+					$op = array_pop($formulaStrings);
5126
+					$formulaStrings[] = "$space1$space0{$token['data']}$op";
5127
+					unset($space0, $space1);
5155 5128
 					break;
5156
-				case 'type4':
5157
-					$space4 = str_repeat(' ', $token['data']['spacecount']);
5129
+				case 'tPercent': // percent sign
5130
+					$op = array_pop($formulaStrings);
5131
+					$formulaStrings[] = "$op$space1$space0{$token['data']}";
5132
+					unset($space0, $space1);
5158 5133
 					break;
5159
-				case 'type5':
5160
-					$space5 = str_repeat("\n", $token['data']['spacecount']);
5134
+				case 'tAttrVolatile': // indicates volatile function
5135
+				case 'tAttrIf':
5136
+				case 'tAttrSkip':
5137
+				case 'tAttrChoose':
5138
+					// token is only important for Excel formula evaluator
5139
+					// do nothing
5161 5140
 					break;
5162
-				}
5163
-				break;
5164
-			case 'tAttrSum': // SUM function with one parameter
5165
-				$op = array_pop($formulaStrings);
5166
-				$formulaStrings[] = "{$space1}{$space0}SUM($op)";
5167
-				unset($space0, $space1);
5168
-				break;
5169
-			case 'tFunc': // function with fixed number of arguments
5170
-			case 'tFuncV': // function with variable number of arguments
5171
-				if ($token['data']['function'] != '') {
5172
-					// normal function
5173
-					$ops = array(); // array of operators
5174
-					for ($i = 0; $i < $token['data']['args']; ++$i) {
5175
-						$ops[] = array_pop($formulaStrings);
5141
+				case 'tAttrSpace': // space / carriage return
5142
+					// space will be used when next token arrives, do not alter formulaString stack
5143
+					switch ($token['data']['spacetype']) {
5144
+						case 'type0':
5145
+							$space0 = str_repeat(' ', $token['data']['spacecount']);
5146
+							break;
5147
+						case 'type1':
5148
+							$space1 = str_repeat("\n", $token['data']['spacecount']);
5149
+							break;
5150
+						case 'type2':
5151
+							$space2 = str_repeat(' ', $token['data']['spacecount']);
5152
+							break;
5153
+						case 'type3':
5154
+							$space3 = str_repeat("\n", $token['data']['spacecount']);
5155
+							break;
5156
+						case 'type4':
5157
+							$space4 = str_repeat(' ', $token['data']['spacecount']);
5158
+							break;
5159
+						case 'type5':
5160
+							$space5 = str_repeat("\n", $token['data']['spacecount']);
5161
+							break;
5176 5162
 					}
5177
-					$ops = array_reverse($ops);
5178
-					$formulaStrings[] = "$space1$space0{$token['data']['function']}(" . implode(',', $ops) . ")";
5163
+				break;
5164
+				case 'tAttrSum': // SUM function with one parameter
5165
+					$op = array_pop($formulaStrings);
5166
+					$formulaStrings[] = "{$space1}{$space0}SUM($op)";
5179 5167
 					unset($space0, $space1);
5180
-				} else {
5181
-					// add-in function
5182
-					$ops = array(); // array of operators
5183
-					for ($i = 0; $i < $token['data']['args'] - 1; ++$i) {
5184
-						$ops[] = array_pop($formulaStrings);
5168
+					break;
5169
+				case 'tFunc': // function with fixed number of arguments
5170
+				case 'tFuncV': // function with variable number of arguments
5171
+					if ($token['data']['function'] != '') {
5172
+						// normal function
5173
+						$ops = array(); // array of operators
5174
+						for ($i = 0; $i < $token['data']['args']; ++$i) {
5175
+							$ops[] = array_pop($formulaStrings);
5176
+						}
5177
+						$ops = array_reverse($ops);
5178
+						$formulaStrings[] = "$space1$space0{$token['data']['function']}(" . implode(',', $ops) . ")";
5179
+						unset($space0, $space1);
5180
+					} else {
5181
+						// add-in function
5182
+						$ops = array(); // array of operators
5183
+						for ($i = 0; $i < $token['data']['args'] - 1; ++$i) {
5184
+							$ops[] = array_pop($formulaStrings);
5185
+						}
5186
+						$ops = array_reverse($ops);
5187
+						$function = array_pop($formulaStrings);
5188
+						$formulaStrings[] = "$space1$space0$function(" . implode(',', $ops) . ")";
5189
+						unset($space0, $space1);
5185 5190
 					}
5186
-					$ops = array_reverse($ops);
5187
-					$function = array_pop($formulaStrings);
5188
-					$formulaStrings[] = "$space1$space0$function(" . implode(',', $ops) . ")";
5191
+					break;
5192
+				case 'tParen': // parenthesis
5193
+					$expression = array_pop($formulaStrings);
5194
+					$formulaStrings[] = "$space3$space2($expression$space5$space4)";
5195
+					unset($space2, $space3, $space4, $space5);
5196
+					break;
5197
+				case 'tArray': // array constant
5198
+					$constantArray = self::_readBIFF8ConstantArray($additionalData);
5199
+					$formulaStrings[] = $space1 . $space0 . $constantArray['value'];
5200
+					$additionalData = substr($additionalData, $constantArray['size']); // bite of chunk of additional data
5189 5201
 					unset($space0, $space1);
5190
-				}
5191
-				break;
5192
-			case 'tParen': // parenthesis
5193
-				$expression = array_pop($formulaStrings);
5194
-				$formulaStrings[] = "$space3$space2($expression$space5$space4)";
5195
-				unset($space2, $space3, $space4, $space5);
5196
-				break;
5197
-			case 'tArray': // array constant
5198
-				$constantArray = self::_readBIFF8ConstantArray($additionalData);
5199
-				$formulaStrings[] = $space1 . $space0 . $constantArray['value'];
5200
-				$additionalData = substr($additionalData, $constantArray['size']); // bite of chunk of additional data
5201
-				unset($space0, $space1);
5202
-				break;
5203
-			case 'tMemArea':
5204
-				// bite off chunk of additional data
5205
-				$cellRangeAddressList = $this->_readBIFF8CellRangeAddressList($additionalData);
5206
-				$additionalData = substr($additionalData, $cellRangeAddressList['size']);
5207
-				$formulaStrings[] = "$space1$space0{$token['data']}";
5208
-				unset($space0, $space1);
5209
-				break;
5210
-			case 'tArea': // cell range address
5211
-			case 'tBool': // boolean
5212
-			case 'tErr': // error code
5213
-			case 'tInt': // integer
5214
-			case 'tMemErr':
5215
-			case 'tMemFunc':
5216
-			case 'tMissArg':
5217
-			case 'tName':
5218
-			case 'tNameX':
5219
-			case 'tNum': // number
5220
-			case 'tRef': // single cell reference
5221
-			case 'tRef3d': // 3d cell reference
5222
-			case 'tArea3d': // 3d cell range reference
5223
-			case 'tRefN':
5224
-			case 'tAreaN':
5225
-			case 'tStr': // string
5226
-				$formulaStrings[] = "$space1$space0{$token['data']}";
5227
-				unset($space0, $space1);
5228
-				break;
5202
+					break;
5203
+				case 'tMemArea':
5204
+					// bite off chunk of additional data
5205
+					$cellRangeAddressList = $this->_readBIFF8CellRangeAddressList($additionalData);
5206
+					$additionalData = substr($additionalData, $cellRangeAddressList['size']);
5207
+					$formulaStrings[] = "$space1$space0{$token['data']}";
5208
+					unset($space0, $space1);
5209
+					break;
5210
+				case 'tArea': // cell range address
5211
+				case 'tBool': // boolean
5212
+				case 'tErr': // error code
5213
+				case 'tInt': // integer
5214
+				case 'tMemErr':
5215
+				case 'tMemFunc':
5216
+				case 'tMissArg':
5217
+				case 'tName':
5218
+				case 'tNameX':
5219
+				case 'tNum': // number
5220
+				case 'tRef': // single cell reference
5221
+				case 'tRef3d': // 3d cell reference
5222
+				case 'tArea3d': // 3d cell range reference
5223
+				case 'tRefN':
5224
+				case 'tAreaN':
5225
+				case 'tStr': // string
5226
+					$formulaStrings[] = "$space1$space0{$token['data']}";
5227
+					unset($space0, $space1);
5228
+					break;
5229 5229
 			}
5230 5230
 		}
5231 5231
 		$formulaString = $formulaStrings[0];
@@ -5253,546 +5253,546 @@  discard block
 block discarded – undo
5253 5253
 		$name = false; // initialize token name
5254 5254
 
5255 5255
 		switch ($id) {
5256
-		case 0x03: $name = 'tAdd';		$size = 1;	$data = '+';	break;
5257
-		case 0x04: $name = 'tSub';		$size = 1;	$data = '-';	break;
5258
-		case 0x05: $name = 'tMul';		$size = 1;	$data = '*';	break;
5259
-		case 0x06: $name = 'tDiv';		$size = 1;	$data = '/';	break;
5260
-		case 0x07: $name = 'tPower';	$size = 1;	$data = '^';	break;
5261
-		case 0x08: $name = 'tConcat';	$size = 1;	$data = '&';	break;
5262
-		case 0x09: $name = 'tLT';		$size = 1;	$data = '<';	break;
5263
-		case 0x0A: $name = 'tLE';		$size = 1;	$data = '<=';	break;
5264
-		case 0x0B: $name = 'tEQ';		$size = 1;	$data = '=';	break;
5265
-		case 0x0C: $name = 'tGE';		$size = 1;	$data = '>=';	break;
5266
-		case 0x0D: $name = 'tGT';		$size = 1;	$data = '>';	break;
5267
-		case 0x0E: $name = 'tNE';		$size = 1;	$data = '<>';	break;
5268
-		case 0x0F: $name = 'tIsect';	$size = 1;	$data = ' ';	break;
5269
-		case 0x10: $name = 'tList';		$size = 1;	$data = ',';	break;
5270
-		case 0x11: $name = 'tRange';	$size = 1;	$data = ':';	break;
5271
-		case 0x12: $name = 'tUplus';	$size = 1;	$data = '+';	break;
5272
-		case 0x13: $name = 'tUminus';	$size = 1;	$data = '-';	break;
5273
-		case 0x14: $name = 'tPercent';	$size = 1;	$data = '%';	break;
5274
-		case 0x15:	//	parenthesis
5275
-			$name  = 'tParen';
5276
-			$size  = 1;
5277
-			$data = null;
5278
-			break;
5279
-		case 0x16:	//	missing argument
5280
-			$name = 'tMissArg';
5281
-			$size = 1;
5282
-			$data = '';
5283
-			break;
5284
-		case 0x17:	//	string
5285
-			$name = 'tStr';
5286
-			// offset: 1; size: var; Unicode string, 8-bit string length
5287
-			$string = self::_readUnicodeStringShort(substr($formulaData, 1));
5288
-			$size = 1 + $string['size'];
5289
-			$data = self::_UTF8toExcelDoubleQuoted($string['value']);
5290
-			break;
5291
-		case 0x19:	//	Special attribute
5292
-			// offset: 1; size: 1; attribute type flags:
5293
-			switch (ord($formulaData[1])) {
5294
-			case 0x01:
5295
-				$name = 'tAttrVolatile';
5296
-				$size = 4;
5256
+			case 0x03: $name = 'tAdd';		$size = 1;	$data = '+';	break;
5257
+			case 0x04: $name = 'tSub';		$size = 1;	$data = '-';	break;
5258
+			case 0x05: $name = 'tMul';		$size = 1;	$data = '*';	break;
5259
+			case 0x06: $name = 'tDiv';		$size = 1;	$data = '/';	break;
5260
+			case 0x07: $name = 'tPower';	$size = 1;	$data = '^';	break;
5261
+			case 0x08: $name = 'tConcat';	$size = 1;	$data = '&';	break;
5262
+			case 0x09: $name = 'tLT';		$size = 1;	$data = '<';	break;
5263
+			case 0x0A: $name = 'tLE';		$size = 1;	$data = '<=';	break;
5264
+			case 0x0B: $name = 'tEQ';		$size = 1;	$data = '=';	break;
5265
+			case 0x0C: $name = 'tGE';		$size = 1;	$data = '>=';	break;
5266
+			case 0x0D: $name = 'tGT';		$size = 1;	$data = '>';	break;
5267
+			case 0x0E: $name = 'tNE';		$size = 1;	$data = '<>';	break;
5268
+			case 0x0F: $name = 'tIsect';	$size = 1;	$data = ' ';	break;
5269
+			case 0x10: $name = 'tList';		$size = 1;	$data = ',';	break;
5270
+			case 0x11: $name = 'tRange';	$size = 1;	$data = ':';	break;
5271
+			case 0x12: $name = 'tUplus';	$size = 1;	$data = '+';	break;
5272
+			case 0x13: $name = 'tUminus';	$size = 1;	$data = '-';	break;
5273
+			case 0x14: $name = 'tPercent';	$size = 1;	$data = '%';	break;
5274
+			case 0x15:	//	parenthesis
5275
+				$name  = 'tParen';
5276
+				$size  = 1;
5297 5277
 				$data = null;
5298 5278
 				break;
5299
-			case 0x02:
5300
-				$name = 'tAttrIf';
5301
-				$size = 4;
5302
-				$data = null;
5303
-				break;
5304
-			case 0x04:
5305
-				$name = 'tAttrChoose';
5306
-				// offset: 2; size: 2; number of choices in the CHOOSE function ($nc, number of parameters decreased by 1)
5307
-				$nc = self::_GetInt2d($formulaData, 2);
5308
-				// offset: 4; size: 2 * $nc
5309
-				// offset: 4 + 2 * $nc; size: 2
5310
-				$size = 2 * $nc + 6;
5311
-				$data = null;
5279
+			case 0x16:	//	missing argument
5280
+				$name = 'tMissArg';
5281
+				$size = 1;
5282
+				$data = '';
5312 5283
 				break;
5313
-			case 0x08:
5314
-				$name = 'tAttrSkip';
5315
-				$size = 4;
5316
-				$data = null;
5284
+			case 0x17:	//	string
5285
+				$name = 'tStr';
5286
+				// offset: 1; size: var; Unicode string, 8-bit string length
5287
+				$string = self::_readUnicodeStringShort(substr($formulaData, 1));
5288
+				$size = 1 + $string['size'];
5289
+				$data = self::_UTF8toExcelDoubleQuoted($string['value']);
5317 5290
 				break;
5318
-			case 0x10:
5319
-				$name = 'tAttrSum';
5320
-				$size = 4;
5321
-				$data = null;
5322
-				break;
5323
-			case 0x40:
5324
-			case 0x41:
5325
-				$name = 'tAttrSpace';
5326
-				$size = 4;
5327
-				// offset: 2; size: 2; space type and position
5328
-				switch (ord($formulaData[2])) {
5329
-				case 0x00:
5330
-					$spacetype = 'type0';
5331
-					break;
5332
-				case 0x01:
5333
-					$spacetype = 'type1';
5334
-					break;
5335
-				case 0x02:
5336
-					$spacetype = 'type2';
5337
-					break;
5338
-				case 0x03:
5339
-					$spacetype = 'type3';
5340
-					break;
5341
-				case 0x04:
5342
-					$spacetype = 'type4';
5343
-					break;
5344
-				case 0x05:
5345
-					$spacetype = 'type5';
5346
-					break;
5347
-				default:
5348
-					throw new Exception('Unrecognized space type in tAttrSpace token');
5349
-					break;
5350
-				}
5351
-				// offset: 3; size: 1; number of inserted spaces/carriage returns
5352
-				$spacecount = ord($formulaData[3]);
5291
+			case 0x19:	//	Special attribute
5292
+				// offset: 1; size: 1; attribute type flags:
5293
+				switch (ord($formulaData[1])) {
5294
+					case 0x01:
5295
+						$name = 'tAttrVolatile';
5296
+						$size = 4;
5297
+						$data = null;
5298
+						break;
5299
+					case 0x02:
5300
+						$name = 'tAttrIf';
5301
+						$size = 4;
5302
+						$data = null;
5303
+						break;
5304
+					case 0x04:
5305
+						$name = 'tAttrChoose';
5306
+						// offset: 2; size: 2; number of choices in the CHOOSE function ($nc, number of parameters decreased by 1)
5307
+						$nc = self::_GetInt2d($formulaData, 2);
5308
+						// offset: 4; size: 2 * $nc
5309
+						// offset: 4 + 2 * $nc; size: 2
5310
+						$size = 2 * $nc + 6;
5311
+						$data = null;
5312
+						break;
5313
+					case 0x08:
5314
+						$name = 'tAttrSkip';
5315
+						$size = 4;
5316
+						$data = null;
5317
+						break;
5318
+					case 0x10:
5319
+						$name = 'tAttrSum';
5320
+						$size = 4;
5321
+						$data = null;
5322
+						break;
5323
+					case 0x40:
5324
+					case 0x41:
5325
+						$name = 'tAttrSpace';
5326
+						$size = 4;
5327
+						// offset: 2; size: 2; space type and position
5328
+						switch (ord($formulaData[2])) {
5329
+							case 0x00:
5330
+								$spacetype = 'type0';
5331
+								break;
5332
+							case 0x01:
5333
+								$spacetype = 'type1';
5334
+								break;
5335
+							case 0x02:
5336
+								$spacetype = 'type2';
5337
+								break;
5338
+							case 0x03:
5339
+								$spacetype = 'type3';
5340
+								break;
5341
+							case 0x04:
5342
+								$spacetype = 'type4';
5343
+								break;
5344
+							case 0x05:
5345
+								$spacetype = 'type5';
5346
+								break;
5347
+							default:
5348
+								throw new Exception('Unrecognized space type in tAttrSpace token');
5349
+								break;
5350
+						}
5351
+					// offset: 3; size: 1; number of inserted spaces/carriage returns
5352
+					$spacecount = ord($formulaData[3]);
5353 5353
 
5354
-				$data = array('spacetype' => $spacetype, 'spacecount' => $spacecount);
5355
-				break;
5354
+					$data = array('spacetype' => $spacetype, 'spacecount' => $spacecount);
5355
+					break;
5356 5356
 			default:
5357 5357
 				throw new Exception('Unrecognized attribute flag in tAttr token');
5358 5358
 				break;
5359 5359
 			}
5360 5360
 			break;
5361
-		case 0x1C:	//	error code
5362
-			// offset: 1; size: 1; error code
5363
-			$name = 'tErr';
5364
-			$size = 2;
5365
-			$data = self::_mapErrorCode(ord($formulaData[1]));
5366
-			break;
5367
-		case 0x1D:	//	boolean
5368
-			// offset: 1; size: 1; 0 = false, 1 = true;
5369
-			$name = 'tBool';
5370
-			$size = 2;
5371
-			$data = ord($formulaData[1]) ? 'TRUE' : 'FALSE';
5372
-			break;
5373
-		case 0x1E:	//	integer
5374
-			// offset: 1; size: 2; unsigned 16-bit integer
5375
-			$name = 'tInt';
5376
-			$size = 3;
5377
-			$data = self::_GetInt2d($formulaData, 1);
5378
-			break;
5379
-		case 0x1F:	//	number
5380
-			// offset: 1; size: 8;
5381
-			$name = 'tNum';
5382
-			$size = 9;
5383
-			$data = self::_extractNumber(substr($formulaData, 1));
5384
-			$data = str_replace(',', '.', (string)$data); // in case non-English locale
5385
-			break;
5386
-		case 0x20:	//	array constant
5387
-		case 0x40:
5388
-		case 0x60:
5389
-			// offset: 1; size: 7; not used
5390
-			$name = 'tArray';
5391
-			$size = 8;
5392
-			$data = null;
5393
-			break;
5394
-		case 0x21:	//	function with fixed number of arguments
5395
-		case 0x41:
5396
-		case 0x61:
5397
-			$name = 'tFunc';
5398
-			$size = 3;
5399
-			// offset: 1; size: 2; index to built-in sheet function
5400
-			switch (self::_GetInt2d($formulaData, 1)) {
5401
-			case   2: $function = 'ISNA'; 			$args = 1; 	break;
5402
-			case   3: $function = 'ISERROR'; 		$args = 1; 	break;
5403
-			case  10: $function = 'NA'; 			$args = 0; 	break;
5404
-			case  15: $function = 'SIN'; 			$args = 1; 	break;
5405
-			case  16: $function = 'COS'; 			$args = 1; 	break;
5406
-			case  17: $function = 'TAN'; 			$args = 1; 	break;
5407
-			case  18: $function = 'ATAN'; 			$args = 1; 	break;
5408
-			case  19: $function = 'PI'; 			$args = 0; 	break;
5409
-			case  20: $function = 'SQRT'; 			$args = 1; 	break;
5410
-			case  21: $function = 'EXP'; 			$args = 1; 	break;
5411
-			case  22: $function = 'LN'; 			$args = 1; 	break;
5412
-			case  23: $function = 'LOG10'; 			$args = 1; 	break;
5413
-			case  24: $function = 'ABS'; 			$args = 1; 	break;
5414
-			case  25: $function = 'INT'; 			$args = 1; 	break;
5415
-			case  26: $function = 'SIGN'; 			$args = 1; 	break;
5416
-			case  27: $function = 'ROUND'; 			$args = 2; 	break;
5417
-			case  30: $function = 'REPT'; 			$args = 2; 	break;
5418
-			case  31: $function = 'MID'; 			$args = 3; 	break;
5419
-			case  32: $function = 'LEN'; 			$args = 1; 	break;
5420
-			case  33: $function = 'VALUE'; 			$args = 1; 	break;
5421
-			case  34: $function = 'TRUE'; 			$args = 0; 	break;
5422
-			case  35: $function = 'FALSE'; 			$args = 0; 	break;
5423
-			case  38: $function = 'NOT'; 			$args = 1; 	break;
5424
-			case  39: $function = 'MOD'; 			$args = 2;	break;
5425
-			case  40: $function = 'DCOUNT'; 		$args = 3;	break;
5426
-			case  41: $function = 'DSUM'; 			$args = 3;	break;
5427
-			case  42: $function = 'DAVERAGE'; 		$args = 3;	break;
5428
-			case  43: $function = 'DMIN'; 			$args = 3;	break;
5429
-			case  44: $function = 'DMAX'; 			$args = 3;	break;
5430
-			case  45: $function = 'DSTDEV'; 		$args = 3;	break;
5431
-			case  48: $function = 'TEXT'; 			$args = 2;	break;
5432
-			case  61: $function = 'MIRR'; 			$args = 3;	break;
5433
-			case  63: $function = 'RAND'; 			$args = 0;	break;
5434
-			case  65: $function = 'DATE'; 			$args = 3;	break;
5435
-			case  66: $function = 'TIME'; 			$args = 3;	break;
5436
-			case  67: $function = 'DAY'; 			$args = 1;	break;
5437
-			case  68: $function = 'MONTH'; 			$args = 1;	break;
5438
-			case  69: $function = 'YEAR'; 			$args = 1;	break;
5439
-			case  71: $function = 'HOUR'; 			$args = 1;	break;
5440
-			case  72: $function = 'MINUTE'; 		$args = 1;	break;
5441
-			case  73: $function = 'SECOND'; 		$args = 1;	break;
5442
-			case  74: $function = 'NOW'; 			$args = 0;	break;
5443
-			case  75: $function = 'AREAS'; 			$args = 1;	break;
5444
-			case  76: $function = 'ROWS'; 			$args = 1;	break;
5445
-			case  77: $function = 'COLUMNS'; 		$args = 1;	break;
5446
-			case  83: $function = 'TRANSPOSE'; 		$args = 1;	break;
5447
-			case  86: $function = 'TYPE'; 			$args = 1;	break;
5448
-			case  97: $function = 'ATAN2'; 			$args = 2;	break;
5449
-			case  98: $function = 'ASIN'; 			$args = 1;	break;
5450
-			case  99: $function = 'ACOS'; 			$args = 1;	break;
5451
-			case 105: $function = 'ISREF'; 			$args = 1;	break;
5452
-			case 111: $function = 'CHAR'; 			$args = 1;	break;
5453
-			case 112: $function = 'LOWER'; 			$args = 1;	break;
5454
-			case 113: $function = 'UPPER'; 			$args = 1;	break;
5455
-			case 114: $function = 'PROPER'; 		$args = 1;	break;
5456
-			case 117: $function = 'EXACT'; 			$args = 2;	break;
5457
-			case 118: $function = 'TRIM'; 			$args = 1;	break;
5458
-			case 119: $function = 'REPLACE'; 		$args = 4;	break;
5459
-			case 121: $function = 'CODE'; 			$args = 1;	break;
5460
-			case 126: $function = 'ISERR'; 			$args = 1;	break;
5461
-			case 127: $function = 'ISTEXT'; 		$args = 1;	break;
5462
-			case 128: $function = 'ISNUMBER'; 		$args = 1;	break;
5463
-			case 129: $function = 'ISBLANK'; 		$args = 1;	break;
5464
-			case 130: $function = 'T'; 				$args = 1;	break;
5465
-			case 131: $function = 'N'; 				$args = 1;	break;
5466
-			case 140: $function = 'DATEVALUE'; 		$args = 1;	break;
5467
-			case 141: $function = 'TIMEVALUE'; 		$args = 1;	break;
5468
-			case 142: $function = 'SLN'; 			$args = 3;	break;
5469
-			case 143: $function = 'SYD'; 			$args = 4;	break;
5470
-			case 162: $function = 'CLEAN'; 			$args = 1;	break;
5471
-			case 163: $function = 'MDETERM'; 		$args = 1;	break;
5472
-			case 164: $function = 'MINVERSE'; 		$args = 1;	break;
5473
-			case 165: $function = 'MMULT'; 			$args = 2;	break;
5474
-			case 184: $function = 'FACT'; 			$args = 1;	break;
5475
-			case 189: $function = 'DPRODUCT'; 		$args = 3;	break;
5476
-			case 190: $function = 'ISNONTEXT'; 		$args = 1;	break;
5477
-			case 195: $function = 'DSTDEVP'; 		$args = 3;	break;
5478
-			case 196: $function = 'DVARP'; 			$args = 3;	break;
5479
-			case 198: $function = 'ISLOGICAL'; 		$args = 1;	break;
5480
-			case 199: $function = 'DCOUNTA'; 		$args = 3;	break;
5481
-			case 207: $function = 'REPLACEB'; 		$args = 4;	break;
5482
-			case 210: $function = 'MIDB'; 			$args = 3;	break;
5483
-			case 211: $function = 'LENB'; 			$args = 1;	break;
5484
-			case 212: $function = 'ROUNDUP'; 		$args = 2;	break;
5485
-			case 213: $function = 'ROUNDDOWN'; 		$args = 2;	break;
5486
-			case 214: $function = 'ASC'; 			$args = 1;	break;
5487
-			case 215: $function = 'DBCS'; 			$args = 1;	break;
5488
-			case 221: $function = 'TODAY'; 			$args = 0;	break;
5489
-			case 229: $function = 'SINH'; 			$args = 1;	break;
5490
-			case 230: $function = 'COSH'; 			$args = 1;	break;
5491
-			case 231: $function = 'TANH'; 			$args = 1;	break;
5492
-			case 232: $function = 'ASINH'; 			$args = 1;	break;
5493
-			case 233: $function = 'ACOSH'; 			$args = 1;	break;
5494
-			case 234: $function = 'ATANH'; 			$args = 1;	break;
5495
-			case 235: $function = 'DGET'; 			$args = 3;	break;
5496
-			case 244: $function = 'INFO'; 			$args = 1;	break;
5497
-			case 252: $function = 'FREQUENCY'; 		$args = 2;	break;
5498
-			case 261: $function = 'ERROR.TYPE'; 	$args = 1;	break;
5499
-			case 271: $function = 'GAMMALN'; 		$args = 1;	break;
5500
-			case 273: $function = 'BINOMDIST'; 		$args = 4;	break;
5501
-			case 274: $function = 'CHIDIST'; 		$args = 2;	break;
5502
-			case 275: $function = 'CHIINV'; 		$args = 2;	break;
5503
-			case 276: $function = 'COMBIN'; 		$args = 2;	break;
5504
-			case 277: $function = 'CONFIDENCE'; 	$args = 3;	break;
5505
-			case 278: $function = 'CRITBINOM'; 		$args = 3;	break;
5506
-			case 279: $function = 'EVEN'; 			$args = 1;	break;
5507
-			case 280: $function = 'EXPONDIST'; 		$args = 3;	break;
5508
-			case 281: $function = 'FDIST'; 			$args = 3;	break;
5509
-			case 282: $function = 'FINV'; 			$args = 3;	break;
5510
-			case 283: $function = 'FISHER'; 		$args = 1;	break;
5511
-			case 284: $function = 'FISHERINV'; 		$args = 1;	break;
5512
-			case 285: $function = 'FLOOR'; 			$args = 2;	break;
5513
-			case 286: $function = 'GAMMADIST'; 		$args = 4;	break;
5514
-			case 287: $function = 'GAMMAINV'; 		$args = 3;	break;
5515
-			case 288: $function = 'CEILING'; 		$args = 2;	break;
5516
-			case 289: $function = 'HYPGEOMDIST';	$args = 4;	break;
5517
-			case 290: $function = 'LOGNORMDIST';	$args = 3;	break;
5518
-			case 291: $function = 'LOGINV';			$args = 3;	break;
5519
-			case 292: $function = 'NEGBINOMDIST';	$args = 3;	break;
5520
-			case 293: $function = 'NORMDIST';		$args = 4;	break;
5521
-			case 294: $function = 'NORMSDIST';		$args = 1;	break;
5522
-			case 295: $function = 'NORMINV';		$args = 3;	break;
5523
-			case 296: $function = 'NORMSINV';		$args = 1;	break;
5524
-			case 297: $function = 'STANDARDIZE';	$args = 3;	break;
5525
-			case 298: $function = 'ODD';			$args = 1;	break;
5526
-			case 299: $function = 'PERMUT';			$args = 2;	break;
5527
-			case 300: $function = 'POISSON';		$args = 3;	break;
5528
-			case 301: $function = 'TDIST';			$args = 3;	break;
5529
-			case 302: $function = 'WEIBULL';		$args = 4;	break;
5530
-			case 303: $function = 'SUMXMY2';		$args = 2;	break;
5531
-			case 304: $function = 'SUMX2MY2';		$args = 2;	break;
5532
-			case 305: $function = 'SUMX2PY2';		$args = 2;	break;
5533
-			case 306: $function = 'CHITEST';		$args = 2;	break;
5534
-			case 307: $function = 'CORREL';			$args = 2;	break;
5535
-			case 308: $function = 'COVAR';			$args = 2;	break;
5536
-			case 309: $function = 'FORECAST';		$args = 3;	break;
5537
-			case 310: $function = 'FTEST';			$args = 2;	break;
5538
-			case 311: $function = 'INTERCEPT';		$args = 2;	break;
5539
-			case 312: $function = 'PEARSON';		$args = 2;	break;
5540
-			case 313: $function = 'RSQ';			$args = 2;	break;
5541
-			case 314: $function = 'STEYX';			$args = 2;	break;
5542
-			case 315: $function = 'SLOPE';			$args = 2;	break;
5543
-			case 316: $function = 'TTEST';			$args = 4;	break;
5544
-			case 325: $function = 'LARGE';			$args = 2;	break;
5545
-			case 326: $function = 'SMALL';			$args = 2;	break;
5546
-			case 327: $function = 'QUARTILE';		$args = 2;	break;
5547
-			case 328: $function = 'PERCENTILE';		$args = 2;	break;
5548
-			case 331: $function = 'TRIMMEAN';		$args = 2;	break;
5549
-			case 332: $function = 'TINV';			$args = 2;	break;
5550
-			case 337: $function = 'POWER';			$args = 2;	break;
5551
-			case 342: $function = 'RADIANS';		$args = 1;	break;
5552
-			case 343: $function = 'DEGREES';		$args = 1;	break;
5553
-			case 346: $function = 'COUNTIF';		$args = 2;	break;
5554
-			case 347: $function = 'COUNTBLANK';		$args = 1;	break;
5555
-			case 350: $function = 'ISPMT';			$args = 4;	break;
5556
-			case 351: $function = 'DATEDIF';		$args = 3;	break;
5557
-			case 352: $function = 'DATESTRING';		$args = 1;	break;
5558
-			case 353: $function = 'NUMBERSTRING';	$args = 2;	break;
5559
-			case 360: $function = 'PHONETIC';		$args = 1;	break;
5560
-			case 368: $function = 'BAHTTEXT';		$args = 1;	break;
5561
-			default:
5562
-				throw new Exception('Unrecognized function in formula');
5361
+			case 0x1C:	//	error code
5362
+				// offset: 1; size: 1; error code
5363
+				$name = 'tErr';
5364
+				$size = 2;
5365
+				$data = self::_mapErrorCode(ord($formulaData[1]));
5563 5366
 				break;
5564
-			}
5565
-			$data = array('function' => $function, 'args' => $args);
5566
-			break;
5567
-		case 0x22:	//	function with variable number of arguments
5568
-		case 0x42:
5569
-		case 0x62:
5570
-			$name = 'tFuncV';
5571
-			$size = 4;
5572
-			// offset: 1; size: 1; number of arguments
5573
-			$args = ord($formulaData[1]);
5574
-			// offset: 2: size: 2; index to built-in sheet function
5575
-			$index = self::_GetInt2d($formulaData, 2);
5576
-			switch ($index) {
5577
-			case   0: $function = 'COUNT';			break;
5578
-			case   1: $function = 'IF';				break;
5579
-			case   4: $function = 'SUM';			break;
5580
-			case   5: $function = 'AVERAGE';		break;
5581
-			case   6: $function = 'MIN';			break;
5582
-			case   7: $function = 'MAX';			break;
5583
-			case   8: $function = 'ROW';			break;
5584
-			case   9: $function = 'COLUMN';			break;
5585
-			case  11: $function = 'NPV';			break;
5586
-			case  12: $function = 'STDEV';			break;
5587
-			case  13: $function = 'DOLLAR';			break;
5588
-			case  14: $function = 'FIXED';			break;
5589
-			case  28: $function = 'LOOKUP';			break;
5590
-			case  29: $function = 'INDEX';			break;
5591
-			case  36: $function = 'AND';			break;
5592
-			case  37: $function = 'OR';				break;
5593
-			case  46: $function = 'VAR';			break;
5594
-			case  49: $function = 'LINEST';			break;
5595
-			case  50: $function = 'TREND';			break;
5596
-			case  51: $function = 'LOGEST';			break;
5597
-			case  52: $function = 'GROWTH';			break;
5598
-			case  56: $function = 'PV';				break;
5599
-			case  57: $function = 'FV';				break;
5600
-			case  58: $function = 'NPER';			break;
5601
-			case  59: $function = 'PMT';			break;
5602
-			case  60: $function = 'RATE';			break;
5603
-			case  62: $function = 'IRR';			break;
5604
-			case  64: $function = 'MATCH';			break;
5605
-			case  70: $function = 'WEEKDAY';		break;
5606
-			case  78: $function = 'OFFSET';			break;
5607
-			case  82: $function = 'SEARCH';			break;
5608
-			case 100: $function = 'CHOOSE';			break;
5609
-			case 101: $function = 'HLOOKUP';		break;
5610
-			case 102: $function = 'VLOOKUP';		break;
5611
-			case 109: $function = 'LOG';			break;
5612
-			case 115: $function = 'LEFT';			break;
5613
-			case 116: $function = 'RIGHT';			break;
5614
-			case 120: $function = 'SUBSTITUTE';		break;
5615
-			case 124: $function = 'FIND';			break;
5616
-			case 125: $function = 'CELL';			break;
5617
-			case 144: $function = 'DDB';			break;
5618
-			case 148: $function = 'INDIRECT';		break;
5619
-			case 167: $function = 'IPMT';			break;
5620
-			case 168: $function = 'PPMT';			break;
5621
-			case 169: $function = 'COUNTA';			break;
5622
-			case 183: $function = 'PRODUCT';		break;
5623
-			case 193: $function = 'STDEVP';			break;
5624
-			case 194: $function = 'VARP';			break;
5625
-			case 197: $function = 'TRUNC';			break;
5626
-			case 204: $function = 'USDOLLAR';		break;
5627
-			case 205: $function = 'FINDB';			break;
5628
-			case 206: $function = 'SEARCHB';		break;
5629
-			case 208: $function = 'LEFTB';			break;
5630
-			case 209: $function = 'RIGHTB';			break;
5631
-			case 216: $function = 'RANK';			break;
5632
-			case 219: $function = 'ADDRESS';		break;
5633
-			case 220: $function = 'DAYS360';		break;
5634
-			case 222: $function = 'VDB';			break;
5635
-			case 227: $function = 'MEDIAN';			break;
5636
-			case 228: $function = 'SUMPRODUCT';		break;
5637
-			case 247: $function = 'DB';				break;
5638
-			case 255: $function = '';				break;
5639
-			case 269: $function = 'AVEDEV';			break;
5640
-			case 270: $function = 'BETADIST';		break;
5641
-			case 272: $function = 'BETAINV';		break;
5642
-			case 317: $function = 'PROB';			break;
5643
-			case 318: $function = 'DEVSQ';			break;
5644
-			case 319: $function = 'GEOMEAN';		break;
5645
-			case 320: $function = 'HARMEAN';		break;
5646
-			case 321: $function = 'SUMSQ';			break;
5647
-			case 322: $function = 'KURT';			break;
5648
-			case 323: $function = 'SKEW';			break;
5649
-			case 324: $function = 'ZTEST';			break;
5650
-			case 329: $function = 'PERCENTRANK';	break;
5651
-			case 330: $function = 'MODE';			break;
5652
-			case 336: $function = 'CONCATENATE';	break;
5653
-			case 344: $function = 'SUBTOTAL';		break;
5654
-			case 345: $function = 'SUMIF';			break;
5655
-			case 354: $function = 'ROMAN';			break;
5656
-			case 358: $function = 'GETPIVOTDATA';	break;
5657
-			case 359: $function = 'HYPERLINK';		break;
5658
-			case 361: $function = 'AVERAGEA';		break;
5659
-			case 362: $function = 'MAXA';			break;
5660
-			case 363: $function = 'MINA';			break;
5661
-			case 364: $function = 'STDEVPA';		break;
5662
-			case 365: $function = 'VARPA';			break;
5663
-			case 366: $function = 'STDEVA';			break;
5664
-			case 367: $function = 'VARA';			break;
5665
-			default:
5666
-				throw new Exception('Unrecognized function in formula');
5367
+			case 0x1D:	//	boolean
5368
+				// offset: 1; size: 1; 0 = false, 1 = true;
5369
+				$name = 'tBool';
5370
+				$size = 2;
5371
+				$data = ord($formulaData[1]) ? 'TRUE' : 'FALSE';
5667 5372
 				break;
5668
-			}
5373
+			case 0x1E:	//	integer
5374
+				// offset: 1; size: 2; unsigned 16-bit integer
5375
+				$name = 'tInt';
5376
+				$size = 3;
5377
+				$data = self::_GetInt2d($formulaData, 1);
5378
+				break;
5379
+			case 0x1F:	//	number
5380
+				// offset: 1; size: 8;
5381
+				$name = 'tNum';
5382
+				$size = 9;
5383
+				$data = self::_extractNumber(substr($formulaData, 1));
5384
+				$data = str_replace(',', '.', (string)$data); // in case non-English locale
5385
+				break;
5386
+			case 0x20:	//	array constant
5387
+			case 0x40:
5388
+			case 0x60:
5389
+				// offset: 1; size: 7; not used
5390
+				$name = 'tArray';
5391
+				$size = 8;
5392
+				$data = null;
5393
+				break;
5394
+			case 0x21:	//	function with fixed number of arguments
5395
+			case 0x41:
5396
+			case 0x61:
5397
+				$name = 'tFunc';
5398
+				$size = 3;
5399
+				// offset: 1; size: 2; index to built-in sheet function
5400
+				switch (self::_GetInt2d($formulaData, 1)) {
5401
+					case   2: $function = 'ISNA'; 			$args = 1; 	break;
5402
+					case   3: $function = 'ISERROR'; 		$args = 1; 	break;
5403
+					case  10: $function = 'NA'; 			$args = 0; 	break;
5404
+					case  15: $function = 'SIN'; 			$args = 1; 	break;
5405
+					case  16: $function = 'COS'; 			$args = 1; 	break;
5406
+					case  17: $function = 'TAN'; 			$args = 1; 	break;
5407
+					case  18: $function = 'ATAN'; 			$args = 1; 	break;
5408
+					case  19: $function = 'PI'; 			$args = 0; 	break;
5409
+					case  20: $function = 'SQRT'; 			$args = 1; 	break;
5410
+					case  21: $function = 'EXP'; 			$args = 1; 	break;
5411
+					case  22: $function = 'LN'; 			$args = 1; 	break;
5412
+					case  23: $function = 'LOG10'; 			$args = 1; 	break;
5413
+					case  24: $function = 'ABS'; 			$args = 1; 	break;
5414
+					case  25: $function = 'INT'; 			$args = 1; 	break;
5415
+					case  26: $function = 'SIGN'; 			$args = 1; 	break;
5416
+					case  27: $function = 'ROUND'; 			$args = 2; 	break;
5417
+					case  30: $function = 'REPT'; 			$args = 2; 	break;
5418
+					case  31: $function = 'MID'; 			$args = 3; 	break;
5419
+					case  32: $function = 'LEN'; 			$args = 1; 	break;
5420
+					case  33: $function = 'VALUE'; 			$args = 1; 	break;
5421
+					case  34: $function = 'TRUE'; 			$args = 0; 	break;
5422
+					case  35: $function = 'FALSE'; 			$args = 0; 	break;
5423
+					case  38: $function = 'NOT'; 			$args = 1; 	break;
5424
+					case  39: $function = 'MOD'; 			$args = 2;	break;
5425
+					case  40: $function = 'DCOUNT'; 		$args = 3;	break;
5426
+					case  41: $function = 'DSUM'; 			$args = 3;	break;
5427
+					case  42: $function = 'DAVERAGE'; 		$args = 3;	break;
5428
+					case  43: $function = 'DMIN'; 			$args = 3;	break;
5429
+					case  44: $function = 'DMAX'; 			$args = 3;	break;
5430
+					case  45: $function = 'DSTDEV'; 		$args = 3;	break;
5431
+					case  48: $function = 'TEXT'; 			$args = 2;	break;
5432
+					case  61: $function = 'MIRR'; 			$args = 3;	break;
5433
+					case  63: $function = 'RAND'; 			$args = 0;	break;
5434
+					case  65: $function = 'DATE'; 			$args = 3;	break;
5435
+					case  66: $function = 'TIME'; 			$args = 3;	break;
5436
+					case  67: $function = 'DAY'; 			$args = 1;	break;
5437
+					case  68: $function = 'MONTH'; 			$args = 1;	break;
5438
+					case  69: $function = 'YEAR'; 			$args = 1;	break;
5439
+					case  71: $function = 'HOUR'; 			$args = 1;	break;
5440
+					case  72: $function = 'MINUTE'; 		$args = 1;	break;
5441
+					case  73: $function = 'SECOND'; 		$args = 1;	break;
5442
+					case  74: $function = 'NOW'; 			$args = 0;	break;
5443
+					case  75: $function = 'AREAS'; 			$args = 1;	break;
5444
+					case  76: $function = 'ROWS'; 			$args = 1;	break;
5445
+					case  77: $function = 'COLUMNS'; 		$args = 1;	break;
5446
+					case  83: $function = 'TRANSPOSE'; 		$args = 1;	break;
5447
+					case  86: $function = 'TYPE'; 			$args = 1;	break;
5448
+					case  97: $function = 'ATAN2'; 			$args = 2;	break;
5449
+					case  98: $function = 'ASIN'; 			$args = 1;	break;
5450
+					case  99: $function = 'ACOS'; 			$args = 1;	break;
5451
+					case 105: $function = 'ISREF'; 			$args = 1;	break;
5452
+					case 111: $function = 'CHAR'; 			$args = 1;	break;
5453
+					case 112: $function = 'LOWER'; 			$args = 1;	break;
5454
+					case 113: $function = 'UPPER'; 			$args = 1;	break;
5455
+					case 114: $function = 'PROPER'; 		$args = 1;	break;
5456
+					case 117: $function = 'EXACT'; 			$args = 2;	break;
5457
+					case 118: $function = 'TRIM'; 			$args = 1;	break;
5458
+					case 119: $function = 'REPLACE'; 		$args = 4;	break;
5459
+					case 121: $function = 'CODE'; 			$args = 1;	break;
5460
+					case 126: $function = 'ISERR'; 			$args = 1;	break;
5461
+					case 127: $function = 'ISTEXT'; 		$args = 1;	break;
5462
+					case 128: $function = 'ISNUMBER'; 		$args = 1;	break;
5463
+					case 129: $function = 'ISBLANK'; 		$args = 1;	break;
5464
+					case 130: $function = 'T'; 				$args = 1;	break;
5465
+					case 131: $function = 'N'; 				$args = 1;	break;
5466
+					case 140: $function = 'DATEVALUE'; 		$args = 1;	break;
5467
+					case 141: $function = 'TIMEVALUE'; 		$args = 1;	break;
5468
+					case 142: $function = 'SLN'; 			$args = 3;	break;
5469
+					case 143: $function = 'SYD'; 			$args = 4;	break;
5470
+					case 162: $function = 'CLEAN'; 			$args = 1;	break;
5471
+					case 163: $function = 'MDETERM'; 		$args = 1;	break;
5472
+					case 164: $function = 'MINVERSE'; 		$args = 1;	break;
5473
+					case 165: $function = 'MMULT'; 			$args = 2;	break;
5474
+					case 184: $function = 'FACT'; 			$args = 1;	break;
5475
+					case 189: $function = 'DPRODUCT'; 		$args = 3;	break;
5476
+					case 190: $function = 'ISNONTEXT'; 		$args = 1;	break;
5477
+					case 195: $function = 'DSTDEVP'; 		$args = 3;	break;
5478
+					case 196: $function = 'DVARP'; 			$args = 3;	break;
5479
+					case 198: $function = 'ISLOGICAL'; 		$args = 1;	break;
5480
+					case 199: $function = 'DCOUNTA'; 		$args = 3;	break;
5481
+					case 207: $function = 'REPLACEB'; 		$args = 4;	break;
5482
+					case 210: $function = 'MIDB'; 			$args = 3;	break;
5483
+					case 211: $function = 'LENB'; 			$args = 1;	break;
5484
+					case 212: $function = 'ROUNDUP'; 		$args = 2;	break;
5485
+					case 213: $function = 'ROUNDDOWN'; 		$args = 2;	break;
5486
+					case 214: $function = 'ASC'; 			$args = 1;	break;
5487
+					case 215: $function = 'DBCS'; 			$args = 1;	break;
5488
+					case 221: $function = 'TODAY'; 			$args = 0;	break;
5489
+					case 229: $function = 'SINH'; 			$args = 1;	break;
5490
+					case 230: $function = 'COSH'; 			$args = 1;	break;
5491
+					case 231: $function = 'TANH'; 			$args = 1;	break;
5492
+					case 232: $function = 'ASINH'; 			$args = 1;	break;
5493
+					case 233: $function = 'ACOSH'; 			$args = 1;	break;
5494
+					case 234: $function = 'ATANH'; 			$args = 1;	break;
5495
+					case 235: $function = 'DGET'; 			$args = 3;	break;
5496
+					case 244: $function = 'INFO'; 			$args = 1;	break;
5497
+					case 252: $function = 'FREQUENCY'; 		$args = 2;	break;
5498
+					case 261: $function = 'ERROR.TYPE'; 	$args = 1;	break;
5499
+					case 271: $function = 'GAMMALN'; 		$args = 1;	break;
5500
+					case 273: $function = 'BINOMDIST'; 		$args = 4;	break;
5501
+					case 274: $function = 'CHIDIST'; 		$args = 2;	break;
5502
+					case 275: $function = 'CHIINV'; 		$args = 2;	break;
5503
+					case 276: $function = 'COMBIN'; 		$args = 2;	break;
5504
+					case 277: $function = 'CONFIDENCE'; 	$args = 3;	break;
5505
+					case 278: $function = 'CRITBINOM'; 		$args = 3;	break;
5506
+					case 279: $function = 'EVEN'; 			$args = 1;	break;
5507
+					case 280: $function = 'EXPONDIST'; 		$args = 3;	break;
5508
+					case 281: $function = 'FDIST'; 			$args = 3;	break;
5509
+					case 282: $function = 'FINV'; 			$args = 3;	break;
5510
+					case 283: $function = 'FISHER'; 		$args = 1;	break;
5511
+					case 284: $function = 'FISHERINV'; 		$args = 1;	break;
5512
+					case 285: $function = 'FLOOR'; 			$args = 2;	break;
5513
+					case 286: $function = 'GAMMADIST'; 		$args = 4;	break;
5514
+					case 287: $function = 'GAMMAINV'; 		$args = 3;	break;
5515
+					case 288: $function = 'CEILING'; 		$args = 2;	break;
5516
+					case 289: $function = 'HYPGEOMDIST';	$args = 4;	break;
5517
+					case 290: $function = 'LOGNORMDIST';	$args = 3;	break;
5518
+					case 291: $function = 'LOGINV';			$args = 3;	break;
5519
+					case 292: $function = 'NEGBINOMDIST';	$args = 3;	break;
5520
+					case 293: $function = 'NORMDIST';		$args = 4;	break;
5521
+					case 294: $function = 'NORMSDIST';		$args = 1;	break;
5522
+					case 295: $function = 'NORMINV';		$args = 3;	break;
5523
+					case 296: $function = 'NORMSINV';		$args = 1;	break;
5524
+					case 297: $function = 'STANDARDIZE';	$args = 3;	break;
5525
+					case 298: $function = 'ODD';			$args = 1;	break;
5526
+					case 299: $function = 'PERMUT';			$args = 2;	break;
5527
+					case 300: $function = 'POISSON';		$args = 3;	break;
5528
+					case 301: $function = 'TDIST';			$args = 3;	break;
5529
+					case 302: $function = 'WEIBULL';		$args = 4;	break;
5530
+					case 303: $function = 'SUMXMY2';		$args = 2;	break;
5531
+					case 304: $function = 'SUMX2MY2';		$args = 2;	break;
5532
+					case 305: $function = 'SUMX2PY2';		$args = 2;	break;
5533
+					case 306: $function = 'CHITEST';		$args = 2;	break;
5534
+					case 307: $function = 'CORREL';			$args = 2;	break;
5535
+					case 308: $function = 'COVAR';			$args = 2;	break;
5536
+					case 309: $function = 'FORECAST';		$args = 3;	break;
5537
+					case 310: $function = 'FTEST';			$args = 2;	break;
5538
+					case 311: $function = 'INTERCEPT';		$args = 2;	break;
5539
+					case 312: $function = 'PEARSON';		$args = 2;	break;
5540
+					case 313: $function = 'RSQ';			$args = 2;	break;
5541
+					case 314: $function = 'STEYX';			$args = 2;	break;
5542
+					case 315: $function = 'SLOPE';			$args = 2;	break;
5543
+					case 316: $function = 'TTEST';			$args = 4;	break;
5544
+					case 325: $function = 'LARGE';			$args = 2;	break;
5545
+					case 326: $function = 'SMALL';			$args = 2;	break;
5546
+					case 327: $function = 'QUARTILE';		$args = 2;	break;
5547
+					case 328: $function = 'PERCENTILE';		$args = 2;	break;
5548
+					case 331: $function = 'TRIMMEAN';		$args = 2;	break;
5549
+					case 332: $function = 'TINV';			$args = 2;	break;
5550
+					case 337: $function = 'POWER';			$args = 2;	break;
5551
+					case 342: $function = 'RADIANS';		$args = 1;	break;
5552
+					case 343: $function = 'DEGREES';		$args = 1;	break;
5553
+					case 346: $function = 'COUNTIF';		$args = 2;	break;
5554
+					case 347: $function = 'COUNTBLANK';		$args = 1;	break;
5555
+					case 350: $function = 'ISPMT';			$args = 4;	break;
5556
+					case 351: $function = 'DATEDIF';		$args = 3;	break;
5557
+					case 352: $function = 'DATESTRING';		$args = 1;	break;
5558
+					case 353: $function = 'NUMBERSTRING';	$args = 2;	break;
5559
+					case 360: $function = 'PHONETIC';		$args = 1;	break;
5560
+					case 368: $function = 'BAHTTEXT';		$args = 1;	break;
5561
+					default:
5562
+						throw new Exception('Unrecognized function in formula');
5563
+						break;
5564
+				}
5669 5565
 			$data = array('function' => $function, 'args' => $args);
5670 5566
 			break;
5671
-		case 0x23:	//	index to defined name
5672
-		case 0x43:
5673
-		case 0x63:
5674
-			$name = 'tName';
5675
-			$size = 5;
5676
-			// offset: 1; size: 2; one-based index to definedname record
5677
-			$definedNameIndex = self::_GetInt2d($formulaData, 1) - 1;
5678
-			// offset: 2; size: 2; not used
5679
-			$data = $this->_definedname[$definedNameIndex]['name'];
5680
-			break;
5681
-		case 0x24:	//	single cell reference e.g. A5
5682
-		case 0x44:
5683
-		case 0x64:
5684
-			$name = 'tRef';
5685
-			$size = 5;
5686
-			$data = $this->_readBIFF8CellAddress(substr($formulaData, 1, 4));
5687
-			break;
5688
-		case 0x25:	//	cell range reference to cells in the same sheet (2d)
5689
-		case 0x45:
5690
-		case 0x65:
5691
-			$name = 'tArea';
5692
-			$size = 9;
5693
-			$data = $this->_readBIFF8CellRangeAddress(substr($formulaData, 1, 8));
5694
-			break;
5695
-		case 0x26:	//	Constant reference sub-expression
5696
-		case 0x46:
5697
-		case 0x66:
5698
-			$name = 'tMemArea';
5699
-			// offset: 1; size: 4; not used
5700
-			// offset: 5; size: 2; size of the following subexpression
5701
-			$subSize = self::_GetInt2d($formulaData, 5);
5702
-			$size = 7 + $subSize;
5703
-			$data = $this->_getFormulaFromData(substr($formulaData, 7, $subSize));
5704
-			break;
5705
-		case 0x27:	//	Deleted constant reference sub-expression
5706
-		case 0x47:
5707
-		case 0x67:
5708
-			$name = 'tMemErr';
5709
-			// offset: 1; size: 4; not used
5710
-			// offset: 5; size: 2; size of the following subexpression
5711
-			$subSize = self::_GetInt2d($formulaData, 5);
5712
-			$size = 7 + $subSize;
5713
-			$data = $this->_getFormulaFromData(substr($formulaData, 7, $subSize));
5714
-			break;
5715
-		case 0x29:	//	Variable reference sub-expression
5716
-		case 0x49:
5717
-		case 0x69:
5718
-			$name = 'tMemFunc';
5719
-			// offset: 1; size: 2; size of the following sub-expression
5720
-			$subSize = self::_GetInt2d($formulaData, 1);
5721
-			$size = 3 + $subSize;
5722
-			$data = $this->_getFormulaFromData(substr($formulaData, 3, $subSize));
5567
+			case 0x22:	//	function with variable number of arguments
5568
+			case 0x42:
5569
+			case 0x62:
5570
+				$name = 'tFuncV';
5571
+				$size = 4;
5572
+				// offset: 1; size: 1; number of arguments
5573
+				$args = ord($formulaData[1]);
5574
+				// offset: 2: size: 2; index to built-in sheet function
5575
+				$index = self::_GetInt2d($formulaData, 2);
5576
+				switch ($index) {
5577
+					case   0: $function = 'COUNT';			break;
5578
+					case   1: $function = 'IF';				break;
5579
+					case   4: $function = 'SUM';			break;
5580
+					case   5: $function = 'AVERAGE';		break;
5581
+					case   6: $function = 'MIN';			break;
5582
+					case   7: $function = 'MAX';			break;
5583
+					case   8: $function = 'ROW';			break;
5584
+					case   9: $function = 'COLUMN';			break;
5585
+					case  11: $function = 'NPV';			break;
5586
+					case  12: $function = 'STDEV';			break;
5587
+					case  13: $function = 'DOLLAR';			break;
5588
+					case  14: $function = 'FIXED';			break;
5589
+					case  28: $function = 'LOOKUP';			break;
5590
+					case  29: $function = 'INDEX';			break;
5591
+					case  36: $function = 'AND';			break;
5592
+					case  37: $function = 'OR';				break;
5593
+					case  46: $function = 'VAR';			break;
5594
+					case  49: $function = 'LINEST';			break;
5595
+					case  50: $function = 'TREND';			break;
5596
+					case  51: $function = 'LOGEST';			break;
5597
+					case  52: $function = 'GROWTH';			break;
5598
+					case  56: $function = 'PV';				break;
5599
+					case  57: $function = 'FV';				break;
5600
+					case  58: $function = 'NPER';			break;
5601
+					case  59: $function = 'PMT';			break;
5602
+					case  60: $function = 'RATE';			break;
5603
+					case  62: $function = 'IRR';			break;
5604
+					case  64: $function = 'MATCH';			break;
5605
+					case  70: $function = 'WEEKDAY';		break;
5606
+					case  78: $function = 'OFFSET';			break;
5607
+					case  82: $function = 'SEARCH';			break;
5608
+					case 100: $function = 'CHOOSE';			break;
5609
+					case 101: $function = 'HLOOKUP';		break;
5610
+					case 102: $function = 'VLOOKUP';		break;
5611
+					case 109: $function = 'LOG';			break;
5612
+					case 115: $function = 'LEFT';			break;
5613
+					case 116: $function = 'RIGHT';			break;
5614
+					case 120: $function = 'SUBSTITUTE';		break;
5615
+					case 124: $function = 'FIND';			break;
5616
+					case 125: $function = 'CELL';			break;
5617
+					case 144: $function = 'DDB';			break;
5618
+					case 148: $function = 'INDIRECT';		break;
5619
+					case 167: $function = 'IPMT';			break;
5620
+					case 168: $function = 'PPMT';			break;
5621
+					case 169: $function = 'COUNTA';			break;
5622
+					case 183: $function = 'PRODUCT';		break;
5623
+					case 193: $function = 'STDEVP';			break;
5624
+					case 194: $function = 'VARP';			break;
5625
+					case 197: $function = 'TRUNC';			break;
5626
+					case 204: $function = 'USDOLLAR';		break;
5627
+					case 205: $function = 'FINDB';			break;
5628
+					case 206: $function = 'SEARCHB';		break;
5629
+					case 208: $function = 'LEFTB';			break;
5630
+					case 209: $function = 'RIGHTB';			break;
5631
+					case 216: $function = 'RANK';			break;
5632
+					case 219: $function = 'ADDRESS';		break;
5633
+					case 220: $function = 'DAYS360';		break;
5634
+					case 222: $function = 'VDB';			break;
5635
+					case 227: $function = 'MEDIAN';			break;
5636
+					case 228: $function = 'SUMPRODUCT';		break;
5637
+					case 247: $function = 'DB';				break;
5638
+					case 255: $function = '';				break;
5639
+					case 269: $function = 'AVEDEV';			break;
5640
+					case 270: $function = 'BETADIST';		break;
5641
+					case 272: $function = 'BETAINV';		break;
5642
+					case 317: $function = 'PROB';			break;
5643
+					case 318: $function = 'DEVSQ';			break;
5644
+					case 319: $function = 'GEOMEAN';		break;
5645
+					case 320: $function = 'HARMEAN';		break;
5646
+					case 321: $function = 'SUMSQ';			break;
5647
+					case 322: $function = 'KURT';			break;
5648
+					case 323: $function = 'SKEW';			break;
5649
+					case 324: $function = 'ZTEST';			break;
5650
+					case 329: $function = 'PERCENTRANK';	break;
5651
+					case 330: $function = 'MODE';			break;
5652
+					case 336: $function = 'CONCATENATE';	break;
5653
+					case 344: $function = 'SUBTOTAL';		break;
5654
+					case 345: $function = 'SUMIF';			break;
5655
+					case 354: $function = 'ROMAN';			break;
5656
+					case 358: $function = 'GETPIVOTDATA';	break;
5657
+					case 359: $function = 'HYPERLINK';		break;
5658
+					case 361: $function = 'AVERAGEA';		break;
5659
+					case 362: $function = 'MAXA';			break;
5660
+					case 363: $function = 'MINA';			break;
5661
+					case 364: $function = 'STDEVPA';		break;
5662
+					case 365: $function = 'VARPA';			break;
5663
+					case 366: $function = 'STDEVA';			break;
5664
+					case 367: $function = 'VARA';			break;
5665
+					default:
5666
+						throw new Exception('Unrecognized function in formula');
5667
+						break;
5668
+				}
5669
+			$data = array('function' => $function, 'args' => $args);
5723 5670
 			break;
5671
+			case 0x23:	//	index to defined name
5672
+			case 0x43:
5673
+			case 0x63:
5674
+				$name = 'tName';
5675
+				$size = 5;
5676
+				// offset: 1; size: 2; one-based index to definedname record
5677
+				$definedNameIndex = self::_GetInt2d($formulaData, 1) - 1;
5678
+				// offset: 2; size: 2; not used
5679
+				$data = $this->_definedname[$definedNameIndex]['name'];
5680
+				break;
5681
+			case 0x24:	//	single cell reference e.g. A5
5682
+			case 0x44:
5683
+			case 0x64:
5684
+				$name = 'tRef';
5685
+				$size = 5;
5686
+				$data = $this->_readBIFF8CellAddress(substr($formulaData, 1, 4));
5687
+				break;
5688
+			case 0x25:	//	cell range reference to cells in the same sheet (2d)
5689
+			case 0x45:
5690
+			case 0x65:
5691
+				$name = 'tArea';
5692
+				$size = 9;
5693
+				$data = $this->_readBIFF8CellRangeAddress(substr($formulaData, 1, 8));
5694
+				break;
5695
+			case 0x26:	//	Constant reference sub-expression
5696
+			case 0x46:
5697
+			case 0x66:
5698
+				$name = 'tMemArea';
5699
+				// offset: 1; size: 4; not used
5700
+				// offset: 5; size: 2; size of the following subexpression
5701
+				$subSize = self::_GetInt2d($formulaData, 5);
5702
+				$size = 7 + $subSize;
5703
+				$data = $this->_getFormulaFromData(substr($formulaData, 7, $subSize));
5704
+				break;
5705
+			case 0x27:	//	Deleted constant reference sub-expression
5706
+			case 0x47:
5707
+			case 0x67:
5708
+				$name = 'tMemErr';
5709
+				// offset: 1; size: 4; not used
5710
+				// offset: 5; size: 2; size of the following subexpression
5711
+				$subSize = self::_GetInt2d($formulaData, 5);
5712
+				$size = 7 + $subSize;
5713
+				$data = $this->_getFormulaFromData(substr($formulaData, 7, $subSize));
5714
+				break;
5715
+			case 0x29:	//	Variable reference sub-expression
5716
+			case 0x49:
5717
+			case 0x69:
5718
+				$name = 'tMemFunc';
5719
+				// offset: 1; size: 2; size of the following sub-expression
5720
+				$subSize = self::_GetInt2d($formulaData, 1);
5721
+				$size = 3 + $subSize;
5722
+				$data = $this->_getFormulaFromData(substr($formulaData, 3, $subSize));
5723
+				break;
5724 5724
 
5725
-		case 0x2C: // Relative 2d cell reference reference, used in shared formulas and some other places
5726
-		case 0x4C:
5727
-		case 0x6C:
5728
-			$name = 'tRefN';
5729
-			$size = 5;
5730
-			$data = $this->_readBIFF8CellAddressB(substr($formulaData, 1, 4), $baseCell);
5731
-			break;
5725
+			case 0x2C: // Relative 2d cell reference reference, used in shared formulas and some other places
5726
+			case 0x4C:
5727
+			case 0x6C:
5728
+				$name = 'tRefN';
5729
+				$size = 5;
5730
+				$data = $this->_readBIFF8CellAddressB(substr($formulaData, 1, 4), $baseCell);
5731
+				break;
5732 5732
 
5733
-		case 0x2D:	//	Relative 2d range reference
5734
-		case 0x4D:
5735
-		case 0x6D:
5736
-			$name = 'tAreaN';
5737
-			$size = 9;
5738
-			$data = $this->_readBIFF8CellRangeAddressB(substr($formulaData, 1, 8), $baseCell);
5739
-			break;
5733
+			case 0x2D:	//	Relative 2d range reference
5734
+			case 0x4D:
5735
+			case 0x6D:
5736
+				$name = 'tAreaN';
5737
+				$size = 9;
5738
+				$data = $this->_readBIFF8CellRangeAddressB(substr($formulaData, 1, 8), $baseCell);
5739
+				break;
5740 5740
 
5741
-		case 0x39:	//	External name
5742
-		case 0x59:
5743
-		case 0x79:
5744
-			$name = 'tNameX';
5745
-			$size = 7;
5746
-			// offset: 1; size: 2; index to REF entry in EXTERNSHEET record
5747
-			// offset: 3; size: 2; one-based index to DEFINEDNAME or EXTERNNAME record
5748
-			$index = self::_GetInt2d($formulaData, 3);
5749
-			// assume index is to EXTERNNAME record
5750
-			$data = $this->_externalNames[$index - 1]['name'];
5751
-			// offset: 5; size: 2; not used
5752
-			break;
5741
+			case 0x39:	//	External name
5742
+			case 0x59:
5743
+			case 0x79:
5744
+				$name = 'tNameX';
5745
+				$size = 7;
5746
+				// offset: 1; size: 2; index to REF entry in EXTERNSHEET record
5747
+				// offset: 3; size: 2; one-based index to DEFINEDNAME or EXTERNNAME record
5748
+				$index = self::_GetInt2d($formulaData, 3);
5749
+				// assume index is to EXTERNNAME record
5750
+				$data = $this->_externalNames[$index - 1]['name'];
5751
+				// offset: 5; size: 2; not used
5752
+				break;
5753 5753
 
5754
-		case 0x3A:	//	3d reference to cell
5755
-		case 0x5A:
5756
-		case 0x7A:
5757
-			$name = 'tRef3d';
5758
-			$size = 7;
5754
+			case 0x3A:	//	3d reference to cell
5755
+			case 0x5A:
5756
+			case 0x7A:
5757
+				$name = 'tRef3d';
5758
+				$size = 7;
5759 5759
 
5760
-			try {
5761
-				// offset: 1; size: 2; index to REF entry
5762
-				$sheetRange = $this->_readSheetRangeByRefIndex(self::_GetInt2d($formulaData, 1));
5763
-				// offset: 3; size: 4; cell address
5764
-				$cellAddress = $this->_readBIFF8CellAddress(substr($formulaData, 3, 4));
5760
+				try {
5761
+					// offset: 1; size: 2; index to REF entry
5762
+					$sheetRange = $this->_readSheetRangeByRefIndex(self::_GetInt2d($formulaData, 1));
5763
+					// offset: 3; size: 4; cell address
5764
+					$cellAddress = $this->_readBIFF8CellAddress(substr($formulaData, 3, 4));
5765 5765
 
5766
-				$data = "$sheetRange!$cellAddress";
5767
-			} catch (Exception $e) {
5768
-				// deleted sheet reference
5769
-				$data = '#REF!';
5770
-			}
5766
+					$data = "$sheetRange!$cellAddress";
5767
+				} catch (Exception $e) {
5768
+					// deleted sheet reference
5769
+					$data = '#REF!';
5770
+				}
5771 5771
 
5772
-			break;
5773
-		case 0x3B:	//	3d reference to cell range
5774
-		case 0x5B:
5775
-		case 0x7B:
5776
-			$name = 'tArea3d';
5777
-			$size = 11;
5772
+				break;
5773
+			case 0x3B:	//	3d reference to cell range
5774
+			case 0x5B:
5775
+			case 0x7B:
5776
+				$name = 'tArea3d';
5777
+				$size = 11;
5778 5778
 
5779
-			try {
5780
-				// offset: 1; size: 2; index to REF entry
5781
-				$sheetRange = $this->_readSheetRangeByRefIndex(self::_GetInt2d($formulaData, 1));
5782
-				// offset: 3; size: 8; cell address
5783
-				$cellRangeAddress = $this->_readBIFF8CellRangeAddress(substr($formulaData, 3, 8));
5779
+				try {
5780
+					// offset: 1; size: 2; index to REF entry
5781
+					$sheetRange = $this->_readSheetRangeByRefIndex(self::_GetInt2d($formulaData, 1));
5782
+					// offset: 3; size: 8; cell address
5783
+					$cellRangeAddress = $this->_readBIFF8CellRangeAddress(substr($formulaData, 3, 8));
5784 5784
 
5785
-				$data = "$sheetRange!$cellRangeAddress";
5786
-			} catch (Exception $e) {
5787
-				// deleted sheet reference
5788
-				$data = '#REF!';
5789
-			}
5785
+					$data = "$sheetRange!$cellRangeAddress";
5786
+				} catch (Exception $e) {
5787
+					// deleted sheet reference
5788
+					$data = '#REF!';
5789
+				}
5790 5790
 
5791
-			break;
5792
-		// Unknown cases	// don't know how to deal with
5793
-		default:
5794
-			throw new Exception('Unrecognized token ' . sprintf('%02X', $id) . ' in formula');
5795
-			break;
5791
+				break;
5792
+			// Unknown cases	// don't know how to deal with
5793
+			default:
5794
+				throw new Exception('Unrecognized token ' . sprintf('%02X', $id) . ' in formula');
5795
+				break;
5796 5796
 		}
5797 5797
 
5798 5798
 		return array(
@@ -6259,35 +6259,35 @@  discard block
 block discarded – undo
6259 6259
 		$identifier = ord($valueData[0]);
6260 6260
 
6261 6261
 		switch ($identifier) {
6262
-		case 0x00: // empty constant (what is this?)
6263
-			$value = '';
6264
-			$size = 9;
6265
-			break;
6266
-		case 0x01: // number
6267
-			// offset: 1; size: 8; IEEE 754 floating-point value
6268
-			$value = self::_extractNumber(substr($valueData, 1, 8));
6269
-			$size = 9;
6270
-			break;
6271
-		case 0x02: // string value
6272
-			// offset: 1; size: var; Unicode string, 16-bit string length
6273
-			$string = self::_readUnicodeStringLong(substr($valueData, 1));
6274
-			$value = '"' . $string['value'] . '"';
6275
-			$size = 1 + $string['size'];
6276
-			break;
6277
-		case 0x04: // boolean
6278
-			// offset: 1; size: 1; 0 = FALSE, 1 = TRUE
6279
-			if (ord($valueData[1])) {
6280
-				$value = 'TRUE';
6281
-			} else {
6282
-				$value = 'FALSE';
6283
-			}
6284
-			$size = 9;
6285
-			break;
6286
-		case 0x10: // error code
6287
-			// offset: 1; size: 1; error code
6288
-			$value = self::_mapErrorCode(ord($valueData[1]));
6289
-			$size = 9;
6290
-			break;
6262
+			case 0x00: // empty constant (what is this?)
6263
+				$value = '';
6264
+				$size = 9;
6265
+				break;
6266
+			case 0x01: // number
6267
+				// offset: 1; size: 8; IEEE 754 floating-point value
6268
+				$value = self::_extractNumber(substr($valueData, 1, 8));
6269
+				$size = 9;
6270
+				break;
6271
+			case 0x02: // string value
6272
+				// offset: 1; size: var; Unicode string, 16-bit string length
6273
+				$string = self::_readUnicodeStringLong(substr($valueData, 1));
6274
+				$value = '"' . $string['value'] . '"';
6275
+				$size = 1 + $string['size'];
6276
+				break;
6277
+			case 0x04: // boolean
6278
+				// offset: 1; size: 1; 0 = FALSE, 1 = TRUE
6279
+				if (ord($valueData[1])) {
6280
+					$value = 'TRUE';
6281
+				} else {
6282
+					$value = 'FALSE';
6283
+				}
6284
+				$size = 9;
6285
+				break;
6286
+			case 0x10: // error code
6287
+				// offset: 1; size: 1; error code
6288
+				$value = self::_mapErrorCode(ord($valueData[1]));
6289
+				$size = 9;
6290
+				break;
6291 6291
 		}
6292 6292
 		return array(
6293 6293
 			'value' => $value,
Please login to merge, or discard this patch.
app/Vendor/PHPExcel/PHPExcel/Shared/OLE.php 1 patch
Switch Indentation   +13 added lines, -13 removed lines patch added patch discarded remove patch
@@ -275,19 +275,19 @@
 block discarded – undo
275 275
 			$name = str_replace("\x00", "", $nameUtf16);
276 276
 			$type = self::_readInt1($fh);
277 277
 			switch ($type) {
278
-			case self::OLE_PPS_TYPE_ROOT:
279
-				$pps = new PHPExcel_Shared_OLE_PPS_Root(null, null, array());
280
-				$this->root = $pps;
281
-				break;
282
-			case self::OLE_PPS_TYPE_DIR:
283
-				$pps = new PHPExcel_Shared_OLE_PPS(null, null, null, null, null,
284
-								   null, null, null, null, array());
285
-				break;
286
-			case self::OLE_PPS_TYPE_FILE:
287
-				$pps = new PHPExcel_Shared_OLE_PPS_File($name);
288
-				break;
289
-			default:
290
-				continue;
278
+				case self::OLE_PPS_TYPE_ROOT:
279
+					$pps = new PHPExcel_Shared_OLE_PPS_Root(null, null, array());
280
+					$this->root = $pps;
281
+					break;
282
+				case self::OLE_PPS_TYPE_DIR:
283
+					$pps = new PHPExcel_Shared_OLE_PPS(null, null, null, null, null,
284
+								   	null, null, null, null, array());
285
+					break;
286
+				case self::OLE_PPS_TYPE_FILE:
287
+					$pps = new PHPExcel_Shared_OLE_PPS_File($name);
288
+					break;
289
+				default:
290
+					continue;
291 291
 			}
292 292
 			fseek($fh, 1, SEEK_CUR);
293 293
 			$pps->Type    = $type;
Please login to merge, or discard this patch.
app/Vendor/PHPExcel/PHPExcel/Style/Border.php 1 patch
Switch Indentation   +30 added lines, -30 removed lines patch added patch discarded remove patch
@@ -211,45 +211,45 @@
 block discarded – undo
211 211
 	public function getStyleArray($array)
212 212
 	{
213 213
 		switch ($this->_parentPropertyName) {
214
-		case '_allBorders':
215
-			$key = 'allborders';
216
-			break;
214
+			case '_allBorders':
215
+				$key = 'allborders';
216
+				break;
217 217
 
218
-		case '_bottom':
219
-			$key = 'bottom';
220
-			break;
218
+			case '_bottom':
219
+				$key = 'bottom';
220
+				break;
221 221
 
222
-		case '_diagonal':
223
-			$key = 'diagonal';
224
-			break;
222
+			case '_diagonal':
223
+				$key = 'diagonal';
224
+				break;
225 225
 
226
-		case '_horizontal':
227
-			$key = 'horizontal';
228
-			break;
226
+			case '_horizontal':
227
+				$key = 'horizontal';
228
+				break;
229 229
 
230
-		case '_inside':
231
-			$key = 'inside';
232
-			break;
230
+			case '_inside':
231
+				$key = 'inside';
232
+				break;
233 233
 
234
-		case '_left':
235
-			$key = 'left';
236
-			break;
234
+			case '_left':
235
+				$key = 'left';
236
+				break;
237 237
 
238
-		case '_outline':
239
-			$key = 'outline';
240
-			break;
238
+			case '_outline':
239
+				$key = 'outline';
240
+				break;
241 241
 
242
-		case '_right':
243
-			$key = 'right';
244
-			break;
242
+			case '_right':
243
+				$key = 'right';
244
+				break;
245 245
 
246
-		case '_top':
247
-			$key = 'top';
248
-			break;
246
+			case '_top':
247
+				$key = 'top';
248
+				break;
249 249
 
250
-		case '_vertical':
251
-			$key = 'vertical';
252
-			break;
250
+			case '_vertical':
251
+				$key = 'vertical';
252
+				break;
253 253
 		}
254 254
 		return $this->_parent->getStyleArray(array($key => $array));
255 255
 	}
Please login to merge, or discard this patch.
app/Vendor/PHPExcel/PHPExcel/Style/Color.php 1 patch
Switch Indentation   +18 added lines, -18 removed lines patch added patch discarded remove patch
@@ -131,17 +131,17 @@  discard block
 block discarded – undo
131 131
 	public function getSharedComponent()
132 132
 	{
133 133
 		switch ($this->_parentPropertyName) {
134
-		case '_endColor':
135
-			return $this->_parent->getSharedComponent()->getEndColor();
136
-			break;
134
+			case '_endColor':
135
+				return $this->_parent->getSharedComponent()->getEndColor();
136
+				break;
137 137
 
138
-		case '_color':
139
-			return $this->_parent->getSharedComponent()->getColor();
140
-			break;
138
+			case '_color':
139
+				return $this->_parent->getSharedComponent()->getColor();
140
+				break;
141 141
 
142
-		case '_startColor':
143
-			return $this->_parent->getSharedComponent()->getStartColor();
144
-			break;
142
+			case '_startColor':
143
+				return $this->_parent->getSharedComponent()->getStartColor();
144
+				break;
145 145
 		}
146 146
 	}
147 147
 
@@ -186,17 +186,17 @@  discard block
 block discarded – undo
186 186
 	public function getStyleArray($array)
187 187
 	{
188 188
 		switch ($this->_parentPropertyName) {
189
-		case '_endColor':
190
-			$key = 'endcolor';
191
-			break;
189
+			case '_endColor':
190
+				$key = 'endcolor';
191
+				break;
192 192
 
193
-		case '_color':
194
-			$key = 'color';
195
-			break;
193
+			case '_color':
194
+				$key = 'color';
195
+				break;
196 196
 
197
-		case '_startColor':
198
-			$key = 'startcolor';
199
-			break;
197
+			case '_startColor':
198
+				$key = 'startcolor';
199
+				break;
200 200
 
201 201
 		}
202 202
 		return $this->_parent->getStyleArray(array($key => $array));
Please login to merge, or discard this patch.
app/Vendor/PHPExcel/PHPExcel/Writer/Excel5.php 1 patch
Switch Indentation   +38 added lines, -38 removed lines patch added patch discarded remove patch
@@ -440,33 +440,33 @@  discard block
 block discarded – undo
440 440
 
441 441
 					switch ($imageFormat) {
442 442
 
443
-					case 1: // GIF, not supported by BIFF8, we convert to PNG
444
-						$blipType = PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE::BLIPTYPE_PNG;
445
-						ob_start();
446
-						imagepng(imagecreatefromgif($filename));
447
-						$blipData = ob_get_contents();
448
-						ob_end_clean();
449
-						break;
450
-
451
-					case 2: // JPEG
452
-						$blipType = PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE::BLIPTYPE_JPEG;
453
-						$blipData = file_get_contents($filename);
454
-						break;
455
-
456
-					case 3: // PNG
457
-						$blipType = PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE::BLIPTYPE_PNG;
458
-						$blipData = file_get_contents($filename);
459
-						break;
460
-
461
-					case 6: // Windows DIB (BMP), we convert to PNG
462
-						$blipType = PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE::BLIPTYPE_PNG;
463
-						ob_start();
464
-						imagepng(PHPExcel_Shared_Drawing::imagecreatefrombmp($filename));
465
-						$blipData = ob_get_contents();
466
-						ob_end_clean();
467
-						break;
468
-
469
-					default: continue 2;
443
+						case 1: // GIF, not supported by BIFF8, we convert to PNG
444
+							$blipType = PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE::BLIPTYPE_PNG;
445
+							ob_start();
446
+							imagepng(imagecreatefromgif($filename));
447
+							$blipData = ob_get_contents();
448
+							ob_end_clean();
449
+							break;
450
+
451
+						case 2: // JPEG
452
+							$blipType = PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE::BLIPTYPE_JPEG;
453
+							$blipData = file_get_contents($filename);
454
+							break;
455
+
456
+						case 3: // PNG
457
+							$blipType = PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE::BLIPTYPE_PNG;
458
+							$blipData = file_get_contents($filename);
459
+							break;
460
+
461
+						case 6: // Windows DIB (BMP), we convert to PNG
462
+							$blipType = PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE::BLIPTYPE_PNG;
463
+							ob_start();
464
+							imagepng(PHPExcel_Shared_Drawing::imagecreatefrombmp($filename));
465
+							$blipData = ob_get_contents();
466
+							ob_end_clean();
467
+							break;
468
+
469
+						default: continue 2;
470 470
 
471 471
 					}
472 472
 
@@ -483,17 +483,17 @@  discard block
 block discarded – undo
483 483
 
484 484
 					switch ($drawing->getRenderingFunction()) {
485 485
 
486
-					case PHPExcel_Worksheet_MemoryDrawing::RENDERING_JPEG:
487
-						$blipType = PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE::BLIPTYPE_JPEG;
488
-						$renderingFunction = 'imagejpeg';
489
-						break;
490
-
491
-					case PHPExcel_Worksheet_MemoryDrawing::RENDERING_GIF:
492
-					case PHPExcel_Worksheet_MemoryDrawing::RENDERING_PNG:
493
-					case PHPExcel_Worksheet_MemoryDrawing::RENDERING_DEFAULT:
494
-						$blipType = PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE::BLIPTYPE_PNG;
495
-						$renderingFunction = 'imagepng';
496
-						break;
486
+						case PHPExcel_Worksheet_MemoryDrawing::RENDERING_JPEG:
487
+							$blipType = PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE::BLIPTYPE_JPEG;
488
+							$renderingFunction = 'imagejpeg';
489
+							break;
490
+
491
+						case PHPExcel_Worksheet_MemoryDrawing::RENDERING_GIF:
492
+						case PHPExcel_Worksheet_MemoryDrawing::RENDERING_PNG:
493
+						case PHPExcel_Worksheet_MemoryDrawing::RENDERING_DEFAULT:
494
+							$blipType = PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE::BLIPTYPE_PNG;
495
+							$renderingFunction = 'imagepng';
496
+							break;
497 497
 
498 498
 					}
499 499
 
Please login to merge, or discard this patch.
app/Vendor/PHPExcel/PHPExcel/Writer/Excel5/Escher.php 1 patch
Switch Indentation   +302 added lines, -302 removed lines patch added patch discarded remove patch
@@ -73,426 +73,426 @@
 block discarded – undo
73 73
 
74 74
 		switch (get_class($this->_object)) {
75 75
 
76
-		case 'PHPExcel_Shared_Escher':
77
-			if ($dggContainer = $this->_object->getDggContainer()) {
78
-				$writer = new PHPExcel_Writer_Excel5_Escher($dggContainer);
79
-				$this->_data = $writer->close();
80
-			} else if ($dgContainer = $this->_object->getDgContainer()) {
81
-				$writer = new PHPExcel_Writer_Excel5_Escher($dgContainer);
82
-				$this->_data = $writer->close();
83
-				$this->_spOffsets = $writer->getSpOffsets();
84
-			}
85
-			break;
76
+			case 'PHPExcel_Shared_Escher':
77
+				if ($dggContainer = $this->_object->getDggContainer()) {
78
+					$writer = new PHPExcel_Writer_Excel5_Escher($dggContainer);
79
+					$this->_data = $writer->close();
80
+				} else if ($dgContainer = $this->_object->getDgContainer()) {
81
+					$writer = new PHPExcel_Writer_Excel5_Escher($dgContainer);
82
+					$this->_data = $writer->close();
83
+					$this->_spOffsets = $writer->getSpOffsets();
84
+				}
85
+				break;
86 86
 
87
-		case 'PHPExcel_Shared_Escher_DggContainer':
88
-			// this is a container record
87
+			case 'PHPExcel_Shared_Escher_DggContainer':
88
+				// this is a container record
89 89
 
90
-			// initialize
91
-			$innerData = '';
90
+				// initialize
91
+				$innerData = '';
92 92
 
93
-			// write the dgg
94
-			$recVer			= 0x0;
95
-			$recInstance	= 0x0000;
96
-			$recType		= 0xF006;
93
+				// write the dgg
94
+				$recVer			= 0x0;
95
+				$recInstance	= 0x0000;
96
+				$recType		= 0xF006;
97 97
 
98
-			$recVerInstance  = $recVer;
99
-			$recVerInstance |= $recInstance << 4;
98
+				$recVerInstance  = $recVer;
99
+				$recVerInstance |= $recInstance << 4;
100 100
 
101
-			// dgg data
102
-			$dggData =
103
-				pack('VVVV'
104
-					, $this->_object->getSpIdMax() // maximum shape identifier increased by one
105
-					, $this->_object->getCDgSaved() + 1 // number of file identifier clusters increased by one
106
-					, $this->_object->getCSpSaved()
107
-					, $this->_object->getCDgSaved() // count total number of drawings saved
108
-				);
101
+				// dgg data
102
+				$dggData =
103
+					pack('VVVV'
104
+						, $this->_object->getSpIdMax() // maximum shape identifier increased by one
105
+						, $this->_object->getCDgSaved() + 1 // number of file identifier clusters increased by one
106
+						, $this->_object->getCSpSaved()
107
+						, $this->_object->getCDgSaved() // count total number of drawings saved
108
+					);
109 109
 
110
-			// add file identifier clusters (one per drawing)
111
-			$IDCLs = $this->_object->getIDCLs();
110
+				// add file identifier clusters (one per drawing)
111
+				$IDCLs = $this->_object->getIDCLs();
112 112
 
113
-			foreach ($IDCLs as $dgId => $maxReducedSpId) {
114
-				$dggData .= pack('VV', $dgId, $maxReducedSpId + 1);
115
-			}
113
+				foreach ($IDCLs as $dgId => $maxReducedSpId) {
114
+					$dggData .= pack('VV', $dgId, $maxReducedSpId + 1);
115
+				}
116 116
 
117
-			$header = pack('vvV', $recVerInstance, $recType, strlen($dggData));
118
-			$innerData .= $header . $dggData;
117
+				$header = pack('vvV', $recVerInstance, $recType, strlen($dggData));
118
+				$innerData .= $header . $dggData;
119 119
 
120
-			// write the bstoreContainer
121
-			if ($bstoreContainer = $this->_object->getBstoreContainer()) {
122
-				$writer = new PHPExcel_Writer_Excel5_Escher($bstoreContainer);
123
-				$innerData .= $writer->close();
124
-			}
120
+				// write the bstoreContainer
121
+				if ($bstoreContainer = $this->_object->getBstoreContainer()) {
122
+					$writer = new PHPExcel_Writer_Excel5_Escher($bstoreContainer);
123
+					$innerData .= $writer->close();
124
+				}
125 125
 
126
-			// write the record
127
-			$recVer			= 0xF;
128
-			$recInstance	= 0x0000;
129
-			$recType		= 0xF000;
130
-			$length			= strlen($innerData);
126
+				// write the record
127
+				$recVer			= 0xF;
128
+				$recInstance	= 0x0000;
129
+				$recType		= 0xF000;
130
+				$length			= strlen($innerData);
131 131
 
132
-			$recVerInstance  = $recVer;
133
-			$recVerInstance |= $recInstance << 4;
132
+				$recVerInstance  = $recVer;
133
+				$recVerInstance |= $recInstance << 4;
134 134
 
135
-			$header = pack('vvV', $recVerInstance, $recType, $length);
135
+				$header = pack('vvV', $recVerInstance, $recType, $length);
136 136
 
137
-			$this->_data = $header . $innerData;
138
-			break;
137
+				$this->_data = $header . $innerData;
138
+				break;
139 139
 
140
-		case 'PHPExcel_Shared_Escher_DggContainer_BstoreContainer':
141
-			// this is a container record
140
+			case 'PHPExcel_Shared_Escher_DggContainer_BstoreContainer':
141
+				// this is a container record
142 142
 
143
-			// initialize
144
-			$innerData = '';
143
+				// initialize
144
+				$innerData = '';
145 145
 
146
-			// treat the inner data
147
-			if ($BSECollection = $this->_object->getBSECollection()) {
148
-				foreach ($BSECollection as $BSE) {
149
-					$writer = new PHPExcel_Writer_Excel5_Escher($BSE);
150
-					$innerData .= $writer->close();
146
+				// treat the inner data
147
+				if ($BSECollection = $this->_object->getBSECollection()) {
148
+					foreach ($BSECollection as $BSE) {
149
+						$writer = new PHPExcel_Writer_Excel5_Escher($BSE);
150
+						$innerData .= $writer->close();
151
+					}
151 152
 				}
152
-			}
153 153
 
154
-			// write the record
155
-			$recVer			= 0xF;
156
-			$recInstance	= count($this->_object->getBSECollection());
157
-			$recType		= 0xF001;
158
-			$length			= strlen($innerData);
154
+				// write the record
155
+				$recVer			= 0xF;
156
+				$recInstance	= count($this->_object->getBSECollection());
157
+				$recType		= 0xF001;
158
+				$length			= strlen($innerData);
159 159
 
160
-			$recVerInstance  = $recVer;
161
-			$recVerInstance |= $recInstance << 4;
160
+				$recVerInstance  = $recVer;
161
+				$recVerInstance |= $recInstance << 4;
162 162
 
163
-			$header = pack('vvV', $recVerInstance, $recType, $length);
163
+				$header = pack('vvV', $recVerInstance, $recType, $length);
164 164
 
165
-			$this->_data = $header . $innerData;
166
-			break;
165
+				$this->_data = $header . $innerData;
166
+				break;
167 167
 
168
-		case 'PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE':
169
-			// this is a semi-container record
168
+			case 'PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE':
169
+				// this is a semi-container record
170 170
 
171
-			// initialize
172
-			$innerData = '';
171
+				// initialize
172
+				$innerData = '';
173 173
 
174
-			// here we treat the inner data
175
-			if ($blip = $this->_object->getBlip()) {
176
-				$writer = new PHPExcel_Writer_Excel5_Escher($blip);
177
-				$innerData .= $writer->close();
178
-			}
174
+				// here we treat the inner data
175
+				if ($blip = $this->_object->getBlip()) {
176
+					$writer = new PHPExcel_Writer_Excel5_Escher($blip);
177
+					$innerData .= $writer->close();
178
+				}
179 179
 
180
-			// initialize
181
-			$data = '';
180
+				// initialize
181
+				$data = '';
182 182
 
183
-			$btWin32 = $this->_object->getBlipType();
184
-			$btMacOS = $this->_object->getBlipType();
185
-			$data .= pack('CC', $btWin32, $btMacOS);
183
+				$btWin32 = $this->_object->getBlipType();
184
+				$btMacOS = $this->_object->getBlipType();
185
+				$data .= pack('CC', $btWin32, $btMacOS);
186 186
 
187
-			$rgbUid = pack('VVVV', 0,0,0,0); // todo
188
-			$data .= $rgbUid;
187
+				$rgbUid = pack('VVVV', 0,0,0,0); // todo
188
+				$data .= $rgbUid;
189 189
 
190
-			$tag = 0;
191
-			$size = strlen($innerData);
192
-			$cRef = 1;
193
-			$foDelay = 0; //todo
194
-			$unused1 = 0x0;
195
-			$cbName = 0x0;
196
-			$unused2 = 0x0;
197
-			$unused3 = 0x0;
198
-			$data .= pack('vVVVCCCC', $tag, $size, $cRef, $foDelay, $unused1, $cbName, $unused2, $unused3);
190
+				$tag = 0;
191
+				$size = strlen($innerData);
192
+				$cRef = 1;
193
+				$foDelay = 0; //todo
194
+				$unused1 = 0x0;
195
+				$cbName = 0x0;
196
+				$unused2 = 0x0;
197
+				$unused3 = 0x0;
198
+				$data .= pack('vVVVCCCC', $tag, $size, $cRef, $foDelay, $unused1, $cbName, $unused2, $unused3);
199 199
 
200
-			$data .= $innerData;
200
+				$data .= $innerData;
201 201
 
202
-			// write the record
203
-			$recVer			= 0x2;
204
-			$recInstance	= $this->_object->getBlipType();
205
-			$recType		= 0xF007;
206
-			$length			= strlen($data);
202
+				// write the record
203
+				$recVer			= 0x2;
204
+				$recInstance	= $this->_object->getBlipType();
205
+				$recType		= 0xF007;
206
+				$length			= strlen($data);
207 207
 
208
-			$recVerInstance  = $recVer;
209
-			$recVerInstance |=	$recInstance << 4;
208
+				$recVerInstance  = $recVer;
209
+				$recVerInstance |=	$recInstance << 4;
210 210
 
211
-			$header = pack('vvV', $recVerInstance, $recType, $length);
211
+				$header = pack('vvV', $recVerInstance, $recType, $length);
212 212
 
213
-			$this->_data = $header;
213
+				$this->_data = $header;
214 214
 
215
-			$this->_data .= $data;
216
-			break;
215
+				$this->_data .= $data;
216
+				break;
217 217
 
218
-		case 'PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE_Blip':
219
-			// this is an atom record
218
+			case 'PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE_Blip':
219
+				// this is an atom record
220 220
 
221
-			// write the record
222
-			switch ($this->_object->getParent()->getBlipType()) {
221
+				// write the record
222
+				switch ($this->_object->getParent()->getBlipType()) {
223 223
 
224
-			case PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE::BLIPTYPE_JPEG:
225
-				// initialize
226
-				$innerData = '';
224
+					case PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE::BLIPTYPE_JPEG:
225
+						// initialize
226
+						$innerData = '';
227 227
 
228
-				$rgbUid1 = pack('VVVV', 0,0,0,0); // todo
229
-				$innerData .= $rgbUid1;
228
+						$rgbUid1 = pack('VVVV', 0,0,0,0); // todo
229
+						$innerData .= $rgbUid1;
230 230
 
231
-				$tag = 0xFF; // todo
232
-				$innerData .= pack('C', $tag);
231
+						$tag = 0xFF; // todo
232
+						$innerData .= pack('C', $tag);
233 233
 
234
-				$innerData .= $this->_object->getData();
234
+						$innerData .= $this->_object->getData();
235 235
 
236
-				$recVer			= 0x0;
237
-				$recInstance	= 0x46A;
238
-				$recType		= 0xF01D;
239
-				$length			= strlen($innerData);
236
+						$recVer			= 0x0;
237
+						$recInstance	= 0x46A;
238
+						$recType		= 0xF01D;
239
+						$length			= strlen($innerData);
240 240
 
241
-				$recVerInstance  = $recVer;
242
-				$recVerInstance |=	$recInstance << 4;
241
+						$recVerInstance  = $recVer;
242
+						$recVerInstance |=	$recInstance << 4;
243 243
 
244
-				$header = pack('vvV', $recVerInstance, $recType, $length);
244
+						$header = pack('vvV', $recVerInstance, $recType, $length);
245 245
 
246
-				$this->_data = $header;
246
+						$this->_data = $header;
247 247
 
248
-				$this->_data .= $innerData;
249
-				break;
248
+						$this->_data .= $innerData;
249
+						break;
250 250
 
251
-			case PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE::BLIPTYPE_PNG:
252
-				// initialize
253
-				$innerData = '';
251
+					case PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE::BLIPTYPE_PNG:
252
+						// initialize
253
+						$innerData = '';
254 254
 
255
-				$rgbUid1 = pack('VVVV', 0,0,0,0); // todo
256
-				$innerData .= $rgbUid1;
255
+						$rgbUid1 = pack('VVVV', 0,0,0,0); // todo
256
+						$innerData .= $rgbUid1;
257 257
 
258
-				$tag = 0xFF; // todo
259
-				$innerData .= pack('C', $tag);
258
+						$tag = 0xFF; // todo
259
+						$innerData .= pack('C', $tag);
260 260
 
261
-				$innerData .= $this->_object->getData();
261
+						$innerData .= $this->_object->getData();
262 262
 
263
-				$recVer			= 0x0;
264
-				$recInstance	= 0x6E0;
265
-				$recType		= 0xF01E;
266
-				$length			= strlen($innerData);
263
+						$recVer			= 0x0;
264
+						$recInstance	= 0x6E0;
265
+						$recType		= 0xF01E;
266
+						$length			= strlen($innerData);
267 267
 
268
-				$recVerInstance  = $recVer;
269
-				$recVerInstance |=	$recInstance << 4;
268
+						$recVerInstance  = $recVer;
269
+						$recVerInstance |=	$recInstance << 4;
270 270
 
271
-				$header = pack('vvV', $recVerInstance, $recType, $length);
271
+						$header = pack('vvV', $recVerInstance, $recType, $length);
272 272
 
273
-				$this->_data = $header;
273
+						$this->_data = $header;
274 274
 
275
-				$this->_data .= $innerData;
276
-				break;
275
+						$this->_data .= $innerData;
276
+						break;
277 277
 
278
-			}
278
+				}
279 279
 			break;
280 280
 
281
-		case 'PHPExcel_Shared_Escher_DgContainer':
282
-			// this is a container record
281
+			case 'PHPExcel_Shared_Escher_DgContainer':
282
+				// this is a container record
283 283
 
284
-			// initialize
285
-			$innerData = '';
284
+				// initialize
285
+				$innerData = '';
286
+
287
+				// write the dg
288
+				$recVer			= 0x0;
289
+				$recInstance	= $this->_object->getDgId();
290
+				$recType		= 0xF008;
291
+				$length			= 8;
286 292
 
287
-			// write the dg
288
-			$recVer			= 0x0;
289
-			$recInstance	= $this->_object->getDgId();
290
-			$recType		= 0xF008;
291
-			$length			= 8;
293
+				$recVerInstance  = $recVer;
294
+				$recVerInstance |= $recInstance << 4;
292 295
 
293
-			$recVerInstance  = $recVer;
294
-			$recVerInstance |= $recInstance << 4;
296
+				$header = pack('vvV', $recVerInstance, $recType, $length);
295 297
 
296
-			$header = pack('vvV', $recVerInstance, $recType, $length);
298
+				// number of shapes in this drawing (including group shape)
299
+				$countShapes = count($this->_object->getSpgrContainer()->getChildren());
300
+				$innerData .= $header . pack('VV', $countShapes, $this->_object->getLastSpId());
301
+				//$innerData .= $header . pack('VV', 0, 0);
297 302
 
298
-			// number of shapes in this drawing (including group shape)
299
-			$countShapes = count($this->_object->getSpgrContainer()->getChildren());
300
-			$innerData .= $header . pack('VV', $countShapes, $this->_object->getLastSpId());
301
-			//$innerData .= $header . pack('VV', 0, 0);
303
+				// write the spgrContainer
304
+				if ($spgrContainer = $this->_object->getSpgrContainer()) {
305
+					$writer = new PHPExcel_Writer_Excel5_Escher($spgrContainer);
306
+					$innerData .= $writer->close();
302 307
 
303
-			// write the spgrContainer
304
-			if ($spgrContainer = $this->_object->getSpgrContainer()) {
305
-				$writer = new PHPExcel_Writer_Excel5_Escher($spgrContainer);
306
-				$innerData .= $writer->close();
308
+					// get the shape offsets relative to the spgrContainer record
309
+					$spOffsets = $writer->getSpOffsets();
307 310
 
308
-				// get the shape offsets relative to the spgrContainer record
309
-				$spOffsets = $writer->getSpOffsets();
311
+					// save the shape offsets relative to dgContainer
312
+					foreach ($spOffsets as & $spOffset) {
313
+						$spOffset += 24; // add length of dgContainer header data (8 bytes) plus dg data (16 bytes)
314
+					}
310 315
 
311
-				// save the shape offsets relative to dgContainer
312
-				foreach ($spOffsets as & $spOffset) {
313
-					$spOffset += 24; // add length of dgContainer header data (8 bytes) plus dg data (16 bytes)
316
+					$this->_spOffsets = $spOffsets;
314 317
 				}
315 318
 
316
-				$this->_spOffsets = $spOffsets;
317
-			}
319
+				// write the record
320
+				$recVer			= 0xF;
321
+				$recInstance	= 0x0000;
322
+				$recType		= 0xF002;
323
+				$length			= strlen($innerData);
318 324
 
319
-			// write the record
320
-			$recVer			= 0xF;
321
-			$recInstance	= 0x0000;
322
-			$recType		= 0xF002;
323
-			$length			= strlen($innerData);
325
+				$recVerInstance  = $recVer;
326
+				$recVerInstance |= $recInstance << 4;
324 327
 
325
-			$recVerInstance  = $recVer;
326
-			$recVerInstance |= $recInstance << 4;
328
+				$header = pack('vvV', $recVerInstance, $recType, $length);
327 329
 
328
-			$header = pack('vvV', $recVerInstance, $recType, $length);
330
+				$this->_data = $header . $innerData;
331
+				break;
329 332
 
330
-			$this->_data = $header . $innerData;
331
-			break;
333
+			case 'PHPExcel_Shared_Escher_DgContainer_SpgrContainer':
334
+				// this is a container record
332 335
 
333
-		case 'PHPExcel_Shared_Escher_DgContainer_SpgrContainer':
334
-			// this is a container record
336
+				// initialize
337
+				$innerData = '';
335 338
 
336
-			// initialize
337
-			$innerData = '';
339
+				// initialize spape offsets
340
+				$totalSize = 8;
341
+				$spOffsets = array();
338 342
 
339
-			// initialize spape offsets
340
-			$totalSize = 8;
341
-			$spOffsets = array();
343
+				// treat the inner data
344
+				foreach ($this->_object->getChildren() as $spContainer) {
345
+					$writer = new PHPExcel_Writer_Excel5_Escher($spContainer);
346
+					$spData = $writer->close();
347
+					$innerData .= $spData;
342 348
 
343
-			// treat the inner data
344
-			foreach ($this->_object->getChildren() as $spContainer) {
345
-				$writer = new PHPExcel_Writer_Excel5_Escher($spContainer);
346
-				$spData = $writer->close();
347
-				$innerData .= $spData;
349
+					// save the shape offsets (where new shape records begin)
350
+					$totalSize += strlen($spData);
351
+					$spOffsets[] = $totalSize;
352
+				}
348 353
 
349
-				// save the shape offsets (where new shape records begin)
350
-				$totalSize += strlen($spData);
351
-				$spOffsets[] = $totalSize;
352
-			}
354
+				// write the record
355
+				$recVer			= 0xF;
356
+				$recInstance	= 0x0000;
357
+				$recType		= 0xF003;
358
+				$length			= strlen($innerData);
353 359
 
354
-			// write the record
355
-			$recVer			= 0xF;
356
-			$recInstance	= 0x0000;
357
-			$recType		= 0xF003;
358
-			$length			= strlen($innerData);
360
+				$recVerInstance  = $recVer;
361
+				$recVerInstance |= $recInstance << 4;
359 362
 
360
-			$recVerInstance  = $recVer;
361
-			$recVerInstance |= $recInstance << 4;
363
+				$header = pack('vvV', $recVerInstance, $recType, $length);
362 364
 
363
-			$header = pack('vvV', $recVerInstance, $recType, $length);
365
+				$this->_data = $header . $innerData;
366
+				$this->_spOffsets = $spOffsets;
367
+				break;
364 368
 
365
-			$this->_data = $header . $innerData;
366
-			$this->_spOffsets = $spOffsets;
367
-			break;
369
+			case 'PHPExcel_Shared_Escher_DgContainer_SpgrContainer_SpContainer':
370
+				// initialize
371
+				$data = '';
368 372
 
369
-		case 'PHPExcel_Shared_Escher_DgContainer_SpgrContainer_SpContainer':
370
-			// initialize
371
-			$data = '';
373
+				// build the data
372 374
 
373
-			// build the data
375
+				// write group shape record, if necessary?
376
+				if ($this->_object->getSpgr()) {
377
+					$recVer			= 0x1;
378
+					$recInstance	= 0x0000;
379
+					$recType		= 0xF009;
380
+					$length			= 0x00000010;
374 381
 
375
-			// write group shape record, if necessary?
376
-			if ($this->_object->getSpgr()) {
377
-				$recVer			= 0x1;
378
-				$recInstance	= 0x0000;
379
-				$recType		= 0xF009;
380
-				$length			= 0x00000010;
382
+					$recVerInstance  = $recVer;
383
+					$recVerInstance |= $recInstance << 4;
384
+
385
+					$header = pack('vvV', $recVerInstance, $recType, $length);
386
+
387
+					$data .= $header . pack('VVVV', 0,0,0,0);
388
+				}
389
+
390
+				// write the shape record
391
+				$recVer			= 0x2;
392
+				$recInstance	= $this->_object->getSpType(); // shape type
393
+				$recType		= 0xF00A;
394
+				$length			= 0x00000008;
381 395
 
382 396
 				$recVerInstance  = $recVer;
383 397
 				$recVerInstance |= $recInstance << 4;
384 398
 
385 399
 				$header = pack('vvV', $recVerInstance, $recType, $length);
386 400
 
387
-				$data .= $header . pack('VVVV', 0,0,0,0);
388
-			}
389
-
390
-			// write the shape record
391
-			$recVer			= 0x2;
392
-			$recInstance	= $this->_object->getSpType(); // shape type
393
-			$recType		= 0xF00A;
394
-			$length			= 0x00000008;
401
+				$data .= $header . pack('VV', $this->_object->getSpId(), $this->_object->getSpgr() ? 0x0005 : 0x0A00);
395 402
 
396
-			$recVerInstance  = $recVer;
397
-			$recVerInstance |= $recInstance << 4;
398 403
 
399
-			$header = pack('vvV', $recVerInstance, $recType, $length);
404
+				// the options
405
+				if ($this->_object->getOPTCollection()) {
406
+					$optData = '';
400 407
 
401
-			$data .= $header . pack('VV', $this->_object->getSpId(), $this->_object->getSpgr() ? 0x0005 : 0x0A00);
408
+					$recVer			= 0x3;
409
+					$recInstance	= count($this->_object->getOPTCollection());
410
+					$recType		= 0xF00B;
411
+					foreach ($this->_object->getOPTCollection() as $property => $value) {
412
+						$optData .= pack('vV', $property, $value);
413
+					}
414
+					$length			= strlen($optData);
402 415
 
416
+					$recVerInstance  = $recVer;
417
+					$recVerInstance |= $recInstance << 4;
403 418
 
404
-			// the options
405
-			if ($this->_object->getOPTCollection()) {
406
-				$optData = '';
407
-
408
-				$recVer			= 0x3;
409
-				$recInstance	= count($this->_object->getOPTCollection());
410
-				$recType		= 0xF00B;
411
-				foreach ($this->_object->getOPTCollection() as $property => $value) {
412
-					$optData .= pack('vV', $property, $value);
419
+					$header = pack('vvV', $recVerInstance, $recType, $length);
420
+					$data .= $header . $optData;
413 421
 				}
414
-				$length			= strlen($optData);
415 422
 
416
-				$recVerInstance  = $recVer;
417
-				$recVerInstance |= $recInstance << 4;
423
+				// the client anchor
424
+				if ($this->_object->getStartCoordinates()) {
425
+					$clientAnchorData = '';
418 426
 
419
-				$header = pack('vvV', $recVerInstance, $recType, $length);
420
-				$data .= $header . $optData;
421
-			}
427
+					$recVer			= 0x0;
428
+					$recInstance	= 0x0;
429
+					$recType		= 0xF010;
422 430
 
423
-			// the client anchor
424
-			if ($this->_object->getStartCoordinates()) {
425
-				$clientAnchorData = '';
431
+					// start coordinates
432
+					list($column, $row) = PHPExcel_Cell::coordinateFromString($this->_object->getStartCoordinates());
433
+					$c1 = PHPExcel_Cell::columnIndexFromString($column) - 1;
434
+					$r1 = $row - 1;
426 435
 
427
-				$recVer			= 0x0;
428
-				$recInstance	= 0x0;
429
-				$recType		= 0xF010;
436
+					// start offsetX
437
+					$startOffsetX = $this->_object->getStartOffsetX();
430 438
 
431
-				// start coordinates
432
-				list($column, $row) = PHPExcel_Cell::coordinateFromString($this->_object->getStartCoordinates());
433
-				$c1 = PHPExcel_Cell::columnIndexFromString($column) - 1;
434
-				$r1 = $row - 1;
439
+					// start offsetY
440
+					$startOffsetY = $this->_object->getStartOffsetY();
435 441
 
436
-				// start offsetX
437
-				$startOffsetX = $this->_object->getStartOffsetX();
442
+					// end coordinates
443
+					list($column, $row) = PHPExcel_Cell::coordinateFromString($this->_object->getEndCoordinates());
444
+					$c2 = PHPExcel_Cell::columnIndexFromString($column) - 1;
445
+					$r2 = $row - 1;
438 446
 
439
-				// start offsetY
440
-				$startOffsetY = $this->_object->getStartOffsetY();
447
+					// end offsetX
448
+					$endOffsetX = $this->_object->getEndOffsetX();
441 449
 
442
-				// end coordinates
443
-				list($column, $row) = PHPExcel_Cell::coordinateFromString($this->_object->getEndCoordinates());
444
-				$c2 = PHPExcel_Cell::columnIndexFromString($column) - 1;
445
-				$r2 = $row - 1;
450
+					// end offsetY
451
+					$endOffsetY = $this->_object->getEndOffsetY();
446 452
 
447
-				// end offsetX
448
-				$endOffsetX = $this->_object->getEndOffsetX();
453
+					$clientAnchorData = pack('vvvvvvvvv', 0x02,
454
+						$c1, $startOffsetX, $r1, $startOffsetY,
455
+						$c2, $endOffsetX, $r2, $endOffsetY);
449 456
 
450
-				// end offsetY
451
-				$endOffsetY = $this->_object->getEndOffsetY();
457
+					$length			= strlen($clientAnchorData);
452 458
 
453
-				$clientAnchorData = pack('vvvvvvvvv', 0x02,
454
-					$c1, $startOffsetX, $r1, $startOffsetY,
455
-					$c2, $endOffsetX, $r2, $endOffsetY);
459
+					$recVerInstance  = $recVer;
460
+					$recVerInstance |= $recInstance << 4;
456 461
 
457
-				$length			= strlen($clientAnchorData);
462
+					$header = pack('vvV', $recVerInstance, $recType, $length);
463
+					$data .= $header . $clientAnchorData;
464
+				}
458 465
 
459
-				$recVerInstance  = $recVer;
460
-				$recVerInstance |= $recInstance << 4;
466
+				// the client data, just empty for now
467
+				if (!$this->_object->getSpgr()) {
468
+					$clientDataData = '';
461 469
 
462
-				$header = pack('vvV', $recVerInstance, $recType, $length);
463
-				$data .= $header . $clientAnchorData;
464
-			}
470
+					$recVer			= 0x0;
471
+					$recInstance	= 0x0;
472
+					$recType		= 0xF011;
465 473
 
466
-			// the client data, just empty for now
467
-			if (!$this->_object->getSpgr()) {
468
-				$clientDataData = '';
474
+					$length = strlen($clientDataData);
469 475
 
470
-				$recVer			= 0x0;
471
-				$recInstance	= 0x0;
472
-				$recType		= 0xF011;
476
+					$recVerInstance  = $recVer;
477
+					$recVerInstance |= $recInstance << 4;
473 478
 
474
-				$length = strlen($clientDataData);
479
+					$header = pack('vvV', $recVerInstance, $recType, $length);
480
+					$data .= $header . $clientDataData;
481
+				}
482
+
483
+				// write the record
484
+				$recVer			= 0xF;
485
+				$recInstance	= 0x0000;
486
+				$recType		= 0xF004;
487
+				$length			= strlen($data);
475 488
 
476 489
 				$recVerInstance  = $recVer;
477 490
 				$recVerInstance |= $recInstance << 4;
478 491
 
479 492
 				$header = pack('vvV', $recVerInstance, $recType, $length);
480
-				$data .= $header . $clientDataData;
481
-			}
482
-
483
-			// write the record
484
-			$recVer			= 0xF;
485
-			$recInstance	= 0x0000;
486
-			$recType		= 0xF004;
487
-			$length			= strlen($data);
488
-
489
-			$recVerInstance  = $recVer;
490
-			$recVerInstance |= $recInstance << 4;
491 493
 
492
-			$header = pack('vvV', $recVerInstance, $recType, $length);
493
-
494
-			$this->_data = $header . $data;
495
-			break;
494
+				$this->_data = $header . $data;
495
+				break;
496 496
 
497 497
 		}
498 498
 
Please login to merge, or discard this patch.