30 if (!
defined(
'PHPEXCEL_ROOT')) {
34 define(
'PHPEXCEL_ROOT', dirname(__FILE__) .
'/../../');
35 require(PHPEXCEL_ROOT .
'PHPExcel/Autoloader.php');
73 if (!file_exists($pFilename)) {
84 $mimeType =
'UNKNOWN';
87 if ($zip->open($pFilename) ===
true) {
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')) {
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'};
109 return ($mimeType ===
'application/vnd.oasis.opendocument.spreadsheet');
125 if (!file_exists($pFilename)) {
131 $zip =
new $zipClass;
132 if (!$zip->open($pFilename)) {
136 $worksheetNames =
array();
138 $xml =
new XMLReader();
140 $xml->setParserProperty(2,
true);
144 while ($xml->read()) {
146 while ($xml->name !==
'office:body') {
147 if ($xml->isEmptyElement)
153 while ($xml->read()) {
154 if ($xml->name ==
'table:table' && $xml->nodeType == XMLReader::ELEMENT) {
157 $worksheetNames[] = $xml->getAttribute(
'table:name');
159 }
while ($xml->name ==
'table:table' && $xml->nodeType == XMLReader::ELEMENT);
164 return $worksheetNames;
177 if (!file_exists($pFilename)) {
181 $worksheetInfo =
array();
185 $zip =
new $zipClass;
186 if (!$zip->open($pFilename)) {
190 $xml =
new XMLReader();
192 $xml->setParserProperty(2,
true);
196 while ($xml->read()) {
198 while ($xml->name !==
'office:body') {
199 if ($xml->isEmptyElement)
205 while ($xml->read()) {
206 if ($xml->name ==
'table:table' && $xml->nodeType == XMLReader::ELEMENT) {
207 $worksheetNames[] = $xml->getAttribute(
'table:name');
210 'worksheetName' => $xml->getAttribute(
'table:name'),
211 'lastColumnLetter' =>
'A',
212 'lastColumnIndex' => 0,
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);
230 if ($xml->name ==
'table:table-cell' && $xml->nodeType == XMLReader::ELEMENT) {
231 if (!$xml->isEmptyElement) {
237 } elseif ($xml->name ==
'table:covered-table-cell' && $xml->nodeType == XMLReader::ELEMENT) {
238 $mergeSize = $xml->getAttribute(
'table:number-columns-repeated');
239 $currCells += $mergeSize;
242 }
while ($xml->name !=
'table:table-row');
244 }
while ($xml->name !=
'table:table');
246 $tmpInfo[
'totalColumns'] = max($tmpInfo[
'totalColumns'],$currCells);
247 $tmpInfo[
'lastColumnIndex'] = $tmpInfo[
'totalColumns'] - 1;
249 $worksheetInfo[] = $tmpInfo;
289 return $worksheetInfo;
300 public function load($pFilename)
311 $styleAttributeValue = strtolower($styleAttributeValue);
312 foreach($styleList as
$style) {
313 if ($styleAttributeValue == strtolower($style)) {
314 $styleAttributeValue =
$style;
333 if (!file_exists($pFilename)) {
337 $timezoneObj =
new DateTimeZone(
'Europe/London');
338 $GMT =
new DateTimeZone(
'UTC');
342 $zip =
new $zipClass;
343 if (!$zip->open($pFilename)) {
349 $namespacesMeta = $xml->getNamespaces(
true);
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']);
361 foreach($officePropertyDC as $propertyName => $propertyValue) {
362 $propertyValue = (
string) $propertyValue;
363 switch ($propertyName) {
365 $docProps->setTitle($propertyValue);
368 $docProps->setSubject($propertyValue);
371 $docProps->setCreator($propertyValue);
372 $docProps->setLastModifiedBy($propertyValue);
375 $creationDate = strtotime($propertyValue);
376 $docProps->setCreated($creationDate);
377 $docProps->setModified($creationDate);
380 $docProps->setDescription($propertyValue);
384 $officePropertyMeta =
array();
385 if (isset($namespacesMeta[
'dc'])) {
386 $officePropertyMeta = $officePropertyData->children($namespacesMeta[
'meta']);
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);
396 $docProps->setKeywords($propertyValue);
398 case 'creation-date' :
399 $creationDate = strtotime($propertyValue);
400 $docProps->setCreated($creationDate);
402 case 'user-defined' :
404 foreach ($propertyValueAttributes as $key => $value) {
405 if ($key ==
'name') {
406 $propertyValueName = (
string) $value;
407 } elseif($key ==
'value-type') {
426 $docProps->setCustomProperty($propertyValueName,$propertyValue,$propertyValueType);
435 $namespacesContent = $xml->getNamespaces(
true);
440 $workbook = $xml->children($namespacesContent[
'office']);
441 foreach($workbook->body->spreadsheet as $workbookData) {
442 $workbookData = $workbookData->children($namespacesContent[
'table']);
444 foreach($workbookData->table as $worksheetDataSet) {
445 $worksheetData = $worksheetDataSet->children($namespacesContent[
'table']);
448 $worksheetDataAttributes = $worksheetDataSet->attributes($namespacesContent[
'table']);
451 if ((isset($this->_loadSheetsOnly)) && (isset($worksheetDataAttributes[
'name'])) &&
452 (!in_array($worksheetDataAttributes[
'name'], $this->_loadSheetsOnly))) {
460 if (isset($worksheetDataAttributes[
'name'])) {
461 $worksheetName = (
string) $worksheetDataAttributes[
'name'];
469 foreach($worksheetData as $key => $rowData) {
472 case 'table-header-rows':
473 foreach ($rowData as $key=>$cellData) {
474 $rowData = $cellData;
478 $rowDataTableAttributes = $rowData->attributes($namespacesContent[
'table']);
479 $rowRepeats = (isset($rowDataTableAttributes[
'number-rows-repeated'])) ?
480 $rowDataTableAttributes[
'number-rows-repeated'] : 1;
482 foreach($rowData as $key => $cellData) {
484 if (!$this->
getReadFilter()->readCell($columnID, $rowID, $worksheetName)) {
490 $cellDataText = (isset($namespacesContent[
'text'])) ?
491 $cellData->children($namespacesContent[
'text']) :
493 $cellDataOffice = $cellData->children($namespacesContent[
'office']);
494 $cellDataOfficeAttributes = $cellData->attributes($namespacesContent[
'office']);
495 $cellDataTableAttributes = $cellData->attributes($namespacesContent[
'table']);
505 $type = $formatting = $hyperlink = null;
506 $hasCalculatedValue =
false;
507 $cellDataFormula =
'';
508 if (isset($cellDataTableAttributes[
'formula'])) {
509 $cellDataFormula = $cellDataTableAttributes[
'formula'];
510 $hasCalculatedValue =
true;
513 if (isset($cellDataOffice->annotation)) {
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;
523 $textArray[] = (
string) $t;
526 $text = implode(
"\n",$textArray);
533 if (isset($cellDataText->p)) {
540 foreach ($cellDataText->p as $pData) {
541 if (isset($pData->span)) {
544 foreach ($pData->span as $spanData) {
545 $spanSection .= $spanData;
555 switch ($cellDataOfficeAttributes[
'value-type']) {
558 $dataValue = $allCellDataText;
559 if (isset($dataValue->a)) {
560 $dataValue = $dataValue->a;
561 $cellXLinkAttributes = $dataValue->attributes($namespacesContent[
'xlink']);
562 $hyperlink = $cellXLinkAttributes[
'href'];
567 $dataValue = ($allCellDataText ==
'TRUE') ? True : False;
571 $dataValue = (float) $cellDataOfficeAttributes[
'value'];
572 if (floor($dataValue) == $dataValue) {
573 $dataValue = (integer) $dataValue;
579 $dataValue = (float) $cellDataOfficeAttributes[
'value'];
580 if (floor($dataValue) == $dataValue) {
581 $dataValue = (integer) $dataValue;
587 $dataValue = (float) $cellDataOfficeAttributes[
'value'];
588 if (floor($dataValue) == $dataValue) {
589 if ($dataValue == (integer) $dataValue)
590 $dataValue = (integer) $dataValue;
592 $dataValue = (float) $dataValue;
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'));
601 if ($dataValue != floor($dataValue)) {
622 if ($hasCalculatedValue) {
625 $cellDataFormula = substr($cellDataFormula,strpos($cellDataFormula,
':=')+1);
626 $temp = explode(
'"',$cellDataFormula);
628 foreach($temp as &$value) {
630 if ($tKey = !$tKey) {
631 $value = preg_replace(
'/\[([^\.]+)\.([^\.]+):\.([^\.]+)\]/Ui',
'$1!$2:$3',$value);
632 $value = preg_replace(
'/\[([^\.]+)\.([^\.]+)\]/Ui',
'$1!$2',$value);
633 $value = preg_replace(
'/\[\.([^\.]+):\.([^\.]+)\]/Ui',
'$1:$2',$value);
634 $value = preg_replace(
'/\[\.([^\.]+)\]/Ui',
'$1',$value);
640 $cellDataFormula = implode(
'"',$temp);
644 $colRepeats = (isset($cellDataTableAttributes[
'number-columns-repeated'])) ?
645 $cellDataTableAttributes[
'number-columns-repeated'] : 1;
646 if ($type !== NULL) {
647 for ($i = 0; $i < $colRepeats; ++$i) {
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) {
657 $objPHPExcel->
getActiveSheet()->getCell($columnID.$rID)->setCalculatedValue($dataValue);
659 if ($formatting !== NULL) {
660 $objPHPExcel->
getActiveSheet()->getStyle($columnID.$rID)->getNumberFormat()->setFormatCode($formatting);
664 if ($hyperlink !== NULL) {
665 $objPHPExcel->
getActiveSheet()->getCell($columnID.$rID)->getHyperlink()->setUrl($hyperlink);
673 if ((isset($cellDataTableAttributes[
'number-columns-spanned'])) || (isset($cellDataTableAttributes[
'number-rows-spanned']))) {
675 $columnTo = $columnID;
676 if (isset($cellDataTableAttributes[
'number-columns-spanned'])) {
680 if (isset($cellDataTableAttributes[
'number-rows-spanned'])) {
681 $rowTo = $rowTo + $cellDataTableAttributes[
'number-rows-spanned'] - 1;
683 $cellRange = $columnID.$rowID.
':'.$columnTo.$rowTo;
690 $rowID += $rowRepeats;
706 $value->createText($is);
static getZipClass()
Return the name of the Zip handler Class that PHPExcel is configured to use (PCLZip or ZipArchive) or...
canRead($pFilename)
Can the current PHPExcel_Reader_IReader read the file?
listWorksheetNames($pFilename)
Reads names of the worksheets from a file, without parsing the whole file to a PHPExcel object...
getProperties()
Get properties.
Add rich text string
The name of the decorator.
createSheet($iSheetIndex=NULL)
Create sheet and add it to this workbook.
static FormattedPHPToExcel($year, $month, $day, $hours=0, $minutes=0, $seconds=0)
FormattedPHPToExcel.
securityScan($xml)
Scan theXML for use of <!ENTITY to prevent XXE/XEE attacks.
static identifyFixedStyleValue($styleList, &$styleAttributeValue)
securityScanFile($filestream)
Scan theXML for use of <!ENTITY to prevent XXE/XEE attacks.
const PROPERTY_TYPE_STRING
static convertProperty($propertyValue, $propertyType)
const PROPERTY_TYPE_FLOAT
static _translateSeparator($fromSeparator, $toSeparator, $formula, &$inBraces)
const PROPERTY_TYPE_BOOLEAN
constants
__construct()
Create a new PHPExcel_Reader_OOCalc.
load($pFilename)
Loads PHPExcel from file.
static getLibXmlLoaderOptions()
Get default options for libxml loader.
Create styles array
The data for the language used.
getActiveSheet()
Get active sheet.
getReadFilter()
Read filter.
static columnIndexFromString($pString='A')
Column index from string.
static stringFromColumnIndex($pColumnIndex=0)
String from columnindex.
setActiveSheetIndex($pIndex=0)
Set active sheet index.
loadIntoExisting($pFilename, PHPExcel $objPHPExcel)
Loads PHPExcel from file into PHPExcel instance.
listWorksheetInfo($pFilename)
Return worksheet info (Name, Last Column Letter, Last Column Index, Total Rows, Total Columns) ...
defined( 'APPLICATION_ENV')||define( 'APPLICATION_ENV'
static PHPToExcel($dateValue=0, $adjustToTimezone=FALSE, $timezone=NULL)
Convert a date from PHP to Excel.