package and depencies
This commit is contained in:
45
vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Ods/AutoFilter.php
vendored
Normal file
45
vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Ods/AutoFilter.php
vendored
Normal file
@@ -0,0 +1,45 @@
|
||||
<?php
|
||||
|
||||
namespace PhpOffice\PhpSpreadsheet\Reader\Ods;
|
||||
|
||||
use DOMElement;
|
||||
use DOMNode;
|
||||
|
||||
class AutoFilter extends BaseLoader
|
||||
{
|
||||
public function read(DOMElement $workbookData): void
|
||||
{
|
||||
$this->readAutoFilters($workbookData);
|
||||
}
|
||||
|
||||
protected function readAutoFilters(DOMElement $workbookData): void
|
||||
{
|
||||
$databases = $workbookData->getElementsByTagNameNS($this->tableNs, 'database-ranges');
|
||||
|
||||
foreach ($databases as $autofilters) {
|
||||
foreach ($autofilters->childNodes as $autofilter) {
|
||||
$autofilterRange = $this->getAttributeValue($autofilter, 'target-range-address');
|
||||
if ($autofilterRange !== null) {
|
||||
$baseAddress = FormulaTranslator::convertToExcelAddressValue($autofilterRange);
|
||||
$this->spreadsheet->getActiveSheet()->setAutoFilter($baseAddress);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected function getAttributeValue(?DOMNode $node, string $attributeName): ?string
|
||||
{
|
||||
if ($node !== null && $node->attributes !== null) {
|
||||
$attribute = $node->attributes->getNamedItemNS(
|
||||
$this->tableNs,
|
||||
$attributeName
|
||||
);
|
||||
|
||||
if ($attribute !== null) {
|
||||
return $attribute->nodeValue;
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
27
vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Ods/BaseLoader.php
vendored
Normal file
27
vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Ods/BaseLoader.php
vendored
Normal file
@@ -0,0 +1,27 @@
|
||||
<?php
|
||||
|
||||
namespace PhpOffice\PhpSpreadsheet\Reader\Ods;
|
||||
|
||||
use DOMElement;
|
||||
use PhpOffice\PhpSpreadsheet\Spreadsheet;
|
||||
|
||||
abstract class BaseLoader
|
||||
{
|
||||
/**
|
||||
* @var Spreadsheet
|
||||
*/
|
||||
protected $spreadsheet;
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
protected $tableNs;
|
||||
|
||||
public function __construct(Spreadsheet $spreadsheet, string $tableNs)
|
||||
{
|
||||
$this->spreadsheet = $spreadsheet;
|
||||
$this->tableNs = $tableNs;
|
||||
}
|
||||
|
||||
abstract public function read(DOMElement $workbookData): void;
|
||||
}
|
66
vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Ods/DefinedNames.php
vendored
Normal file
66
vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Ods/DefinedNames.php
vendored
Normal file
@@ -0,0 +1,66 @@
|
||||
<?php
|
||||
|
||||
namespace PhpOffice\PhpSpreadsheet\Reader\Ods;
|
||||
|
||||
use DOMElement;
|
||||
use PhpOffice\PhpSpreadsheet\DefinedName;
|
||||
use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet;
|
||||
|
||||
class DefinedNames extends BaseLoader
|
||||
{
|
||||
public function read(DOMElement $workbookData): void
|
||||
{
|
||||
$this->readDefinedRanges($workbookData);
|
||||
$this->readDefinedExpressions($workbookData);
|
||||
}
|
||||
|
||||
/**
|
||||
* Read any Named Ranges that are defined in this spreadsheet.
|
||||
*/
|
||||
protected function readDefinedRanges(DOMElement $workbookData): void
|
||||
{
|
||||
$namedRanges = $workbookData->getElementsByTagNameNS($this->tableNs, 'named-range');
|
||||
foreach ($namedRanges as $definedNameElement) {
|
||||
$definedName = $definedNameElement->getAttributeNS($this->tableNs, 'name');
|
||||
$baseAddress = $definedNameElement->getAttributeNS($this->tableNs, 'base-cell-address');
|
||||
$range = $definedNameElement->getAttributeNS($this->tableNs, 'cell-range-address');
|
||||
|
||||
$baseAddress = FormulaTranslator::convertToExcelAddressValue($baseAddress);
|
||||
$range = FormulaTranslator::convertToExcelAddressValue($range);
|
||||
|
||||
$this->addDefinedName($baseAddress, $definedName, $range);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Read any Named Formulae that are defined in this spreadsheet.
|
||||
*/
|
||||
protected function readDefinedExpressions(DOMElement $workbookData): void
|
||||
{
|
||||
$namedExpressions = $workbookData->getElementsByTagNameNS($this->tableNs, 'named-expression');
|
||||
foreach ($namedExpressions as $definedNameElement) {
|
||||
$definedName = $definedNameElement->getAttributeNS($this->tableNs, 'name');
|
||||
$baseAddress = $definedNameElement->getAttributeNS($this->tableNs, 'base-cell-address');
|
||||
$expression = $definedNameElement->getAttributeNS($this->tableNs, 'expression');
|
||||
|
||||
$baseAddress = FormulaTranslator::convertToExcelAddressValue($baseAddress);
|
||||
$expression = substr($expression, strpos($expression, ':=') + 1);
|
||||
$expression = FormulaTranslator::convertToExcelFormulaValue($expression);
|
||||
|
||||
$this->addDefinedName($baseAddress, $definedName, $expression);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Assess scope and store the Defined Name.
|
||||
*/
|
||||
private function addDefinedName(string $baseAddress, string $definedName, string $value): void
|
||||
{
|
||||
[$sheetReference] = Worksheet::extractSheetTitle($baseAddress, true);
|
||||
$worksheet = $this->spreadsheet->getSheetByName($sheetReference);
|
||||
// Worksheet might still be null if we're only loading selected sheets rather than the full spreadsheet
|
||||
if ($worksheet !== null) {
|
||||
$this->spreadsheet->addDefinedName(DefinedName::createInstance((string) $definedName, $worksheet, $value));
|
||||
}
|
||||
}
|
||||
}
|
97
vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Ods/FormulaTranslator.php
vendored
Normal file
97
vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Ods/FormulaTranslator.php
vendored
Normal file
@@ -0,0 +1,97 @@
|
||||
<?php
|
||||
|
||||
namespace PhpOffice\PhpSpreadsheet\Reader\Ods;
|
||||
|
||||
use PhpOffice\PhpSpreadsheet\Calculation\Calculation;
|
||||
|
||||
class FormulaTranslator
|
||||
{
|
||||
public static function convertToExcelAddressValue(string $openOfficeAddress): string
|
||||
{
|
||||
$excelAddress = $openOfficeAddress;
|
||||
|
||||
// Cell range 3-d reference
|
||||
// As we don't support 3-d ranges, we're just going to take a quick and dirty approach
|
||||
// and assume that the second worksheet reference is the same as the first
|
||||
$excelAddress = (string) preg_replace(
|
||||
[
|
||||
'/\$?([^\.]+)\.([^\.]+):\$?([^\.]+)\.([^\.]+)/miu',
|
||||
'/\$?([^\.]+)\.([^\.]+):\.([^\.]+)/miu', // Cell range reference in another sheet
|
||||
'/\$?([^\.]+)\.([^\.]+)/miu', // Cell reference in another sheet
|
||||
'/\.([^\.]+):\.([^\.]+)/miu', // Cell range reference
|
||||
'/\.([^\.]+)/miu', // Simple cell reference
|
||||
],
|
||||
[
|
||||
'$1!$2:$4',
|
||||
'$1!$2:$3',
|
||||
'$1!$2',
|
||||
'$1:$2',
|
||||
'$1',
|
||||
],
|
||||
$excelAddress
|
||||
);
|
||||
|
||||
return $excelAddress;
|
||||
}
|
||||
|
||||
public static function convertToExcelFormulaValue(string $openOfficeFormula): string
|
||||
{
|
||||
$temp = explode(Calculation::FORMULA_STRING_QUOTE, $openOfficeFormula);
|
||||
$tKey = false;
|
||||
$inMatrixBracesLevel = 0;
|
||||
$inFunctionBracesLevel = 0;
|
||||
foreach ($temp as &$value) {
|
||||
// @var string $value
|
||||
// Only replace in alternate array entries (i.e. non-quoted blocks)
|
||||
// so that conversion isn't done in string values
|
||||
$tKey = $tKey === false;
|
||||
if ($tKey) {
|
||||
$value = (string) preg_replace(
|
||||
[
|
||||
'/\[\$?([^\.]+)\.([^\.]+):\.([^\.]+)\]/miu', // Cell range reference in another sheet
|
||||
'/\[\$?([^\.]+)\.([^\.]+)\]/miu', // Cell reference in another sheet
|
||||
'/\[\.([^\.]+):\.([^\.]+)\]/miu', // Cell range reference
|
||||
'/\[\.([^\.]+)\]/miu', // Simple cell reference
|
||||
],
|
||||
[
|
||||
'$1!$2:$3',
|
||||
'$1!$2',
|
||||
'$1:$2',
|
||||
'$1',
|
||||
],
|
||||
$value
|
||||
);
|
||||
// Convert references to defined names/formulae
|
||||
$value = str_replace('$$', '', $value);
|
||||
|
||||
// Convert ODS function argument separators to Excel function argument separators
|
||||
$value = Calculation::translateSeparator(';', ',', $value, $inFunctionBracesLevel);
|
||||
|
||||
// Convert ODS matrix separators to Excel matrix separators
|
||||
$value = Calculation::translateSeparator(
|
||||
';',
|
||||
',',
|
||||
$value,
|
||||
$inMatrixBracesLevel,
|
||||
Calculation::FORMULA_OPEN_MATRIX_BRACE,
|
||||
Calculation::FORMULA_CLOSE_MATRIX_BRACE
|
||||
);
|
||||
$value = Calculation::translateSeparator(
|
||||
'|',
|
||||
';',
|
||||
$value,
|
||||
$inMatrixBracesLevel,
|
||||
Calculation::FORMULA_OPEN_MATRIX_BRACE,
|
||||
Calculation::FORMULA_CLOSE_MATRIX_BRACE
|
||||
);
|
||||
|
||||
$value = (string) preg_replace('/COM\.MICROSOFT\./ui', '', $value);
|
||||
}
|
||||
}
|
||||
|
||||
// Then rebuild the formula string
|
||||
$excelFormula = implode('"', $temp);
|
||||
|
||||
return $excelFormula;
|
||||
}
|
||||
}
|
@@ -8,16 +8,41 @@ use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet;
|
||||
|
||||
class PageSettings
|
||||
{
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
private $officeNs;
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
private $stylesNs;
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
private $stylesFo;
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
private $tableNs;
|
||||
|
||||
/**
|
||||
* @var string[]
|
||||
*/
|
||||
private $tableStylesCrossReference = [];
|
||||
|
||||
private $pageLayoutStyles = [];
|
||||
|
||||
/**
|
||||
* @var string[]
|
||||
*/
|
||||
private $masterStylesCrossReference = [];
|
||||
|
||||
/**
|
||||
* @var string[]
|
||||
*/
|
||||
private $masterPrintStylesCrossReference = [];
|
||||
|
||||
public function __construct(DOMDocument $styleDom)
|
||||
@@ -32,6 +57,7 @@ class PageSettings
|
||||
$this->officeNs = $styleDom->lookupNamespaceUri('office');
|
||||
$this->stylesNs = $styleDom->lookupNamespaceUri('style');
|
||||
$this->stylesFo = $styleDom->lookupNamespaceUri('fo');
|
||||
$this->tableNs = $styleDom->lookupNamespaceUri('table');
|
||||
}
|
||||
|
||||
private function readPageSettingStyles(DOMDocument $styleDom): void
|
||||
@@ -54,10 +80,10 @@ class PageSettings
|
||||
$marginBottom = $pageLayoutProperties->getAttributeNS($this->stylesFo, 'margin-bottom');
|
||||
$header = $styleSet->getElementsByTagNameNS($this->stylesNs, 'header-style')[0];
|
||||
$headerProperties = $header->getElementsByTagNameNS($this->stylesNs, 'header-footer-properties')[0];
|
||||
$marginHeader = $headerProperties->getAttributeNS($this->stylesFo, 'min-height');
|
||||
$marginHeader = isset($headerProperties) ? $headerProperties->getAttributeNS($this->stylesFo, 'min-height') : null;
|
||||
$footer = $styleSet->getElementsByTagNameNS($this->stylesNs, 'footer-style')[0];
|
||||
$footerProperties = $footer->getElementsByTagNameNS($this->stylesNs, 'header-footer-properties')[0];
|
||||
$marginFooter = $footerProperties->getAttributeNS($this->stylesFo, 'min-height');
|
||||
$marginFooter = isset($footerProperties) ? $footerProperties->getAttributeNS($this->stylesFo, 'min-height') : null;
|
||||
|
||||
$this->pageLayoutStyles[$styleName] = (object) [
|
||||
'orientation' => $styleOrientation ?: PageSetup::ORIENTATION_DEFAULT,
|
||||
@@ -98,12 +124,33 @@ class PageSettings
|
||||
foreach ($styleXReferences as $styleXreferenceSet) {
|
||||
$styleXRefName = $styleXreferenceSet->getAttributeNS($this->stylesNs, 'name');
|
||||
$stylePageLayoutName = $styleXreferenceSet->getAttributeNS($this->stylesNs, 'master-page-name');
|
||||
$styleFamilyName = $styleXreferenceSet->getAttributeNS($this->stylesNs, 'family');
|
||||
if (!empty($styleFamilyName) && $styleFamilyName === 'table') {
|
||||
$styleVisibility = 'true';
|
||||
foreach ($styleXreferenceSet->getElementsByTagNameNS($this->stylesNs, 'table-properties') as $tableProperties) {
|
||||
$styleVisibility = $tableProperties->getAttributeNS($this->tableNs, 'display');
|
||||
}
|
||||
$this->tableStylesCrossReference[$styleXRefName] = $styleVisibility;
|
||||
}
|
||||
if (!empty($stylePageLayoutName)) {
|
||||
$this->masterStylesCrossReference[$styleXRefName] = $stylePageLayoutName;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public function setVisibilityForWorksheet(Worksheet $worksheet, string $styleName): void
|
||||
{
|
||||
if (!array_key_exists($styleName, $this->tableStylesCrossReference)) {
|
||||
return;
|
||||
}
|
||||
|
||||
$worksheet->setSheetState(
|
||||
$this->tableStylesCrossReference[$styleName] === 'false'
|
||||
? Worksheet::SHEETSTATE_HIDDEN
|
||||
: Worksheet::SHEETSTATE_VISIBLE
|
||||
);
|
||||
}
|
||||
|
||||
public function setPrintSettingsForWorksheet(Worksheet $worksheet, string $styleName): void
|
||||
{
|
||||
if (!array_key_exists($styleName, $this->masterStylesCrossReference)) {
|
||||
|
@@ -20,16 +20,18 @@ class Properties
|
||||
$docProps = $this->spreadsheet->getProperties();
|
||||
$officeProperty = $xml->children($namespacesMeta['office']);
|
||||
foreach ($officeProperty as $officePropertyData) {
|
||||
// @var \SimpleXMLElement $officePropertyData
|
||||
if (isset($namespacesMeta['dc'])) {
|
||||
/** @scrutinizer ignore-call */
|
||||
$officePropertiesDC = $officePropertyData->children($namespacesMeta['dc']);
|
||||
$this->setCoreProperties($docProps, $officePropertiesDC);
|
||||
}
|
||||
|
||||
$officePropertyMeta = (object) [];
|
||||
$officePropertyMeta = null;
|
||||
if (isset($namespacesMeta['dc'])) {
|
||||
/** @scrutinizer ignore-call */
|
||||
$officePropertyMeta = $officePropertyData->children($namespacesMeta['meta']);
|
||||
}
|
||||
$officePropertyMeta = $officePropertyMeta ?? [];
|
||||
foreach ($officePropertyMeta as $propertyName => $propertyValue) {
|
||||
$this->setMetaProperties($namespacesMeta, $propertyValue, $propertyName, $docProps);
|
||||
}
|
||||
@@ -55,9 +57,7 @@ class Properties
|
||||
|
||||
break;
|
||||
case 'date':
|
||||
$creationDate = strtotime($propertyValue);
|
||||
$docProps->setCreated($creationDate);
|
||||
$docProps->setModified($creationDate);
|
||||
$docProps->setModified($propertyValue);
|
||||
|
||||
break;
|
||||
case 'description':
|
||||
@@ -86,8 +86,7 @@ class Properties
|
||||
|
||||
break;
|
||||
case 'creation-date':
|
||||
$creationDate = strtotime($propertyValue);
|
||||
$docProps->setCreated($creationDate);
|
||||
$docProps->setCreated($propertyValue);
|
||||
|
||||
break;
|
||||
case 'user-defined':
|
||||
|
Reference in New Issue
Block a user