maj options 4.x

This commit is contained in:
Jephté Clain 2025-01-23 11:08:12 +04:00
parent 37ce992b3e
commit 2f3865addc
3 changed files with 78 additions and 52 deletions

View File

@ -44,7 +44,7 @@
"autoload": {
"psr-4": {
"nulib\\": "src",
"OpenSpout\\": "upstream-3.x/src"
"OpenSpout\\": "upstream-4.x/src"
}
},
"autoload-dev": {

View File

@ -14,14 +14,21 @@ use nulib\ref\ext\spout\ref_builder_ods;
use nulib\ref\ext\spout\ref_builder_xlsx;
use nulib\str;
use nulib\web\http;
use OpenSpout\Common\Entity\Cell;
use OpenSpout\Common\Entity\Style\Border;
use OpenSpout\Common\Entity\Style\BorderPart;
use OpenSpout\Common\Entity\Cell\DateTimeCell;
use OpenSpout\Common\Entity\Cell\EmptyCell;
use OpenSpout\Common\Entity\Cell\NumericCell;
use OpenSpout\Common\Entity\Cell\StringCell;
use OpenSpout\Common\Entity\Row;
use OpenSpout\Common\Entity\Style\Color;
use OpenSpout\Common\Entity\Style\Style;
use OpenSpout\Common\Helper\CellTypeHelper;
use OpenSpout\Writer\Common\Creator\WriterEntityFactory;
use OpenSpout\Writer\WriterMultiSheetsAbstract;
use OpenSpout\Writer\AbstractWriterMultiSheets;
use OpenSpout\Writer\ODS\Options as ODSOptions;
use OpenSpout\Writer\ODS\Writer as ODSWriter;
use OpenSpout\Writer\XLSX\Entity\SheetView;
use OpenSpout\Writer\XLSX\Options as XLSXOptions;
use OpenSpout\Writer\XLSX\Writer as XLSXWriter;
class SpoutBuilder extends AbstractBuilder {
use TAbstractBuilder;
@ -42,16 +49,16 @@ class SpoutBuilder extends AbstractBuilder {
return $object;
}
protected static function add_border_part(?Border &$border, string $name, ?array $params): void {
protected static function add_border_part(?array &$parts, string $name, ?array $params): void {
if ($params === null) return;
if ($border === null) $border = new Border();
$part = new BorderPart($name);
if (($color = $params["color"] ?? null) !== null) {
$part->setColor(cl::get(ref_builder::COLORS, $color, $color));
$color = cl::get(ref_builder::COLORS, $color, $color);
} else {
$color = Color::BLACK;
}
if (($width = $params["width"] ?? null) !== null) $part->setWidth($width);
if (($style = $params["style"] ?? null) !== null) $part->setStyle($style);
$border->addPart($part);
if (($width = $params["width"] ?? null) === null) $width = Border::WIDTH_MEDIUM;
if (($style = $params["style"] ?? null) === null) $style = Border::STYLE_SOLID;
$parts[] = new BorderPart($name, $color, $width, $style);
}
protected static function set_defaults(?array &$params, string $key, array $defaults): void {
@ -82,7 +89,7 @@ class SpoutBuilder extends AbstractBuilder {
$style->setBackgroundColor(cl::get(ref_builder::COLORS, $color, $color));
}
if (($align = $cell["align"] ?? null) !== null) $style->setCellAlignment($align);
//if (($align = $cell["valign"] ?? null) !== null) $style->setCellVerticalAlignment($align);
if (($align = $cell["valign"] ?? null) !== null) $style->setCellVerticalAlignment($align);
if (($wrap = $cell["wrap"] ?? null) !== null) $style->setShouldWrapText($wrap);
if (($format = $cell["format"] ?? null) !== null) $style->setFormat($format);
if (($border = $cell["border"] ?? null) !== null) {
@ -114,17 +121,12 @@ class SpoutBuilder extends AbstractBuilder {
if ($colorAll !== null) $part["color"] = $colorAll;
}; unset($part);
}
$top = $border["top"] ?? null;
$right = $border["right"] ?? null;
$bottom = $border["bottom"] ?? null;
$left = $border["left"] ?? null;
$border = null;
self::add_border_part($border, "top", $top);
self::add_border_part($border, "right", $right);
self::add_border_part($border, "bottom", $bottom);
self::add_border_part($border, "left", $left);
if ($border !== null) $style->setBorder($border);
$parts = null;
self::add_border_part($parts, "top", $border["top"] ?? null);
self::add_border_part($parts, "right", $border["right"] ?? null);
self::add_border_part($parts, "bottom", $border["bottom"] ?? null);
self::add_border_part($parts, "left", $border["left"] ?? null);
if ($parts !== null) $style->setBorder(new Border(...$parts));
}
return $style;
}
@ -173,23 +175,27 @@ class SpoutBuilder extends AbstractBuilder {
case "ods":
case self::SS_TYPE_ODS:
$ssType = self::SS_TYPE_ODS;
$ssWriter = WriterEntityFactory::createODSWriter();
self::apply_params($ssWriter, $spoutParams, ref_builder_ods::PARAMS_SPOUT);
$options = new ODSOptions();
$writerClass = ODSWriter::class;
$refParams = ref_builder_ods::PARAMS_SPOUT;
break;
case "xlsx":
case self::SS_TYPE_XLSX:
default:
$ssType = self::SS_TYPE_XLSX;
$ssWriter = WriterEntityFactory::createXLSXWriter();
self::apply_params($ssWriter, $spoutParams, ref_builder_xlsx::PARAMS_SPOUT);
break;
$ssType = self::SS_TYPE_XLSX;
$options = new XLSXOptions();
$writerClass = XLSXWriter::class;
$refParams = ref_builder_xlsx::PARAMS_SPOUT;
break;
}
$defaultColumnWidth = $spoutParams["default_column_width"] ?? null;
if ($defaultColumnWidth !== null) $ssWriter->setDefaultColumnWidth($defaultColumnWidth);
if ($defaultColumnWidth !== null) $options->DEFAULT_COLUMN_WIDTH = $defaultColumnWidth;
$defaultRowHeight = $spoutParams["default_row_height"] ?? null;
if ($defaultRowHeight !== null) $ssWriter->setDefaultRowHeight($defaultRowHeight);
if ($defaultRowHeight !== null) $options->DEFAULT_ROW_HEIGHT = $defaultRowHeight;
$defaultRowStyle = $spoutParams["default_row_style"] ?? null;
if ($defaultRowStyle !== null) $ssWriter->setDefaultRowStyle($defaultRowStyle);
if ($defaultRowStyle !== null) $options->DEFAULT_ROW_STYLE = $defaultRowStyle;
self::apply_params($options, $spoutParams, $refParams);
$ssWriter = new $writerClass($options);
$ssWriter->writeToStream($this->getResource());
$this->ssType = $ssType;
@ -213,7 +219,7 @@ class SpoutBuilder extends AbstractBuilder {
/** @var int type de fichier généré */
protected int $ssType;
protected WriterMultiSheetsAbstract $ssWriter;
protected AbstractWriterMultiSheets $ssWriter;
protected ?array $spoutParams;
@ -356,10 +362,6 @@ class SpoutBuilder extends AbstractBuilder {
$style ??= new Style();
$style->setFormat(self::DATETIME_FORMAT);
return true;
} elseif (CellTypeHelper::isDateTimeOrDateInterval($value)) {
$style ??= new Style();
$style->setFormat(self::DATE_FORMAT);
return true;
}
if (!is_string($value) || !$this->typeDate) return false;
if (DateTime::isa_datetime($value, true)) {
@ -401,16 +403,14 @@ class SpoutBuilder extends AbstractBuilder {
$style = $colStyles[$key] ?? null;
self::ensure_style($style);
if ($col === null || $col === "") {
$type = Cell::TYPE_EMPTY;
$cell = new EmptyCell(null, $style);
} elseif ($this->isNumeric($col)) {
$type = Cell::TYPE_NUMERIC;
$cell = new NumericCell($col, $style);
} elseif ($this->isDate($col, $style)) {
$type = Cell::TYPE_DATE;
$cell = new DateTimeCell($col, $style);
} else {
$type = Cell::TYPE_STRING;
$cell = new StringCell($col, $style);
}
$cell = WriterEntityFactory::createCell($col, $style);
$cell->setType($type);
$cells[] = $cell;
}
@ -421,7 +421,7 @@ class SpoutBuilder extends AbstractBuilder {
}
$rowStyle ??= $oddStyle;
self::ensure_style($rowStyle);
$row = WriterEntityFactory::createRow($cells, $rowStyle);
$row = new Row($cells, $rowStyle);
self::apply_params($row, $rowParams, ref_builder::ROW_PARAMS);
$mergeCells = $rowParams["merge_cells"] ?? null;

View File

@ -1,16 +1,42 @@
<?php
namespace nulib\ref\ext\spout;
use OpenSpout\Writer\XLSX\Options\HeaderFooter;
use OpenSpout\Writer\XLSX\Options\PageMargin;
use OpenSpout\Writer\XLSX\Options\PageSetup;
class ref_builder_xlsx extends ref_builder {
const PARAMS_SPOUT = [
...parent::PARAMS_SPOUT,
"->setPageSetup" => [
PageSetup::class,
"page_orientation" => "string",
"page_size" => "string",
"fit_to_height" => "bool",
"fit_to_width" => "bool",
],
"->setPageMargin" => [
PageMargin::class,
"top" => "float",
"right" => "float",
"bottom" => "float",
"left" => "float",
"header" => "float",
"footer" => "float",
],
"->setHeaderFooter" => [
HeaderFooter::class,
"odd_header" => "string",
"odd_footer" => "string",
"even_header" => "string",
"even_footer" => "string",
"different_odd_even" => "bool",
],
];
const PARAMS_SHEET = [
...parent::PARAMS_SHEET,
"view" => self::PARAMS_SHEET_VIEW,
# copie de parent::SHEET
"->setName" => ["string"],
"->setIsVisible" => ["bool"],
"header_style" => self::STYLE,
"odd_style" => self::STYLE,
"even_style" => self::STYLE,
"different_odd_even" => "bool",
];
const PARAMS_SHEET_VIEW = [