PluginProbe
Visualizer – Tables & Charts Manager with Built-in AI Generator / 3.0.10
Visualizer – Tables & Charts Manager with Built-in AI Generator v3.0.10
4.0.8 4.0.7 4.0.6 4.0.5 4.0.4 4.0.3 3.0.5 3.0.6 3.0.7 3.0.8 3.0.9 3.1.0 3.1.1 3.1.2 3.1.3 3.10.0 3.10.1 3.10.10 3.10.11 3.10.12 3.10.13 3.10.14 3.10.15 3.10.2 3.10.3 All 149 releases
visualizer / vendor / phpoffice / phpexcel / Classes / PHPExcel / Reader / OOCalc.php

OOCalc.php in Visualizer – Tables & Charts Manager with Built-in AI Generator 3.0.10, at vendor/phpoffice/phpexcel/Classes/PHPExcel/Reader/OOCalc.php

712 lines 25.9 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * PHPExcel
4 *
5 * Copyright (c) 2006 - 2014 PHPExcel
6 *
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
11 *
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
16 *
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with this library; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20 *
21 * @category PHPExcel
22 * @package PHPExcel_Reader
23 * @copyright Copyright (c) 2006 - 2014 PHPExcel (http://www.codeplex.com/PHPExcel)
24 * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL
25 * @version ##VERSION##, ##DATE##
26 */
27
28
29 /** PHPExcel root directory */
30 if (!defined('PHPEXCEL_ROOT')) {
31 /**
32 * @ignore
33 */
34 define('PHPEXCEL_ROOT', dirname(__FILE__) . '/../../');
35 require(PHPEXCEL_ROOT . 'PHPExcel/Autoloader.php');
36 }
37
38 /**
39 * PHPExcel_Reader_OOCalc
40 *
41 * @category PHPExcel
42 * @package PHPExcel_Reader
43 * @copyright Copyright (c) 2006 - 2014 PHPExcel (http://www.codeplex.com/PHPExcel)
44 */
45 class PHPExcel_Reader_OOCalc extends PHPExcel_Reader_Abstract implements PHPExcel_Reader_IReader
46 {
47 /**
48 * Formats
49 *
50 * @var array
51 */
52 private $_styles = array();
53
54
55 /**
56 * Create a new PHPExcel_Reader_OOCalc
57 */
58 public function __construct() {
59 $this->_readFilter = new PHPExcel_Reader_DefaultReadFilter();
60 }
61
62
63 /**
64 * Can the current PHPExcel_Reader_IReader read the file?
65 *
66 * @param string $pFilename
67 * @return boolean
68 * @throws PHPExcel_Reader_Exception
69 */
70 public function canRead($pFilename)
71 {
72 // Check if file exists
73 if (!file_exists($pFilename)) {
74 throw new PHPExcel_Reader_Exception("Could not open " . $pFilename . " for reading! File does not exist.");
75 }
76
77 $zipClass = PHPExcel_Settings::getZipClass();
78
79 // Check if zip class exists
80 // if (!class_exists($zipClass, FALSE)) {
81 // throw new PHPExcel_Reader_Exception($zipClass . " library is not enabled");
82 // }
83
84 $mimeType = 'UNKNOWN';
85 // Load file
86 $zip = new $zipClass;
87 if ($zip->open($pFilename) === true) {
88 // check if it is an OOXML archive
89 $stat = $zip->statName('mimetype');
90 if ($stat && ($stat['size'] <= 255)) {
91 $mimeType = $zip->getFromName($stat['name']);
92 } elseif($stat = $zip->statName('META-INF/manifest.xml')) {
93 $xml = simplexml_load_string($this->securityScan($zip->getFromName('META-INF/manifest.xml')), 'SimpleXMLElement', PHPExcel_Settings::getLibXmlLoaderOptions());
94 $namespacesContent = $xml->getNamespaces(true);
95 if (isset($namespacesContent['manifest'])) {
96 $manifest = $xml->children($namespacesContent['manifest']);
97 foreach($manifest as $manifestDataSet) {
98 $manifestAttributes = $manifestDataSet->attributes($namespacesContent['manifest']);
99 if ($manifestAttributes->{'full-path'} == '/') {
100 $mimeType = (string) $manifestAttributes->{'media-type'};
101 break;
102 }
103 }
104 }
105 }
106
107 $zip->close();
108
109 return ($mimeType === 'application/vnd.oasis.opendocument.spreadsheet');
110 }
111
112 return FALSE;
113 }
114
115
116 /**
117 * Reads names of the worksheets from a file, without parsing the whole file to a PHPExcel object
118 *
119 * @param string $pFilename
120 * @throws PHPExcel_Reader_Exception
121 */
122 public function listWorksheetNames($pFilename)
123 {
124 // Check if file exists
125 if (!file_exists($pFilename)) {
126 throw new PHPExcel_Reader_Exception("Could not open " . $pFilename . " for reading! File does not exist.");
127 }
128
129 $zipClass = PHPExcel_Settings::getZipClass();
130
131 $zip = new $zipClass;
132 if (!$zip->open($pFilename)) {
133 throw new PHPExcel_Reader_Exception("Could not open " . $pFilename . " for reading! Error opening file.");
134 }
135
136 $worksheetNames = array();
137
138 $xml = new XMLReader();
139 $res = $xml->xml($this->securityScanFile('zip://'.realpath($pFilename).'#content.xml'), null, PHPExcel_Settings::getLibXmlLoaderOptions());
140 $xml->setParserProperty(2,true);
141
142 // Step into the first level of content of the XML
143 $xml->read();
144 while ($xml->read()) {
145 // Quickly jump through to the office:body node
146 while ($xml->name !== 'office:body') {
147 if ($xml->isEmptyElement)
148 $xml->read();
149 else
150 $xml->next();
151 }
152 // Now read each node until we find our first table:table node
153 while ($xml->read()) {
154 if ($xml->name == 'table:table' && $xml->nodeType == XMLReader::ELEMENT) {
155 // Loop through each table:table node reading the table:name attribute for each worksheet name
156 do {
157 $worksheetNames[] = $xml->getAttribute('table:name');
158 $xml->next();
159 } while ($xml->name == 'table:table' && $xml->nodeType == XMLReader::ELEMENT);
160 }
161 }
162 }
163
164 return $worksheetNames;
165 }
166
167
168 /**
169 * Return worksheet info (Name, Last Column Letter, Last Column Index, Total Rows, Total Columns)
170 *
171 * @param string $pFilename
172 * @throws PHPExcel_Reader_Exception
173 */
174 public function listWorksheetInfo($pFilename)
175 {
176 // Check if file exists
177 if (!file_exists($pFilename)) {
178 throw new PHPExcel_Reader_Exception("Could not open " . $pFilename . " for reading! File does not exist.");
179 }
180
181 $worksheetInfo = array();
182
183 $zipClass = PHPExcel_Settings::getZipClass();
184
185 $zip = new $zipClass;
186 if (!$zip->open($pFilename)) {
187 throw new PHPExcel_Reader_Exception("Could not open " . $pFilename . " for reading! Error opening file.");
188 }
189
190 $xml = new XMLReader();
191 $res = $xml->xml($this->securityScanFile('zip://'.realpath($pFilename).'#content.xml'), null, PHPExcel_Settings::getLibXmlLoaderOptions());
192 $xml->setParserProperty(2,true);
193
194 // Step into the first level of content of the XML
195 $xml->read();
196 while ($xml->read()) {
197 // Quickly jump through to the office:body node
198 while ($xml->name !== 'office:body') {
199 if ($xml->isEmptyElement)
200 $xml->read();
201 else
202 $xml->next();
203 }
204 // Now read each node until we find our first table:table node
205 while ($xml->read()) {
206 if ($xml->name == 'table:table' && $xml->nodeType == XMLReader::ELEMENT) {
207 $worksheetNames[] = $xml->getAttribute('table:name');
208
209 $tmpInfo = array(
210 'worksheetName' => $xml->getAttribute('table:name'),
211 'lastColumnLetter' => 'A',
212 'lastColumnIndex' => 0,
213 'totalRows' => 0,
214 'totalColumns' => 0,
215 );
216
217 // Loop through each child node of the table:table element reading
218 $currCells = 0;
219 do {
220 $xml->read();
221 if ($xml->name == 'table:table-row' && $xml->nodeType == XMLReader::ELEMENT) {
222 $rowspan = $xml->getAttribute('table:number-rows-repeated');
223 $rowspan = empty($rowspan) ? 1 : $rowspan;
224 $tmpInfo['totalRows'] += $rowspan;
225 $tmpInfo['totalColumns'] = max($tmpInfo['totalColumns'],$currCells);
226 $currCells = 0;
227 // Step into the row
228 $xml->read();
229 do {
230 if ($xml->name == 'table:table-cell' && $xml->nodeType == XMLReader::ELEMENT) {
231 if (!$xml->isEmptyElement) {
232 $currCells++;
233 $xml->next();
234 } else {
235 $xml->read();
236 }
237 } elseif ($xml->name == 'table:covered-table-cell' && $xml->nodeType == XMLReader::ELEMENT) {
238 $mergeSize = $xml->getAttribute('table:number-columns-repeated');
239 $currCells += $mergeSize;
240 $xml->read();
241 }
242 } while ($xml->name != 'table:table-row');
243 }
244 } while ($xml->name != 'table:table');
245
246 $tmpInfo['totalColumns'] = max($tmpInfo['totalColumns'],$currCells);
247 $tmpInfo['lastColumnIndex'] = $tmpInfo['totalColumns'] - 1;
248 $tmpInfo['lastColumnLetter'] = PHPExcel_Cell::stringFromColumnIndex($tmpInfo['lastColumnIndex']);
249 $worksheetInfo[] = $tmpInfo;
250 }
251 }
252
253 // foreach($workbookData->table as $worksheetDataSet) {
254 // $worksheetData = $worksheetDataSet->children($namespacesContent['table']);
255 // $worksheetDataAttributes = $worksheetDataSet->attributes($namespacesContent['table']);
256 //
257 // $rowIndex = 0;
258 // foreach ($worksheetData as $key => $rowData) {
259 // switch ($key) {
260 // case 'table-row' :
261 // $rowDataTableAttributes = $rowData->attributes($namespacesContent['table']);
262 // $rowRepeats = (isset($rowDataTableAttributes['number-rows-repeated'])) ?
263 // $rowDataTableAttributes['number-rows-repeated'] : 1;
264 // $columnIndex = 0;
265 //
266 // foreach ($rowData as $key => $cellData) {
267 // $cellDataTableAttributes = $cellData->attributes($namespacesContent['table']);
268 // $colRepeats = (isset($cellDataTableAttributes['number-columns-repeated'])) ?
269 // $cellDataTableAttributes['number-columns-repeated'] : 1;
270 // $cellDataOfficeAttributes = $cellData->attributes($namespacesContent['office']);
271 // if (isset($cellDataOfficeAttributes['value-type'])) {
272 // $tmpInfo['lastColumnIndex'] = max($tmpInfo['lastColumnIndex'], $columnIndex + $colRepeats - 1);
273 // $tmpInfo['totalRows'] = max($tmpInfo['totalRows'], $rowIndex + $rowRepeats);
274 // }
275 // $columnIndex += $colRepeats;
276 // }
277 // $rowIndex += $rowRepeats;
278 // break;
279 // }
280 // }
281 //
282 // $tmpInfo['lastColumnLetter'] = PHPExcel_Cell::stringFromColumnIndex($tmpInfo['lastColumnIndex']);
283 // $tmpInfo['totalColumns'] = $tmpInfo['lastColumnIndex'] + 1;
284 //
285 // }
286 // }
287 }
288
289 return $worksheetInfo;
290 }
291
292
293 /**
294 * Loads PHPExcel from file
295 *
296 * @param string $pFilename
297 * @return PHPExcel
298 * @throws PHPExcel_Reader_Exception
299 */
300 public function load($pFilename)
301 {
302 // Create new PHPExcel
303 $objPHPExcel = new PHPExcel();
304
305 // Load into this instance
306 return $this->loadIntoExisting($pFilename, $objPHPExcel);
307 }
308
309
310 private static function identifyFixedStyleValue($styleList,&$styleAttributeValue) {
311 $styleAttributeValue = strtolower($styleAttributeValue);
312 foreach($styleList as $style) {
313 if ($styleAttributeValue == strtolower($style)) {
314 $styleAttributeValue = $style;
315 return true;
316 }
317 }
318 return false;
319 }
320
321
322 /**
323 * Loads PHPExcel from file into PHPExcel instance
324 *
325 * @param string $pFilename
326 * @param PHPExcel $objPHPExcel
327 * @return PHPExcel
328 * @throws PHPExcel_Reader_Exception
329 */
330 public function loadIntoExisting($pFilename, PHPExcel $objPHPExcel)
331 {
332 // Check if file exists
333 if (!file_exists($pFilename)) {
334 throw new PHPExcel_Reader_Exception("Could not open " . $pFilename . " for reading! File does not exist.");
335 }
336
337 $timezoneObj = new DateTimeZone('Europe/London');
338 $GMT = new DateTimeZone('UTC');
339
340 $zipClass = PHPExcel_Settings::getZipClass();
341
342 $zip = new $zipClass;
343 if (!$zip->open($pFilename)) {
344 throw new PHPExcel_Reader_Exception("Could not open " . $pFilename . " for reading! Error opening file.");
345 }
346
347 // echo '<h1>Meta Information</h1>';
348 $xml = simplexml_load_string($this->securityScan($zip->getFromName("meta.xml")), 'SimpleXMLElement', PHPExcel_Settings::getLibXmlLoaderOptions());
349 $namespacesMeta = $xml->getNamespaces(true);
350 // echo '<pre>';
351 // print_r($namespacesMeta);
352 // echo '</pre><hr />';
353
354 $docProps = $objPHPExcel->getProperties();
355 $officeProperty = $xml->children($namespacesMeta['office']);
356 foreach($officeProperty as $officePropertyData) {
357 $officePropertyDC = array();
358 if (isset($namespacesMeta['dc'])) {
359 $officePropertyDC = $officePropertyData->children($namespacesMeta['dc']);
360 }
361 foreach($officePropertyDC as $propertyName => $propertyValue) {
362 $propertyValue = (string) $propertyValue;
363 switch ($propertyName) {
364 case 'title' :
365 $docProps->setTitle($propertyValue);
366 break;
367 case 'subject' :
368 $docProps->setSubject($propertyValue);
369 break;
370 case 'creator' :
371 $docProps->setCreator($propertyValue);
372 $docProps->setLastModifiedBy($propertyValue);
373 break;
374 case 'date' :
375 $creationDate = strtotime($propertyValue);
376 $docProps->setCreated($creationDate);
377 $docProps->setModified($creationDate);
378 break;
379 case 'description' :
380 $docProps->setDescription($propertyValue);
381 break;
382 }
383 }
384 $officePropertyMeta = array();
385 if (isset($namespacesMeta['dc'])) {
386 $officePropertyMeta = $officePropertyData->children($namespacesMeta['meta']);
387 }
388 foreach($officePropertyMeta as $propertyName => $propertyValue) {
389 $propertyValueAttributes = $propertyValue->attributes($namespacesMeta['meta']);
390 $propertyValue = (string) $propertyValue;
391 switch ($propertyName) {
392 case 'initial-creator' :
393 $docProps->setCreator($propertyValue);
394 break;
395 case 'keyword' :
396 $docProps->setKeywords($propertyValue);
397 break;
398 case 'creation-date' :
399 $creationDate = strtotime($propertyValue);
400 $docProps->setCreated($creationDate);
401 break;
402 case 'user-defined' :
403 $propertyValueType = PHPExcel_DocumentProperties::PROPERTY_TYPE_STRING;
404 foreach ($propertyValueAttributes as $key => $value) {
405 if ($key == 'name') {
406 $propertyValueName = (string) $value;
407 } elseif($key == 'value-type') {
408 switch ($value) {
409 case 'date' :
410 $propertyValue = PHPExcel_DocumentProperties::convertProperty($propertyValue,'date');
411 $propertyValueType = PHPExcel_DocumentProperties::PROPERTY_TYPE_DATE;
412 break;
413 case 'boolean' :
414 $propertyValue = PHPExcel_DocumentProperties::convertProperty($propertyValue,'bool');
415 $propertyValueType = PHPExcel_DocumentProperties::PROPERTY_TYPE_BOOLEAN;
416 break;
417 case 'float' :
418 $propertyValue = PHPExcel_DocumentProperties::convertProperty($propertyValue,'r4');
419 $propertyValueType = PHPExcel_DocumentProperties::PROPERTY_TYPE_FLOAT;
420 break;
421 default :
422 $propertyValueType = PHPExcel_DocumentProperties::PROPERTY_TYPE_STRING;
423 }
424 }
425 }
426 $docProps->setCustomProperty($propertyValueName,$propertyValue,$propertyValueType);
427 break;
428 }
429 }
430 }
431
432
433 // echo '<h1>Workbook Content</h1>';
434 $xml = simplexml_load_string($this->securityScan($zip->getFromName("content.xml")), 'SimpleXMLElement', PHPExcel_Settings::getLibXmlLoaderOptions());
435 $namespacesContent = $xml->getNamespaces(true);
436 // echo '<pre>';
437 // print_r($namespacesContent);
438 // echo '</pre><hr />';
439
440 $workbook = $xml->children($namespacesContent['office']);
441 foreach($workbook->body->spreadsheet as $workbookData) {
442 $workbookData = $workbookData->children($namespacesContent['table']);
443 $worksheetID = 0;
444 foreach($workbookData->table as $worksheetDataSet) {
445 $worksheetData = $worksheetDataSet->children($namespacesContent['table']);
446 // print_r($worksheetData);
447 // echo '<br />';
448 $worksheetDataAttributes = $worksheetDataSet->attributes($namespacesContent['table']);
449 // print_r($worksheetDataAttributes);
450 // echo '<br />';
451 if ((isset($this->_loadSheetsOnly)) && (isset($worksheetDataAttributes['name'])) &&
452 (!in_array($worksheetDataAttributes['name'], $this->_loadSheetsOnly))) {
453 continue;
454 }
455
456 // echo '<h2>Worksheet '.$worksheetDataAttributes['name'].'</h2>';
457 // Create new Worksheet
458 $objPHPExcel->createSheet();
459 $objPHPExcel->setActiveSheetIndex($worksheetID);
460 if (isset($worksheetDataAttributes['name'])) {
461 $worksheetName = (string) $worksheetDataAttributes['name'];
462 // Use false for $updateFormulaCellReferences to prevent adjustment of worksheet references in
463 // formula cells... during the load, all formulae should be correct, and we're simply
464 // bringing the worksheet name in line with the formula, not the reverse
465 $objPHPExcel->getActiveSheet()->setTitle($worksheetName,false);
466 }
467
468 $rowID = 1;
469 foreach($worksheetData as $key => $rowData) {
470 // echo '<b>'.$key.'</b><br />';
471 switch ($key) {
472 case 'table-header-rows':
473 foreach ($rowData as $key=>$cellData) {
474 $rowData = $cellData;
475 break;
476 }
477 case 'table-row' :
478 $rowDataTableAttributes = $rowData->attributes($namespacesContent['table']);
479 $rowRepeats = (isset($rowDataTableAttributes['number-rows-repeated'])) ?
480 $rowDataTableAttributes['number-rows-repeated'] : 1;
481 $columnID = 'A';
482 foreach($rowData as $key => $cellData) {
483 if ($this->getReadFilter() !== NULL) {
484 if (!$this->getReadFilter()->readCell($columnID, $rowID, $worksheetName)) {
485 continue;
486 }
487 }
488
489 // echo '<b>'.$columnID.$rowID.'</b><br />';
490 $cellDataText = (isset($namespacesContent['text'])) ?
491 $cellData->children($namespacesContent['text']) :
492 '';
493 $cellDataOffice = $cellData->children($namespacesContent['office']);
494 $cellDataOfficeAttributes = $cellData->attributes($namespacesContent['office']);
495 $cellDataTableAttributes = $cellData->attributes($namespacesContent['table']);
496
497 // echo 'Office Attributes: ';
498 // print_r($cellDataOfficeAttributes);
499 // echo '<br />Table Attributes: ';
500 // print_r($cellDataTableAttributes);
501 // echo '<br />Cell Data Text';
502 // print_r($cellDataText);
503 // echo '<br />';
504 //
505 $type = $formatting = $hyperlink = null;
506 $hasCalculatedValue = false;
507 $cellDataFormula = '';
508 if (isset($cellDataTableAttributes['formula'])) {
509 $cellDataFormula = $cellDataTableAttributes['formula'];
510 $hasCalculatedValue = true;
511 }
512
513 if (isset($cellDataOffice->annotation)) {
514 // echo 'Cell has comment<br />';
515 $annotationText = $cellDataOffice->annotation->children($namespacesContent['text']);
516 $textArray = array();
517 foreach($annotationText as $t) {
518 if (isset($t->span)) {
519 foreach($t->span as $text) {
520 $textArray[] = (string)$text;
521 }
522 } else {
523 $textArray[] = (string) $t;
524 }
525 }
526 $text = implode("\n",$textArray);
527 // echo $text,'<br />';
528 $objPHPExcel->getActiveSheet()->getComment( $columnID.$rowID )
529 // ->setAuthor( $author )
530 ->setText($this->_parseRichText($text) );
531 }
532
533 if (isset($cellDataText->p)) {
534 // Consolidate if there are multiple p records (maybe with spans as well)
535 $dataArray = array();
536 // Text can have multiple text:p and within those, multiple text:span.
537 // text:p newlines, but text:span does not.
538 // Also, here we assume there is no text data is span fields are specified, since
539 // we have no way of knowing proper positioning anyway.
540 foreach ($cellDataText->p as $pData) {
541 if (isset($pData->span)) {
542 // span sections do not newline, so we just create one large string here
543 $spanSection = "";
544 foreach ($pData->span as $spanData) {
545 $spanSection .= $spanData;
546 }
547 array_push($dataArray, $spanSection);
548 } else {
549 array_push($dataArray, $pData);
550 }
551 }
552 $allCellDataText = implode($dataArray, "\n");
553
554 // echo 'Value Type is '.$cellDataOfficeAttributes['value-type'].'<br />';
555 switch ($cellDataOfficeAttributes['value-type']) {
556 case 'string' :
557 $type = PHPExcel_Cell_DataType::TYPE_STRING;
558 $dataValue = $allCellDataText;
559 if (isset($dataValue->a)) {
560 $dataValue = $dataValue->a;
561 $cellXLinkAttributes = $dataValue->attributes($namespacesContent['xlink']);
562 $hyperlink = $cellXLinkAttributes['href'];
563 }
564 break;
565 case 'boolean' :
566 $type = PHPExcel_Cell_DataType::TYPE_BOOL;
567 $dataValue = ($allCellDataText == 'TRUE') ? True : False;
568 break;
569 case 'percentage' :
570 $type = PHPExcel_Cell_DataType::TYPE_NUMERIC;
571 $dataValue = (float) $cellDataOfficeAttributes['value'];
572 if (floor($dataValue) == $dataValue) {
573 $dataValue = (integer) $dataValue;
574 }
575 $formatting = PHPExcel_Style_NumberFormat::FORMAT_PERCENTAGE_00;
576 break;
577 case 'currency' :
578 $type = PHPExcel_Cell_DataType::TYPE_NUMERIC;
579 $dataValue = (float) $cellDataOfficeAttributes['value'];
580 if (floor($dataValue) == $dataValue) {
581 $dataValue = (integer) $dataValue;
582 }
583 $formatting = PHPExcel_Style_NumberFormat::FORMAT_CURRENCY_USD_SIMPLE;
584 break;
585 case 'float' :
586 $type = PHPExcel_Cell_DataType::TYPE_NUMERIC;
587 $dataValue = (float) $cellDataOfficeAttributes['value'];
588 if (floor($dataValue) == $dataValue) {
589 if ($dataValue == (integer) $dataValue)
590 $dataValue = (integer) $dataValue;
591 else
592 $dataValue = (float) $dataValue;
593 }
594 break;
595 case 'date' :
596 $type = PHPExcel_Cell_DataType::TYPE_NUMERIC;
597 $dateObj = new DateTime($cellDataOfficeAttributes['date-value'], $GMT);
598 $dateObj->setTimeZone($timezoneObj);
599 list($year,$month,$day,$hour,$minute,$second) = explode(' ',$dateObj->format('Y m d H i s'));
600 $dataValue = PHPExcel_Shared_Date::FormattedPHPToExcel($year,$month,$day,$hour,$minute,$second);
601 if ($dataValue != floor($dataValue)) {
602 $formatting = PHPExcel_Style_NumberFormat::FORMAT_DATE_XLSX15.' '.PHPExcel_Style_NumberFormat::FORMAT_DATE_TIME4;
603 } else {
604 $formatting = PHPExcel_Style_NumberFormat::FORMAT_DATE_XLSX15;
605 }
606 break;
607 case 'time' :
608 $type = PHPExcel_Cell_DataType::TYPE_NUMERIC;
609 $dataValue = PHPExcel_Shared_Date::PHPToExcel(strtotime('01-01-1970 '.implode(':',sscanf($cellDataOfficeAttributes['time-value'],'PT%dH%dM%dS'))));
610 $formatting = PHPExcel_Style_NumberFormat::FORMAT_DATE_TIME4;
611 break;
612 }
613 // echo 'Data value is '.$dataValue.'<br />';
614 // if ($hyperlink !== NULL) {
615 // echo 'Hyperlink is '.$hyperlink.'<br />';
616 // }
617 } else {
618 $type = PHPExcel_Cell_DataType::TYPE_NULL;
619 $dataValue = NULL;
620 }
621
622 if ($hasCalculatedValue) {
623 $type = PHPExcel_Cell_DataType::TYPE_FORMULA;
624 // echo 'Formula: ', $cellDataFormula, PHP_EOL;
625 $cellDataFormula = substr($cellDataFormula,strpos($cellDataFormula,':=')+1);
626 $temp = explode('"',$cellDataFormula);
627 $tKey = false;
628 foreach($temp as &$value) {
629 // Only replace in alternate array entries (i.e. non-quoted blocks)
630 if ($tKey = !$tKey) {
631 $value = preg_replace('/\[([^\.]+)\.([^\.]+):\.([^\.]+)\]/Ui','$1!$2:$3',$value); // Cell range reference in another sheet
632 $value = preg_replace('/\[([^\.]+)\.([^\.]+)\]/Ui','$1!$2',$value); // Cell reference in another sheet
633 $value = preg_replace('/\[\.([^\.]+):\.([^\.]+)\]/Ui','$1:$2',$value); // Cell range reference
634 $value = preg_replace('/\[\.([^\.]+)\]/Ui','$1',$value); // Simple cell reference
635 $value = PHPExcel_Calculation::_translateSeparator(';',',',$value,$inBraces);
636 }
637 }
638 unset($value);
639 // Then rebuild the formula string
640 $cellDataFormula = implode('"',$temp);
641 // echo 'Adjusted Formula: ', $cellDataFormula, PHP_EOL;
642 }
643
644 $colRepeats = (isset($cellDataTableAttributes['number-columns-repeated'])) ?
645 $cellDataTableAttributes['number-columns-repeated'] : 1;
646 if ($type !== NULL) {
647 for ($i = 0; $i < $colRepeats; ++$i) {
648 if ($i > 0) {
649 ++$columnID;
650 }
651 if ($type !== PHPExcel_Cell_DataType::TYPE_NULL) {
652 for ($rowAdjust = 0; $rowAdjust < $rowRepeats; ++$rowAdjust) {
653 $rID = $rowID + $rowAdjust;
654 $objPHPExcel->getActiveSheet()->getCell($columnID.$rID)->setValueExplicit((($hasCalculatedValue) ? $cellDataFormula : $dataValue),$type);
655 if ($hasCalculatedValue) {
656 // echo 'Forumla result is '.$dataValue.'<br />';
657 $objPHPExcel->getActiveSheet()->getCell($columnID.$rID)->setCalculatedValue($dataValue);
658 }
659 if ($formatting !== NULL) {
660 $objPHPExcel->getActiveSheet()->getStyle($columnID.$rID)->getNumberFormat()->setFormatCode($formatting);
661 } else {
662 $objPHPExcel->getActiveSheet()->getStyle($columnID.$rID)->getNumberFormat()->setFormatCode(PHPExcel_Style_NumberFormat::FORMAT_GENERAL);
663 }
664 if ($hyperlink !== NULL) {
665 $objPHPExcel->getActiveSheet()->getCell($columnID.$rID)->getHyperlink()->setUrl($hyperlink);
666 }
667 }
668 }
669 }
670 }
671
672 // Merged cells
673 if ((isset($cellDataTableAttributes['number-columns-spanned'])) || (isset($cellDataTableAttributes['number-rows-spanned']))) {
674 if (($type !== PHPExcel_Cell_DataType::TYPE_NULL) || (!$this->_readDataOnly)) {
675 $columnTo = $columnID;
676 if (isset($cellDataTableAttributes['number-columns-spanned'])) {
677 $columnTo = PHPExcel_Cell::stringFromColumnIndex(PHPExcel_Cell::columnIndexFromString($columnID) + $cellDataTableAttributes['number-columns-spanned'] -2);
678 }
679 $rowTo = $rowID;
680 if (isset($cellDataTableAttributes['number-rows-spanned'])) {
681 $rowTo = $rowTo + $cellDataTableAttributes['number-rows-spanned'] - 1;
682 }
683 $cellRange = $columnID.$rowID.':'.$columnTo.$rowTo;
684 $objPHPExcel->getActiveSheet()->mergeCells($cellRange);
685 }
686 }
687
688 ++$columnID;
689 }
690 $rowID += $rowRepeats;
691 break;
692 }
693 }
694 ++$worksheetID;
695 }
696 }
697
698 // Return
699 return $objPHPExcel;
700 }
701
702
703 private function _parseRichText($is = '') {
704 $value = new PHPExcel_RichText();
705
706 $value->createText($is);
707
708 return $value;
709 }
710
711 }
712