diff --git a/CHANGELOG.md b/CHANGELOG.md
index dda1af25..5c0f089a 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -43,6 +43,7 @@ and this project adheres to [Semantic Versioning](https://semver.org).
### Added
+- Alignment for ODS Writer [#1796](https://github.com/PHPOffice/PhpSpreadsheet/issues/1796)
- CSV Reader - Best Guess for Encoding, and Handle Null-string Escape [#1647](https://github.com/PHPOffice/PhpSpreadsheet/issues/1647)
### Changed
diff --git a/src/PhpSpreadsheet/Writer/Ods/Content.php b/src/PhpSpreadsheet/Writer/Ods/Content.php
index 3222a9c7..f66225c5 100644
--- a/src/PhpSpreadsheet/Writer/Ods/Content.php
+++ b/src/PhpSpreadsheet/Writer/Ods/Content.php
@@ -7,6 +7,7 @@ use PhpOffice\PhpSpreadsheet\Cell\Coordinate;
use PhpOffice\PhpSpreadsheet\Cell\DataType;
use PhpOffice\PhpSpreadsheet\Shared\XMLWriter;
use PhpOffice\PhpSpreadsheet\Spreadsheet;
+use PhpOffice\PhpSpreadsheet\Style\Alignment;
use PhpOffice\PhpSpreadsheet\Style\Fill;
use PhpOffice\PhpSpreadsheet\Style\Font;
use PhpOffice\PhpSpreadsheet\Worksheet\Row;
@@ -270,6 +271,38 @@ class Content extends WriterPart
}
}
+ private function mapHorizontalAlignment(string $horizontalAlignment): string
+ {
+ switch ($horizontalAlignment) {
+ case Alignment::HORIZONTAL_CENTER:
+ case Alignment::HORIZONTAL_CENTER_CONTINUOUS:
+ case Alignment::HORIZONTAL_DISTRIBUTED:
+ return 'center';
+ case Alignment::HORIZONTAL_RIGHT:
+ return 'end';
+ case Alignment::HORIZONTAL_FILL:
+ case Alignment::HORIZONTAL_JUSTIFY:
+ return 'justify';
+ }
+
+ return 'start';
+ }
+
+ private function mapVerticalAlignment(string $verticalAlignment): string
+ {
+ switch ($verticalAlignment) {
+ case Alignment::VERTICAL_TOP:
+ return 'top';
+ case Alignment::VERTICAL_CENTER:
+ return 'middle';
+ case Alignment::VERTICAL_DISTRIBUTED:
+ case Alignment::VERTICAL_JUSTIFY:
+ return 'automatic';
+ }
+
+ return 'bottom';
+ }
+
/**
* Write XF cell styles.
*/
@@ -281,6 +314,51 @@ class Content extends WriterPart
$writer->writeAttribute('style:family', 'table-cell');
$writer->writeAttribute('style:parent-style-name', 'Default');
+ // Align
+ $hAlign = $style->getAlignment()->getHorizontal();
+ $vAlign = $style->getAlignment()->getVertical();
+ $wrap = $style->getAlignment()->getWrapText();
+
+ $writer->startElement('style:table-cell-properties');
+ if (!empty($vAlign) || $wrap) {
+ if (!empty($vAlign)) {
+ $vAlign = $this->mapVerticalAlignment($vAlign);
+ $writer->writeAttribute('style:vertical-align', $vAlign);
+ }
+ if ($wrap) {
+ $writer->writeAttribute('fo:wrap-option', 'wrap');
+ }
+ }
+ $writer->writeAttribute('style:rotation-align', 'none');
+
+ // Fill
+ if ($fill = $style->getFill()) {
+ switch ($fill->getFillType()) {
+ case Fill::FILL_SOLID:
+ $writer->writeAttribute('fo:background-color', sprintf(
+ '#%s',
+ strtolower($fill->getStartColor()->getRGB())
+ ));
+
+ break;
+ case Fill::FILL_GRADIENT_LINEAR:
+ case Fill::FILL_GRADIENT_PATH:
+ /// TODO :: To be implemented
+ break;
+ case Fill::FILL_NONE:
+ default:
+ }
+ }
+
+ $writer->endElement();
+
+ if (!empty($hAlign)) {
+ $hAlign = $this->mapHorizontalAlignment($hAlign);
+ $writer->startElement('style:paragraph-properties');
+ $writer->writeAttribute('fo:text-align', $hAlign);
+ $writer->endElement();
+ }
+
// style:text-properties
// Font
@@ -329,34 +407,7 @@ class Content extends WriterPart
$writer->endElement(); // Close style:text-properties
- // style:table-cell-properties
-
- $writer->startElement('style:table-cell-properties');
- $writer->writeAttribute('style:rotation-align', 'none');
-
- // Fill
- if ($fill = $style->getFill()) {
- switch ($fill->getFillType()) {
- case Fill::FILL_SOLID:
- $writer->writeAttribute('fo:background-color', sprintf(
- '#%s',
- strtolower($fill->getStartColor()->getRGB())
- ));
-
- break;
- case Fill::FILL_GRADIENT_LINEAR:
- case Fill::FILL_GRADIENT_PATH:
- /// TODO :: To be implemented
- break;
- case Fill::FILL_NONE:
- default:
- }
- }
-
- $writer->endElement(); // Close style:table-cell-properties
-
// End
-
$writer->endElement(); // Close style:style
}
}
diff --git a/tests/data/Writer/Ods/content-empty.xml b/tests/data/Writer/Ods/content-empty.xml
index 87f756db..c9620060 100644
--- a/tests/data/Writer/Ods/content-empty.xml
+++ b/tests/data/Writer/Ods/content-empty.xml
@@ -4,8 +4,9 @@
+
+
-
diff --git a/tests/data/Writer/Ods/content-with-data.xml b/tests/data/Writer/Ods/content-with-data.xml
index a13ed0be..a707d197 100644
--- a/tests/data/Writer/Ods/content-with-data.xml
+++ b/tests/data/Writer/Ods/content-with-data.xml
@@ -4,48 +4,59 @@
+
+
-
+
+
-
+
+
-
+
+
-
+
+
-
+
+
-
+
+
-
+
+
-
+
+
-
+
+
-
+
+
-