init
This commit is contained in:
commit
72a26edcff
22092 changed files with 2101903 additions and 0 deletions
147
lib/PhpSpreadsheet/Reader/Gnumeric/PageSetup.php
Normal file
147
lib/PhpSpreadsheet/Reader/Gnumeric/PageSetup.php
Normal file
|
|
@ -0,0 +1,147 @@
|
|||
<?php
|
||||
|
||||
namespace PhpOffice\PhpSpreadsheet\Reader\Gnumeric;
|
||||
|
||||
use PhpOffice\PhpSpreadsheet\Reader\Gnumeric;
|
||||
use PhpOffice\PhpSpreadsheet\Spreadsheet;
|
||||
use PhpOffice\PhpSpreadsheet\Worksheet\PageMargins;
|
||||
use PhpOffice\PhpSpreadsheet\Worksheet\PageSetup as WorksheetPageSetup;
|
||||
use SimpleXMLElement;
|
||||
|
||||
class PageSetup
|
||||
{
|
||||
private Spreadsheet $spreadsheet;
|
||||
|
||||
public function __construct(Spreadsheet $spreadsheet)
|
||||
{
|
||||
$this->spreadsheet = $spreadsheet;
|
||||
}
|
||||
|
||||
public function printInformation(SimpleXMLElement $sheet): self
|
||||
{
|
||||
if (isset($sheet->PrintInformation, $sheet->PrintInformation[0])) {
|
||||
$printInformation = $sheet->PrintInformation[0];
|
||||
$setup = $this->spreadsheet->getActiveSheet()->getPageSetup();
|
||||
|
||||
$attributes = $printInformation->Scale->attributes();
|
||||
if (isset($attributes['percentage'])) {
|
||||
$setup->setScale((int) $attributes['percentage']);
|
||||
}
|
||||
$pageOrder = (string) $printInformation->order;
|
||||
if ($pageOrder === 'r_then_d') {
|
||||
$setup->setPageOrder(WorksheetPageSetup::PAGEORDER_OVER_THEN_DOWN);
|
||||
} elseif ($pageOrder === 'd_then_r') {
|
||||
$setup->setPageOrder(WorksheetPageSetup::PAGEORDER_DOWN_THEN_OVER);
|
||||
}
|
||||
$orientation = (string) $printInformation->orientation;
|
||||
if ($orientation !== '') {
|
||||
$setup->setOrientation($orientation);
|
||||
}
|
||||
$attributes = $printInformation->hcenter->attributes();
|
||||
if (isset($attributes['value'])) {
|
||||
$setup->setHorizontalCentered((bool) (string) $attributes['value']);
|
||||
}
|
||||
$attributes = $printInformation->vcenter->attributes();
|
||||
if (isset($attributes['value'])) {
|
||||
$setup->setVerticalCentered((bool) (string) $attributes['value']);
|
||||
}
|
||||
}
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function sheetMargins(SimpleXMLElement $sheet): self
|
||||
{
|
||||
if (isset($sheet->PrintInformation, $sheet->PrintInformation->Margins)) {
|
||||
$marginSet = [
|
||||
// Default Settings
|
||||
'top' => 0.75,
|
||||
'header' => 0.3,
|
||||
'left' => 0.7,
|
||||
'right' => 0.7,
|
||||
'bottom' => 0.75,
|
||||
'footer' => 0.3,
|
||||
];
|
||||
|
||||
$marginSet = $this->buildMarginSet($sheet, $marginSet);
|
||||
$this->adjustMargins($marginSet);
|
||||
}
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
private function buildMarginSet(SimpleXMLElement $sheet, array $marginSet): array
|
||||
{
|
||||
foreach ($sheet->PrintInformation->Margins->children(Gnumeric::NAMESPACE_GNM) as $key => $margin) {
|
||||
$marginAttributes = $margin->attributes();
|
||||
$marginSize = ($marginAttributes['Points']) ?? 72; // Default is 72pt
|
||||
// Convert value in points to inches
|
||||
$marginSize = PageMargins::fromPoints((float) $marginSize);
|
||||
$marginSet[$key] = $marginSize;
|
||||
}
|
||||
|
||||
return $marginSet;
|
||||
}
|
||||
|
||||
private function adjustMargins(array $marginSet): void
|
||||
{
|
||||
foreach ($marginSet as $key => $marginSize) {
|
||||
// Gnumeric is quirky in the way it displays the header/footer values:
|
||||
// header is actually the sum of top and header; footer is actually the sum of bottom and footer
|
||||
// then top is actually the header value, and bottom is actually the footer value
|
||||
switch ($key) {
|
||||
case 'left':
|
||||
case 'right':
|
||||
$this->sheetMargin($key, $marginSize);
|
||||
|
||||
break;
|
||||
case 'top':
|
||||
$this->sheetMargin($key, $marginSet['header'] ?? 0);
|
||||
|
||||
break;
|
||||
case 'bottom':
|
||||
$this->sheetMargin($key, $marginSet['footer'] ?? 0);
|
||||
|
||||
break;
|
||||
case 'header':
|
||||
$this->sheetMargin($key, ($marginSet['top'] ?? 0) - $marginSize);
|
||||
|
||||
break;
|
||||
case 'footer':
|
||||
$this->sheetMargin($key, ($marginSet['bottom'] ?? 0) - $marginSize);
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private function sheetMargin(string $key, float $marginSize): void
|
||||
{
|
||||
switch ($key) {
|
||||
case 'top':
|
||||
$this->spreadsheet->getActiveSheet()->getPageMargins()->setTop($marginSize);
|
||||
|
||||
break;
|
||||
case 'bottom':
|
||||
$this->spreadsheet->getActiveSheet()->getPageMargins()->setBottom($marginSize);
|
||||
|
||||
break;
|
||||
case 'left':
|
||||
$this->spreadsheet->getActiveSheet()->getPageMargins()->setLeft($marginSize);
|
||||
|
||||
break;
|
||||
case 'right':
|
||||
$this->spreadsheet->getActiveSheet()->getPageMargins()->setRight($marginSize);
|
||||
|
||||
break;
|
||||
case 'header':
|
||||
$this->spreadsheet->getActiveSheet()->getPageMargins()->setHeader($marginSize);
|
||||
|
||||
break;
|
||||
case 'footer':
|
||||
$this->spreadsheet->getActiveSheet()->getPageMargins()->setFooter($marginSize);
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
161
lib/PhpSpreadsheet/Reader/Gnumeric/Properties.php
Normal file
161
lib/PhpSpreadsheet/Reader/Gnumeric/Properties.php
Normal file
|
|
@ -0,0 +1,161 @@
|
|||
<?php
|
||||
|
||||
namespace PhpOffice\PhpSpreadsheet\Reader\Gnumeric;
|
||||
|
||||
use PhpOffice\PhpSpreadsheet\Reader\Gnumeric;
|
||||
use PhpOffice\PhpSpreadsheet\Spreadsheet;
|
||||
use SimpleXMLElement;
|
||||
|
||||
class Properties
|
||||
{
|
||||
protected Spreadsheet $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);
|
||||
}
|
||||
}
|
||||
}
|
||||
273
lib/PhpSpreadsheet/Reader/Gnumeric/Styles.php
Normal file
273
lib/PhpSpreadsheet/Reader/Gnumeric/Styles.php
Normal file
|
|
@ -0,0 +1,273 @@
|
|||
<?php
|
||||
|
||||
namespace PhpOffice\PhpSpreadsheet\Reader\Gnumeric;
|
||||
|
||||
use PhpOffice\PhpSpreadsheet\Cell\Coordinate;
|
||||
use PhpOffice\PhpSpreadsheet\Shared\Date;
|
||||
use PhpOffice\PhpSpreadsheet\Spreadsheet;
|
||||
use PhpOffice\PhpSpreadsheet\Style\Alignment;
|
||||
use PhpOffice\PhpSpreadsheet\Style\Border;
|
||||
use PhpOffice\PhpSpreadsheet\Style\Borders;
|
||||
use PhpOffice\PhpSpreadsheet\Style\Fill;
|
||||
use PhpOffice\PhpSpreadsheet\Style\Font;
|
||||
use SimpleXMLElement;
|
||||
|
||||
class Styles
|
||||
{
|
||||
private Spreadsheet $spreadsheet;
|
||||
|
||||
protected bool $readDataOnly;
|
||||
|
||||
public static array $mappings = [
|
||||
'borderStyle' => [
|
||||
'0' => Border::BORDER_NONE,
|
||||
'1' => Border::BORDER_THIN,
|
||||
'2' => Border::BORDER_MEDIUM,
|
||||
'3' => Border::BORDER_SLANTDASHDOT,
|
||||
'4' => Border::BORDER_DASHED,
|
||||
'5' => Border::BORDER_THICK,
|
||||
'6' => Border::BORDER_DOUBLE,
|
||||
'7' => Border::BORDER_DOTTED,
|
||||
'8' => Border::BORDER_MEDIUMDASHED,
|
||||
'9' => Border::BORDER_DASHDOT,
|
||||
'10' => Border::BORDER_MEDIUMDASHDOT,
|
||||
'11' => Border::BORDER_DASHDOTDOT,
|
||||
'12' => Border::BORDER_MEDIUMDASHDOTDOT,
|
||||
'13' => Border::BORDER_MEDIUMDASHDOTDOT,
|
||||
],
|
||||
'fillType' => [
|
||||
'1' => Fill::FILL_SOLID,
|
||||
'2' => Fill::FILL_PATTERN_DARKGRAY,
|
||||
'3' => Fill::FILL_PATTERN_MEDIUMGRAY,
|
||||
'4' => Fill::FILL_PATTERN_LIGHTGRAY,
|
||||
'5' => Fill::FILL_PATTERN_GRAY125,
|
||||
'6' => Fill::FILL_PATTERN_GRAY0625,
|
||||
'7' => Fill::FILL_PATTERN_DARKHORIZONTAL, // horizontal stripe
|
||||
'8' => Fill::FILL_PATTERN_DARKVERTICAL, // vertical stripe
|
||||
'9' => Fill::FILL_PATTERN_DARKDOWN, // diagonal stripe
|
||||
'10' => Fill::FILL_PATTERN_DARKUP, // reverse diagonal stripe
|
||||
'11' => Fill::FILL_PATTERN_DARKGRID, // diagoanl crosshatch
|
||||
'12' => Fill::FILL_PATTERN_DARKTRELLIS, // thick diagonal crosshatch
|
||||
'13' => Fill::FILL_PATTERN_LIGHTHORIZONTAL,
|
||||
'14' => Fill::FILL_PATTERN_LIGHTVERTICAL,
|
||||
'15' => Fill::FILL_PATTERN_LIGHTUP,
|
||||
'16' => Fill::FILL_PATTERN_LIGHTDOWN,
|
||||
'17' => Fill::FILL_PATTERN_LIGHTGRID, // thin horizontal crosshatch
|
||||
'18' => Fill::FILL_PATTERN_LIGHTTRELLIS, // thin diagonal crosshatch
|
||||
],
|
||||
'horizontal' => [
|
||||
'1' => Alignment::HORIZONTAL_GENERAL,
|
||||
'2' => Alignment::HORIZONTAL_LEFT,
|
||||
'4' => Alignment::HORIZONTAL_RIGHT,
|
||||
'8' => Alignment::HORIZONTAL_CENTER,
|
||||
'16' => Alignment::HORIZONTAL_CENTER_CONTINUOUS,
|
||||
'32' => Alignment::HORIZONTAL_JUSTIFY,
|
||||
'64' => Alignment::HORIZONTAL_CENTER_CONTINUOUS,
|
||||
],
|
||||
'underline' => [
|
||||
'1' => Font::UNDERLINE_SINGLE,
|
||||
'2' => Font::UNDERLINE_DOUBLE,
|
||||
'3' => Font::UNDERLINE_SINGLEACCOUNTING,
|
||||
'4' => Font::UNDERLINE_DOUBLEACCOUNTING,
|
||||
],
|
||||
'vertical' => [
|
||||
'1' => Alignment::VERTICAL_TOP,
|
||||
'2' => Alignment::VERTICAL_BOTTOM,
|
||||
'4' => Alignment::VERTICAL_CENTER,
|
||||
'8' => Alignment::VERTICAL_JUSTIFY,
|
||||
],
|
||||
];
|
||||
|
||||
public function __construct(Spreadsheet $spreadsheet, bool $readDataOnly)
|
||||
{
|
||||
$this->spreadsheet = $spreadsheet;
|
||||
$this->readDataOnly = $readDataOnly;
|
||||
}
|
||||
|
||||
public function read(SimpleXMLElement $sheet, int $maxRow, int $maxCol): void
|
||||
{
|
||||
if ($sheet->Styles->StyleRegion !== null) {
|
||||
$this->readStyles($sheet->Styles->StyleRegion, $maxRow, $maxCol);
|
||||
}
|
||||
}
|
||||
|
||||
private function readStyles(SimpleXMLElement $styleRegion, int $maxRow, int $maxCol): void
|
||||
{
|
||||
foreach ($styleRegion as $style) {
|
||||
$styleAttributes = $style->attributes();
|
||||
if ($styleAttributes !== null && ($styleAttributes['startRow'] <= $maxRow) && ($styleAttributes['startCol'] <= $maxCol)) {
|
||||
$cellRange = $this->readStyleRange($styleAttributes, $maxCol, $maxRow);
|
||||
|
||||
$styleAttributes = $style->Style->attributes();
|
||||
|
||||
$styleArray = [];
|
||||
// We still set the number format mask for date/time values, even if readDataOnly is true
|
||||
// so that we can identify whether a float is a float or a date value
|
||||
$formatCode = $styleAttributes ? (string) $styleAttributes['Format'] : null;
|
||||
if ($formatCode && Date::isDateTimeFormatCode($formatCode)) {
|
||||
$styleArray['numberFormat']['formatCode'] = $formatCode;
|
||||
}
|
||||
if ($this->readDataOnly === false && $styleAttributes !== null) {
|
||||
// If readDataOnly is false, we set all formatting information
|
||||
$styleArray['numberFormat']['formatCode'] = $formatCode;
|
||||
$styleArray = $this->readStyle($styleArray, $styleAttributes, $style);
|
||||
}
|
||||
$this->spreadsheet->getActiveSheet()->getStyle($cellRange)->applyFromArray($styleArray);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private function addBorderDiagonal(SimpleXMLElement $srssb, array &$styleArray): void
|
||||
{
|
||||
if (isset($srssb->Diagonal, $srssb->{'Rev-Diagonal'})) {
|
||||
$styleArray['borders']['diagonal'] = self::parseBorderAttributes($srssb->Diagonal->attributes());
|
||||
$styleArray['borders']['diagonalDirection'] = Borders::DIAGONAL_BOTH;
|
||||
} elseif (isset($srssb->Diagonal)) {
|
||||
$styleArray['borders']['diagonal'] = self::parseBorderAttributes($srssb->Diagonal->attributes());
|
||||
$styleArray['borders']['diagonalDirection'] = Borders::DIAGONAL_UP;
|
||||
} elseif (isset($srssb->{'Rev-Diagonal'})) {
|
||||
$styleArray['borders']['diagonal'] = self::parseBorderAttributes($srssb->{'Rev-Diagonal'}->attributes());
|
||||
$styleArray['borders']['diagonalDirection'] = Borders::DIAGONAL_DOWN;
|
||||
}
|
||||
}
|
||||
|
||||
private function addBorderStyle(SimpleXMLElement $srssb, array &$styleArray, string $direction): void
|
||||
{
|
||||
$ucDirection = ucfirst($direction);
|
||||
if (isset($srssb->$ucDirection)) {
|
||||
$styleArray['borders'][$direction] = self::parseBorderAttributes($srssb->$ucDirection->attributes());
|
||||
}
|
||||
}
|
||||
|
||||
private function calcRotation(SimpleXMLElement $styleAttributes): int
|
||||
{
|
||||
$rotation = (int) $styleAttributes->Rotation;
|
||||
if ($rotation >= 270 && $rotation <= 360) {
|
||||
$rotation -= 360;
|
||||
}
|
||||
$rotation = (abs($rotation) > 90) ? 0 : $rotation;
|
||||
|
||||
return $rotation;
|
||||
}
|
||||
|
||||
private static function addStyle(array &$styleArray, string $key, string $value): void
|
||||
{
|
||||
if (array_key_exists($value, self::$mappings[$key])) {
|
||||
$styleArray[$key] = self::$mappings[$key][$value];
|
||||
}
|
||||
}
|
||||
|
||||
private static function addStyle2(array &$styleArray, string $key1, string $key, string $value): void
|
||||
{
|
||||
if (array_key_exists($value, self::$mappings[$key])) {
|
||||
$styleArray[$key1][$key] = self::$mappings[$key][$value];
|
||||
}
|
||||
}
|
||||
|
||||
private static function parseBorderAttributes(?SimpleXMLElement $borderAttributes): array
|
||||
{
|
||||
$styleArray = [];
|
||||
if ($borderAttributes !== null) {
|
||||
if (isset($borderAttributes['Color'])) {
|
||||
$styleArray['color']['rgb'] = self::parseGnumericColour($borderAttributes['Color']);
|
||||
}
|
||||
|
||||
self::addStyle($styleArray, 'borderStyle', (string) $borderAttributes['Style']);
|
||||
}
|
||||
|
||||
return $styleArray;
|
||||
}
|
||||
|
||||
private static function parseGnumericColour(string $gnmColour): string
|
||||
{
|
||||
[$gnmR, $gnmG, $gnmB] = explode(':', $gnmColour);
|
||||
$gnmR = substr(str_pad($gnmR, 4, '0', STR_PAD_RIGHT), 0, 2);
|
||||
$gnmG = substr(str_pad($gnmG, 4, '0', STR_PAD_RIGHT), 0, 2);
|
||||
$gnmB = substr(str_pad($gnmB, 4, '0', STR_PAD_RIGHT), 0, 2);
|
||||
|
||||
return $gnmR . $gnmG . $gnmB;
|
||||
}
|
||||
|
||||
private function addColors(array &$styleArray, SimpleXMLElement $styleAttributes): void
|
||||
{
|
||||
$RGB = self::parseGnumericColour((string) $styleAttributes['Fore']);
|
||||
$styleArray['font']['color']['rgb'] = $RGB;
|
||||
$RGB = self::parseGnumericColour((string) $styleAttributes['Back']);
|
||||
$shade = (string) $styleAttributes['Shade'];
|
||||
if (($RGB !== '000000') || ($shade !== '0')) {
|
||||
$RGB2 = self::parseGnumericColour((string) $styleAttributes['PatternColor']);
|
||||
if ($shade === '1') {
|
||||
$styleArray['fill']['startColor']['rgb'] = $RGB;
|
||||
$styleArray['fill']['endColor']['rgb'] = $RGB2;
|
||||
} else {
|
||||
$styleArray['fill']['endColor']['rgb'] = $RGB;
|
||||
$styleArray['fill']['startColor']['rgb'] = $RGB2;
|
||||
}
|
||||
self::addStyle2($styleArray, 'fill', 'fillType', $shade);
|
||||
}
|
||||
}
|
||||
|
||||
private function readStyleRange(SimpleXMLElement $styleAttributes, int $maxCol, int $maxRow): string
|
||||
{
|
||||
$startColumn = Coordinate::stringFromColumnIndex((int) $styleAttributes['startCol'] + 1);
|
||||
$startRow = $styleAttributes['startRow'] + 1;
|
||||
|
||||
$endColumn = ($styleAttributes['endCol'] > $maxCol) ? $maxCol : (int) $styleAttributes['endCol'];
|
||||
$endColumn = Coordinate::stringFromColumnIndex($endColumn + 1);
|
||||
|
||||
$endRow = 1 + (($styleAttributes['endRow'] > $maxRow) ? $maxRow : (int) $styleAttributes['endRow']);
|
||||
$cellRange = $startColumn . $startRow . ':' . $endColumn . $endRow;
|
||||
|
||||
return $cellRange;
|
||||
}
|
||||
|
||||
private function readStyle(array $styleArray, SimpleXMLElement $styleAttributes, SimpleXMLElement $style): array
|
||||
{
|
||||
self::addStyle2($styleArray, 'alignment', 'horizontal', (string) $styleAttributes['HAlign']);
|
||||
self::addStyle2($styleArray, 'alignment', 'vertical', (string) $styleAttributes['VAlign']);
|
||||
$styleArray['alignment']['wrapText'] = $styleAttributes['WrapText'] == '1';
|
||||
$styleArray['alignment']['textRotation'] = $this->calcRotation($styleAttributes);
|
||||
$styleArray['alignment']['shrinkToFit'] = $styleAttributes['ShrinkToFit'] == '1';
|
||||
$styleArray['alignment']['indent'] = ((int) ($styleAttributes['Indent']) > 0) ? $styleAttributes['indent'] : 0;
|
||||
|
||||
$this->addColors($styleArray, $styleAttributes);
|
||||
|
||||
$fontAttributes = $style->Style->Font->attributes();
|
||||
if ($fontAttributes !== null) {
|
||||
$styleArray['font']['name'] = (string) $style->Style->Font;
|
||||
$styleArray['font']['size'] = (int) ($fontAttributes['Unit']);
|
||||
$styleArray['font']['bold'] = $fontAttributes['Bold'] == '1';
|
||||
$styleArray['font']['italic'] = $fontAttributes['Italic'] == '1';
|
||||
$styleArray['font']['strikethrough'] = $fontAttributes['StrikeThrough'] == '1';
|
||||
self::addStyle2($styleArray, 'font', 'underline', (string) $fontAttributes['Underline']);
|
||||
|
||||
switch ($fontAttributes['Script']) {
|
||||
case '1':
|
||||
$styleArray['font']['superscript'] = true;
|
||||
|
||||
break;
|
||||
case '-1':
|
||||
$styleArray['font']['subscript'] = true;
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (isset($style->Style->StyleBorder)) {
|
||||
$srssb = $style->Style->StyleBorder;
|
||||
$this->addBorderStyle($srssb, $styleArray, 'top');
|
||||
$this->addBorderStyle($srssb, $styleArray, 'bottom');
|
||||
$this->addBorderStyle($srssb, $styleArray, 'left');
|
||||
$this->addBorderStyle($srssb, $styleArray, 'right');
|
||||
$this->addBorderDiagonal($srssb, $styleArray);
|
||||
}
|
||||
// TO DO
|
||||
/*
|
||||
if (isset($style->Style->HyperLink)) {
|
||||
$hyperlink = $style->Style->HyperLink->attributes();
|
||||
}
|
||||
*/
|
||||
|
||||
return $styleArray;
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue