165 lines
5.3 KiB
PHP
165 lines
5.3 KiB
PHP
<?php
|
|
|
|
namespace PhpOffice\PhpSpreadsheet\Reader\Gnumeric;
|
|
|
|
use PhpOffice\PhpSpreadsheet\Reader\Gnumeric;
|
|
use PhpOffice\PhpSpreadsheet\Spreadsheet;
|
|
use SimpleXMLElement;
|
|
|
|
class Properties
|
|
{
|
|
/**
|
|
* @var Spreadsheet
|
|
*/
|
|
protected $spreadsheet;
|
|
|
|
public function __construct(Spreadsheet $spreadsheet)
|
|
{
|
|
$this->spreadsheet = $spreadsheet;
|
|
}
|
|
|
|
private function docPropertiesOld(SimpleXMLElement $gnmXML): void
|
|
{
|
|
$docProps = $this->spreadsheet->getProperties();
|
|
foreach ($gnmXML->Summary->Item as $summaryItem) {
|
|
$propertyName = $summaryItem->name;
|
|
$propertyValue = $summaryItem->{'val-string'};
|
|
switch ($propertyName) {
|
|
case 'title':
|
|
$docProps->setTitle(trim($propertyValue));
|
|
|
|
break;
|
|
case 'comments':
|
|
$docProps->setDescription(trim($propertyValue));
|
|
|
|
break;
|
|
case 'keywords':
|
|
$docProps->setKeywords(trim($propertyValue));
|
|
|
|
break;
|
|
case 'category':
|
|
$docProps->setCategory(trim($propertyValue));
|
|
|
|
break;
|
|
case 'manager':
|
|
$docProps->setManager(trim($propertyValue));
|
|
|
|
break;
|
|
case 'author':
|
|
$docProps->setCreator(trim($propertyValue));
|
|
$docProps->setLastModifiedBy(trim($propertyValue));
|
|
|
|
break;
|
|
case 'company':
|
|
$docProps->setCompany(trim($propertyValue));
|
|
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
private function docPropertiesDC(SimpleXMLElement $officePropertyDC): void
|
|
{
|
|
$docProps = $this->spreadsheet->getProperties();
|
|
foreach ($officePropertyDC as $propertyName => $propertyValue) {
|
|
$propertyValue = trim((string) $propertyValue);
|
|
switch ($propertyName) {
|
|
case 'title':
|
|
$docProps->setTitle($propertyValue);
|
|
|
|
break;
|
|
case 'subject':
|
|
$docProps->setSubject($propertyValue);
|
|
|
|
break;
|
|
case 'creator':
|
|
$docProps->setCreator($propertyValue);
|
|
$docProps->setLastModifiedBy($propertyValue);
|
|
|
|
break;
|
|
case 'date':
|
|
$creationDate = $propertyValue;
|
|
$docProps->setModified($creationDate);
|
|
|
|
break;
|
|
case 'description':
|
|
$docProps->setDescription($propertyValue);
|
|
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
private function docPropertiesMeta(SimpleXMLElement $officePropertyMeta): void
|
|
{
|
|
$docProps = $this->spreadsheet->getProperties();
|
|
foreach ($officePropertyMeta as $propertyName => $propertyValue) {
|
|
if ($propertyValue !== null) {
|
|
$attributes = $propertyValue->attributes(Gnumeric::NAMESPACE_META);
|
|
$propertyValue = trim((string) $propertyValue);
|
|
switch ($propertyName) {
|
|
case 'keyword':
|
|
$docProps->setKeywords($propertyValue);
|
|
|
|
break;
|
|
case 'initial-creator':
|
|
$docProps->setCreator($propertyValue);
|
|
$docProps->setLastModifiedBy($propertyValue);
|
|
|
|
break;
|
|
case 'creation-date':
|
|
$creationDate = $propertyValue;
|
|
$docProps->setCreated($creationDate);
|
|
|
|
break;
|
|
case 'user-defined':
|
|
if ($attributes) {
|
|
[, $attrName] = explode(':', (string) $attributes['name']);
|
|
$this->userDefinedProperties($attrName, $propertyValue);
|
|
}
|
|
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
private function userDefinedProperties(string $attrName, string $propertyValue): void
|
|
{
|
|
$docProps = $this->spreadsheet->getProperties();
|
|
switch ($attrName) {
|
|
case 'publisher':
|
|
$docProps->setCompany($propertyValue);
|
|
|
|
break;
|
|
case 'category':
|
|
$docProps->setCategory($propertyValue);
|
|
|
|
break;
|
|
case 'manager':
|
|
$docProps->setManager($propertyValue);
|
|
|
|
break;
|
|
}
|
|
}
|
|
|
|
public function readProperties(SimpleXMLElement $xml, SimpleXMLElement $gnmXML): void
|
|
{
|
|
$officeXML = $xml->children(Gnumeric::NAMESPACE_OFFICE);
|
|
if (!empty($officeXML)) {
|
|
$officeDocXML = $officeXML->{'document-meta'};
|
|
$officeDocMetaXML = $officeDocXML->meta;
|
|
|
|
foreach ($officeDocMetaXML as $officePropertyData) {
|
|
$officePropertyDC = $officePropertyData->children(Gnumeric::NAMESPACE_DC);
|
|
$this->docPropertiesDC($officePropertyDC);
|
|
|
|
$officePropertyMeta = $officePropertyData->children(Gnumeric::NAMESPACE_META);
|
|
$this->docPropertiesMeta($officePropertyMeta);
|
|
}
|
|
} elseif (isset($gnmXML->Summary)) {
|
|
$this->docPropertiesOld($gnmXML);
|
|
}
|
|
}
|
|
}
|