Skip to content

Commit 7548be1

Browse files
authored
Merge pull request #4815 from oleibman/odsstyles4b
Ods Reader Style Support (Last) - Column Styles (Partial)
2 parents 2920b2a + 6b7d204 commit 7548be1

File tree

12 files changed

+281
-51
lines changed

12 files changed

+281
-51
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ and this project adheres to [Semantic Versioning](https://semver.org). Thia is a
4444
- Ods Reader fonts and fills. [Issue #2622](https://github.com/PHPOffice/PhpSpreadsheet/issues/2622) [Issue #1191](https://github.com/PHPOffice/PhpSpreadsheet/issues/1191) [PR #4810](https://github.com/PHPOffice/PhpSpreadsheet/pull/4810)
4545
- Ods Reader alignment and cell protection. [PR #4813](https://github.com/PHPOffice/PhpSpreadsheet/pull/4813)
4646
- Ods Reader borders. [PR #4814](https://github.com/PHPOffice/PhpSpreadsheet/pull/4814)
47+
- Ods Reader column styles (partial). [PR #4815](https://github.com/PHPOffice/PhpSpreadsheet/pull/4815)
4748

4849
## 2026-01-10 - 5.4.0
4950

src/PhpSpreadsheet/Reader/Ods.php

Lines changed: 172 additions & 40 deletions
Large diffs are not rendered by default.

src/PhpSpreadsheet/Writer/Ods/Content.php

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,6 @@ private function writeSheets(XMLWriter $objWriter): void
142142
'table:style-name',
143143
sprintf('%s_%d_%d', Style::COLUMN_STYLE_PREFIX, $sheetIndex, $columnDimension->getColumnNumeric())
144144
);
145-
$objWriter->writeAttribute('table:default-cell-style-name', 'ce0');
146145
$objWriter->endElement();
147146
}
148147
$this->writeRows($objWriter, $spreadsheet->getSheet($sheetIndex), $sheetIndex);
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace PhpOffice\PhpSpreadsheetTests\Reader\Ods;
6+
7+
use PhpOffice\PhpSpreadsheet\Helper\Dimension;
8+
use PhpOffice\PhpSpreadsheet\Reader\Ods as OdsReader;
9+
use PHPUnit\Framework\TestCase;
10+
11+
/**
12+
* @TODO There is some fuzziness in the conversions to and from column widths
13+
*/
14+
class ColGroupTest extends TestCase
15+
{
16+
private const ODS_COLGROUP_FILE = 'tests/data/Reader/Ods/colgroup.ods';
17+
private const ODS_COLHEADER_FILE = 'tests/data/Reader/Ods/colheader.ods';
18+
19+
public function testColGroup(): void
20+
{
21+
$reader = new OdsReader();
22+
$reader->setReadEmptyCells(false);
23+
$spreadsheet = $reader->load(self::ODS_COLGROUP_FILE);
24+
self::assertSame('Arial', $spreadsheet->getDefaultStyle()->getFont()->getName());
25+
$sheet = $spreadsheet->getActiveSheet();
26+
$expected = [
27+
'A' => 2.778,
28+
'B' => 2.99,
29+
'C' => 2.91,
30+
'D' => 2.858,
31+
'E' => 1.746,
32+
'F' => 1.746,
33+
'G' => 1.746,
34+
'H' => 1.746,
35+
];
36+
foreach ($expected as $col => $width) {
37+
self::assertEqualsWithDelta(
38+
$width,
39+
$sheet->getColumnDimension($col)
40+
->getWidth(Dimension::UOM_CENTIMETERS),
41+
1.0E-3,
42+
"mismatch for column $col"
43+
);
44+
}
45+
$spreadsheet->disconnectWorksheets();
46+
}
47+
48+
public function testColHeader(): void
49+
{
50+
$reader = new OdsReader();
51+
$reader->setReadEmptyCells(false);
52+
$spreadsheet = $reader->load(self::ODS_COLHEADER_FILE);
53+
self::assertSame('Liberation Sans', $spreadsheet->getDefaultStyle()->getFont()->getName());
54+
$sheet = $spreadsheet->getActiveSheet();
55+
$expected = [
56+
'A' => 2.858,
57+
];
58+
foreach ($expected as $col => $width) {
59+
self::assertEqualsWithDelta(
60+
$width,
61+
$sheet->getColumnDimension($col)
62+
->getWidth(Dimension::UOM_CENTIMETERS),
63+
1.0E-3,
64+
"mismatch for column $col"
65+
);
66+
}
67+
$spreadsheet->disconnectWorksheets();
68+
}
69+
}

tests/PhpSpreadsheetTests/Reader/Ods/CurrencyTest.php

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,6 @@
77
use PhpOffice\PhpSpreadsheet\Reader\Ods;
88
use PHPUnit\Framework\TestCase;
99

10-
/**
11-
* @TODO The class doesn't read the bold/italic/underline properties (rich text)
12-
*/
1310
class CurrencyTest extends TestCase
1411
{
1512
private const ODS_CURRENCY_FILE = 'tests/data/Reader/Ods/currency4.ods';

tests/PhpSpreadsheetTests/Reader/Ods/FontStyleTest.php

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,4 +121,18 @@ public static function testNoExplicitDefaultStyle(): void
121121
self::assertSame('Times New Roman', $sheet->getStyle('A1')->getFont()->getName());
122122
$spreadsheet->disconnectWorksheets();
123123
}
124+
125+
public static function testDataOnly(): void
126+
{
127+
$reader = new OdsReader();
128+
$reader->setReadDataOnly(true);
129+
$infile = 'tests/data/Reader/Ods/odsstyles5.ods';
130+
$spreadsheet = $reader->load($infile);
131+
self::assertSame('Calibri', $spreadsheet->getDefaultStyle()->getFont()->getName(), 'ignore spreadsheet style, use PhpSpreadsheet default');
132+
$sheet = $spreadsheet->getActiveSheet();
133+
self::assertSame(-1.0, $sheet->getColumnDimension('A')->getWidth());
134+
self::assertSame('Calibri', $sheet->getStyle('A1')->getFont()->getName());
135+
self::assertSame(13, $sheet->getCell('A1')->getValue());
136+
$spreadsheet->disconnectWorksheets();
137+
}
124138
}

tests/PhpSpreadsheetTests/Reader/Ods/Issue3721Test.php

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99

1010
class Issue3721Test extends TestCase
1111
{
12-
public function testIssue2810(): void
12+
public function xtestIssue2810ReadEmpty(): void
1313
{
1414
// Problems with getHighestDataColumn
1515
$filename = 'tests/data/Reader/Ods/issue.3721.ods';
@@ -29,4 +29,26 @@ public function testIssue2810(): void
2929
self::assertSame('BL', $sheet->getHighestColumn());
3030
$spreadsheet->disconnectWorksheets();
3131
}
32+
33+
public function testIssue2810NoReadEmpty(): void
34+
{
35+
// Problems with getHighestDataColumn
36+
$filename = 'tests/data/Reader/Ods/issue.3721.ods';
37+
$reader = new Ods();
38+
$reader->setReadEmptyCells(false);
39+
$spreadsheet = $reader->load($filename);
40+
$sheet = $spreadsheet->getSheetByNameOrThrow('sheet with data');
41+
$origHigh = $sheet->getHighestDataColumn();
42+
self::assertSame('C', $origHigh);
43+
$cells = [];
44+
foreach ($sheet->getRowIterator() as $row) {
45+
foreach ($row->getCellIterator(iterateOnlyExistingCells: true) as $cell) {
46+
$cells[] = $cell->getCoordinate();
47+
}
48+
}
49+
self::assertSame(['A1', 'B1', 'C1', 'A2', 'B2', 'C2'], $cells);
50+
self::assertSame('C', $sheet->getHighestDataColumn());
51+
self::assertSame('C', $sheet->getHighestColumn());
52+
$spreadsheet->disconnectWorksheets();
53+
}
3254
}

tests/PhpSpreadsheetTests/Reader/Ods/NestedTableRowTest.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ public function testTableHeaderRows(): void
1313
{
1414
$infile = 'tests/data/Reader/Ods/issue.4528.ods';
1515
$reader = new OdsReader();
16+
$reader->setReadDataOnly(true)->setReadEmptyCells(false);
1617
$spreadsheet = $reader->load($infile);
1718
$sheet = $spreadsheet->getActiveSheet();
1819
self::assertSame('Atterissage', $sheet->getCell('AS1')->getValue());
@@ -26,6 +27,7 @@ public function testTableRowGroup(): void
2627
{
2728
$infile = 'tests/data/Reader/Ods/issue.2507.ods';
2829
$reader = new OdsReader();
30+
$reader->setReadDataOnly(true)->setReadEmptyCells(false);
2931
$spreadsheet = $reader->load($infile);
3032
$sheet = $spreadsheet->getActiveSheet();
3133
$values = $sheet->rangeToArray('B3:C7', null, false, false);

tests/PhpSpreadsheetTests/Reader/Ods/OdsInfoTest.php

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,6 @@
88
use PhpOffice\PhpSpreadsheet\Reader\Ods;
99
use PHPUnit\Framework\TestCase;
1010

11-
/**
12-
* @TODO The class doesn't read the bold/italic/underline properties (rich text)
13-
*/
1411
class OdsInfoTest extends TestCase
1512
{
1613
public function testReadFileProperties(): void

tests/PhpSpreadsheetTests/Reader/Ods/OdsTest.php

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,6 @@
1212
use PhpOffice\PhpSpreadsheet\Style\Font;
1313
use PHPUnit\Framework\TestCase;
1414

15-
/**
16-
* @TODO The class doesn't read the bold/italic/underline properties (rich text)
17-
*/
1815
class OdsTest extends TestCase
1916
{
2017
private const ODS_TEST_FILE = 'samples/templates/OOCalcTest.ods';

0 commit comments

Comments
 (0)