Files
oleibman 97aa5260d4 Ods Reader Style Support Part 3 - Borders
Continuing the work of PR #4810 and PR #4813. All "real" borders are implemented. Pseudo-borders (outline, vertical, horizontal, inside, and allBorders) are not because I'm not really sure how, or even if, Ods handles them. However, Sample20_Read_Ods demonstrates a way to emulate `outline` using just the real borders. In template OOCalcTest.ods cells B18:C19 are merged, and the merged cell has multi-colored borders, something which `outline` isn't able to do. Ods Reader handles this by assigning the border style first to cell B18 (which is what Ods wants, and it doesn't hurt Xlsx/Xls) and then to cells B18:C19 (which is what Xlsx and Xls want, and it doesn't hurt Ods).

Ods Reader changes still to come
- Style applied to entire row
- Style applied to entire column
- Parent styles?

Ods Writer changes still to come
- Style applied to entire row
- Style applied to entire column
- Parent styles?

Not currently on my to-do list
- Pseudo-borders
- Subscript and superscript fonts (these really only make sense for RichText, and I'm not sure how Ods handles RichText)
- Default border, alignment, and protection. I'm not convinced there's a use case. Ods handles its defaults in two different manners, and I don't want to spend the time trying to understand it without justification.
2026-02-19 17:54:39 -08:00

93 lines
5.0 KiB
PHP

<?php
declare(strict_types=1);
namespace PhpOffice\PhpSpreadsheetTests\Reader\Ods;
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Style\Border;
use PhpOffice\PhpSpreadsheet\Style\Borders;
use PhpOffice\PhpSpreadsheetTests\Functional\AbstractFunctional;
class BorderStyleTest extends AbstractFunctional
{
public function testReadAlignmentStyles(): void
{
$spreadsheetOld = new Spreadsheet();
$sheet = $spreadsheetOld->getActiveSheet();
$sheet->getCell('A1')->setValue('noStyle');
$sheet->getCell('A2')->setValue('left');
$sheet->getStyle('A2')->getBorders()
->getLeft()
->setBorderStyle(Border::BORDER_THICK);
$sheet->getCell('A3')->setValue('right');
$sheet->getStyle('A3')->getBorders()
->getRight()
->setBorderStyle(Border::BORDER_THIN)
->getColor()->setRgb('00ff00');
$sheet->getCell('A4')->setValue('top/bottom');
$sheet->getStyle('A4')->getBorders()
->getTop()
->setBorderStyle(Border::BORDER_DASHDOT)
->getColor()->setRgb('ff0000');
$sheet->getStyle('A4')->getBorders()
->getBottom()
->setBorderStyle(Border::BORDER_MEDIUMDASHDOT)
->getColor()->setRgb('0000ff');
$sheet->getCell('A5')->setValue('diagUp');
$sheet->getStyle('A5')->getBorders()
->setDiagonalDirection(Borders::DIAGONAL_UP)
->getDiagonal()
->setBorderStyle(Border::BORDER_DASHED)
->getColor()->setRgb('555555');
$sheet->getCell('A6')->setValue('diagDown');
$sheet->getStyle('A6')->getBorders()
->setDiagonalDirection(Borders::DIAGONAL_DOWN)
->getDiagonal()
->setBorderStyle(Border::BORDER_DOTTED)
->getColor()->setRgb('666666');
$sheet->getCell('A7')->setValue('diagBoth');
$sheet->getStyle('A7')->getBorders()
->setDiagonalDirection(Borders::DIAGONAL_BOTH)
->getDiagonal()
->setBorderStyle(Border::BORDER_DOUBLE)
->getColor()->setRgb('777777');
$spreadsheet = $this->writeAndReload($spreadsheetOld, 'Ods');
$spreadsheetOld->disconnectWorksheets();
$newSheet = $spreadsheet->getActiveSheet();
self::assertSame(Border::BORDER_NONE, $newSheet->getStyle('A1')->getBorders()->getLeft()->getBorderStyle());
self::assertSame(Border::BORDER_NONE, $newSheet->getStyle('A1')->getBorders()->getLeft()->getBorderStyle());
self::assertSame(Border::BORDER_NONE, $newSheet->getStyle('A1')->getBorders()->getRight()->getBorderStyle());
self::assertSame(Border::BORDER_NONE, $newSheet->getStyle('A1')->getBorders()->getBottom()->getBorderStyle());
self::assertSame(Border::BORDER_NONE, $newSheet->getStyle('A1')->getBorders()->getTop()->getBorderStyle());
self::assertSame(Border::BORDER_NONE, $newSheet->getStyle('A2')->getBorders()->getRight()->getBorderStyle());
self::assertSame(Border::BORDER_THICK, $newSheet->getStyle('A2')->getBorders()->getLeft()->getBorderStyle());
self::assertSame('000000', $newSheet->getStyle('A2')->getBorders()->getLeft()->getColor()->getRgb());
self::assertSame(Border::BORDER_THIN, $newSheet->getStyle('A3')->getBorders()->getRight()->getBorderStyle());
self::assertSame('00ff00', $newSheet->getStyle('A3')->getBorders()->getRight()->getColor()->getRgb());
self::assertSame(Border::BORDER_DASHDOT, $newSheet->getStyle('A4')->getBorders()->getTop()->getBorderStyle());
self::assertSame('ff0000', $newSheet->getStyle('A4')->getBorders()->getTop()->getColor()->getRgb());
self::assertSame(Border::BORDER_MEDIUMDASHDOT, $newSheet->getStyle('A4')->getBorders()->getBottom()->getBorderStyle());
self::assertSame('0000ff', $newSheet->getStyle('A4')->getBorders()->getBottom()->getColor()->getRgb());
self::assertSame(Border::BORDER_DASHED, $newSheet->getStyle('A5')->getBorders()->getDiagonal()->getBorderStyle());
self::assertSame('555555', $newSheet->getStyle('A5')->getBorders()->getDiagonal()->getColor()->getRgb());
self::assertSame(Borders::DIAGONAL_UP, $newSheet->getStyle('A5')->getBorders()->getDiagonalDirection());
self::assertSame(Border::BORDER_DOTTED, $newSheet->getStyle('A6')->getBorders()->getDiagonal()->getBorderStyle());
self::assertSame('666666', $newSheet->getStyle('A6')->getBorders()->getDiagonal()->getColor()->getRgb());
self::assertSame(Borders::DIAGONAL_DOWN, $newSheet->getStyle('A6')->getBorders()->getDiagonalDirection());
self::assertSame(Border::BORDER_DOUBLE, $newSheet->getStyle('A7')->getBorders()->getDiagonal()->getBorderStyle());
self::assertSame('777777', $newSheet->getStyle('A7')->getBorders()->getDiagonal()->getColor()->getRgb());
self::assertSame(Borders::DIAGONAL_BOTH, $newSheet->getStyle('A7')->getBorders()->getDiagonalDirection());
$spreadsheet->disconnectWorksheets();
}
}