Skip to content

Commit f085c85

Browse files
authored
Writer ODS : Writer Border Style for cells (#3693)
* Writer ODS : Write Border Style for cells * Writer ODS : Write Border Style for cells (Replaced protected by private && Added Unit Test) ---------
1 parent 6fbf474 commit f085c85

File tree

3 files changed

+120
-0
lines changed

3 files changed

+120
-0
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ and this project adheres to [Semantic Versioning](https://semver.org).
2121
- ListWorksheetInfo/Names for Html/Csv/Slk. [Issue #3706](https://github.com/PHPOffice/PhpSpreadsheet/issues/3706) [PR #3709](https://github.com/PHPOffice/PhpSpreadsheet/pull/3709)
2222
- Methods to determine if cell is actually locked, or hidden on formula bar. [PR #3722](https://github.com/PHPOffice/PhpSpreadsheet/pull/3722)
2323
- Add iterateOnlyExistingCells to Constructors. [Issue #3721](https://github.com/PHPOffice/PhpSpreadsheet/issues/3721) [PR #3727](https://github.com/PHPOffice/PhpSpreadsheet/pull/3727)
24+
- Writer ODS : Write Border Style for cells [Issue #3690](https://github.com/PHPOffice/PhpSpreadsheet/issues/3690) [PR #3693](https://github.com/PHPOffice/PhpSpreadsheet/pull/3693)
2425

2526
### Changed
2627

src/PhpSpreadsheet/Writer/Ods/Cell/Style.php

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
use PhpOffice\PhpSpreadsheet\Helper\Dimension;
66
use PhpOffice\PhpSpreadsheet\Shared\XMLWriter;
77
use PhpOffice\PhpSpreadsheet\Style\Alignment;
8+
use PhpOffice\PhpSpreadsheet\Style\Border;
9+
use PhpOffice\PhpSpreadsheet\Style\Borders;
810
use PhpOffice\PhpSpreadsheet\Style\Fill;
911
use PhpOffice\PhpSpreadsheet\Style\Font;
1012
use PhpOffice\PhpSpreadsheet\Style\Style as CellStyle;
@@ -65,6 +67,80 @@ private function writeFillStyle(Fill $fill): void
6567
}
6668
}
6769

70+
private function writeBordersStyle(Borders $borders): void
71+
{
72+
$this->writeBorderStyle('bottom', $borders->getBottom());
73+
$this->writeBorderStyle('left', $borders->getLeft());
74+
$this->writeBorderStyle('right', $borders->getRight());
75+
$this->writeBorderStyle('top', $borders->getTop());
76+
}
77+
78+
private function writeBorderStyle(string $direction, Border $border): void
79+
{
80+
if ($border->getBorderStyle() === Border::BORDER_NONE) {
81+
return;
82+
}
83+
84+
$this->writer->writeAttribute('fo:border-' . $direction, sprintf(
85+
'%s %s #%s',
86+
$this->mapBorderWidth($border),
87+
$this->mapBorderStyle($border),
88+
$border->getColor()->getRGB(),
89+
));
90+
}
91+
92+
private function mapBorderWidth(Border $border): string
93+
{
94+
switch ($border->getBorderStyle()) {
95+
case Border::BORDER_THIN:
96+
case Border::BORDER_DASHED:
97+
case Border::BORDER_DASHDOT:
98+
case Border::BORDER_DASHDOTDOT:
99+
case Border::BORDER_DOTTED:
100+
case Border::BORDER_HAIR:
101+
return '0.75pt';
102+
case Border::BORDER_MEDIUM:
103+
case Border::BORDER_MEDIUMDASHED:
104+
case Border::BORDER_MEDIUMDASHDOT:
105+
case Border::BORDER_MEDIUMDASHDOTDOT:
106+
case Border::BORDER_SLANTDASHDOT:
107+
return '1.75pt';
108+
case Border::BORDER_DOUBLE:
109+
case Border::BORDER_THICK:
110+
return '2.5pt';
111+
}
112+
113+
return '1pt';
114+
}
115+
116+
private function mapBorderStyle(Border $border): string
117+
{
118+
switch ($border->getBorderStyle()) {
119+
case Border::BORDER_DOTTED:
120+
case Border::BORDER_MEDIUMDASHDOTDOT:
121+
return Border::BORDER_DOTTED;
122+
123+
case Border::BORDER_DASHED:
124+
case Border::BORDER_DASHDOT:
125+
case Border::BORDER_DASHDOTDOT:
126+
case Border::BORDER_MEDIUMDASHDOT:
127+
case Border::BORDER_MEDIUMDASHED:
128+
case Border::BORDER_SLANTDASHDOT:
129+
return Border::BORDER_DASHED;
130+
131+
case Border::BORDER_DOUBLE:
132+
return Border::BORDER_DOUBLE;
133+
134+
case Border::BORDER_HAIR:
135+
case Border::BORDER_MEDIUM:
136+
case Border::BORDER_THICK:
137+
case Border::BORDER_THIN:
138+
return 'solid';
139+
}
140+
141+
return 'solid';
142+
}
143+
68144
private function writeCellProperties(CellStyle $style): void
69145
{
70146
// Align
@@ -87,6 +163,9 @@ private function writeCellProperties(CellStyle $style): void
87163
// Fill
88164
$this->writeFillStyle($style->getFill());
89165

166+
// Border
167+
$this->writeBordersStyle($style->getBorders());
168+
90169
$this->writer->endElement();
91170

92171
if (!empty($hAlign)) {

tests/PhpSpreadsheetTests/Writer/Ods/ContentTest.php

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,13 @@
44

55
namespace PhpOffice\PhpSpreadsheetTests\Writer\Ods;
66

7+
use DOMDocument;
8+
use DOMXPath;
79
use PhpOffice\PhpSpreadsheet\Calculation\Functions;
810
use PhpOffice\PhpSpreadsheet\Cell\DataType;
911
use PhpOffice\PhpSpreadsheet\Shared\Date;
1012
use PhpOffice\PhpSpreadsheet\Spreadsheet;
13+
use PhpOffice\PhpSpreadsheet\Style\Border;
1114
use PhpOffice\PhpSpreadsheet\Style\Color;
1215
use PhpOffice\PhpSpreadsheet\Style\Fill;
1316
use PhpOffice\PhpSpreadsheet\Style\Font;
@@ -124,4 +127,41 @@ public function testWriteWithHiddenWorksheet(): void
124127

125128
self::assertXmlStringEqualsXmlFile($this->samplesPath . '/content-hidden-worksheet.xml', $xml);
126129
}
130+
131+
public function testWriteBorderStyle(): void
132+
{
133+
$spreadsheet = new Spreadsheet();
134+
$spreadsheet->getActiveSheet()->getStyle('A1:B2')->applyFromArray([
135+
'borders' => [
136+
'outline' => [
137+
'borderStyle' => Border::BORDER_THICK,
138+
'color' => ['argb' => 'AA22DD00'],
139+
],
140+
],
141+
]);
142+
143+
$content = new Content(new Ods($spreadsheet));
144+
$xml = $content->write();
145+
146+
$xmlDoc = new DOMDocument();
147+
$xmlDoc->loadXML($xml);
148+
$xmlPath = new DOMXPath($xmlDoc);
149+
150+
foreach (['top', 'bottom'] as $keyRow => $row) {
151+
foreach (['left', 'right'] as $keyCell => $cell) {
152+
$styles = ['top' => '', 'bottom' => '', 'left' => '', 'right' => ''];
153+
$styles[$row] = '2.5pt solid #22DD00';
154+
$styles[$cell] = '2.5pt solid #22DD00';
155+
156+
$query = 'string(//office:document-content/office:body/office:spreadsheet/table:table/table:table-row[position()=' . ($keyRow + 1) . ']/table:table-cell[position()=' . ($keyCell + 1) . ']/@table:style-name)';
157+
$idStyle = $xmlPath->evaluate($query);
158+
159+
foreach ($styles as $direction => $value) {
160+
$query = 'string(//office:document-content/office:automatic-styles/style:style[@style:name="' . $idStyle . '"]/style:table-cell-properties/@fo:border-' . $direction . ')';
161+
$style = $xmlPath->evaluate($query);
162+
self::assertEquals($style, $value);
163+
}
164+
}
165+
}
166+
}
127167
}

0 commit comments

Comments
 (0)