Skip to content

Commit 6c1b00b

Browse files
authored
Merge pull request #4087 from oleibman/issue804
Ods Xml Reader and Whitespace Text Nodes
2 parents ca41de3 + 2c150d5 commit 6c1b00b

File tree

6 files changed

+74
-24
lines changed

6 files changed

+74
-24
lines changed

CHANGELOG.md

+1
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ and this project adheres to [Semantic Versioning](https://semver.org).
4141
- Problem rendering line chart with missing plot label. [PR #4074](https://github.com/PHPOffice/PhpSpreadsheet/pull/4074)
4242
- More RTL in Xlsx/Html Comments [Issue #4004](https://github.com/PHPOffice/PhpSpreadsheet/issues/4004) [PR #4065](https://github.com/PHPOffice/PhpSpreadsheet/pull/4065)
4343
- Empty String in sharedStrings. [Issue #4063](https://github.com/PHPOffice/PhpSpreadsheet/issues/4063) [PR #4064](https://github.com/PHPOffice/PhpSpreadsheet/pull/4064)
44+
- Ods Xml Reader and Whitespace Text Nodes. [Issue #804](https://github.com/PHPOffice/PhpSpreadsheet/issues/804) [PR #4087](https://github.com/PHPOffice/PhpSpreadsheet/pull/4087)
4445
- Treat invalid formulas as strings. [Issue #1310](https://github.com/PHPOffice/PhpSpreadsheet/issues/1310) [PR #4073](https://github.com/PHPOffice/PhpSpreadsheet/pull/4073)
4546

4647
## 2024-05-11 - 2.1.0

docs/index.md

+3
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,9 @@ allow you to read and write various spreadsheet file formats such as Excel and L
2020
|CSV |||
2121
|PDF (using either the TCPDF, Dompdf or mPDF libraries, which need to be installed separately)| ||
2222

23+
Note - reading or writing certain aspects of a spreadsheet may not be supported in all formats. For more details, please consult
24+
[Features Cross-reference](./references/features-cross-reference.md).
25+
2326
# Getting started
2427

2528
## Software requirements

docs/references/features-cross-reference.md

+27-23
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
<td style="text-align: center; color: green;">✔</td>
2929
<td style="text-align: center; color: green;">✔</td>
3030
<td style="text-align: center; color: orange;">●</td>
31-
<td style="text-align: center; color: orange;">●</td>
31+
<td style="text-align: center; color: orange;">● <a href="#footnote6"><sup>6</sup></a></td>
3232
<td style="text-align: center; color: green;">✔</td>
3333
<td style="text-align: center;">N/A</td>
3434
<td style="text-align: center;">N/A</td>
@@ -389,7 +389,7 @@
389389
</tr>
390390
<tr>
391391
<td style="padding-left: 0.5em;"><strong>Conditional Formatting</strong></td>
392-
<td style="text-align: center; color: orange;"></td>
392+
<td style="text-align: center; color: green;"></td>
393393
<td style="text-align: center; color: green;">✔</td>
394394
<td style="text-align: center; color: red;">✖</td>
395395
<td style="text-align: center; color: red;">✖</td>
@@ -414,7 +414,7 @@
414414
<td style="text-align: center; color: green;">✔</td>
415415
<td style="text-align: center; color: green;">✔</td>
416416
<td style="text-align: center; color: green;">✔</td>
417-
<td style="text-align: center; color: red;"></td>
417+
<td style="text-align: center; color: green;"></td>
418418
<td style="text-align: center; color: green;">✔</td>
419419
<td style="text-align: center;">N/A</td>
420420
<td style="text-align: center;">N/A</td>
@@ -495,14 +495,14 @@
495495
<td style="text-align: center; color: green;">✔</td>
496496
<td style="text-align: center;">N/A</td>
497497
<td style="text-align: center; color: orange;">●</td>
498-
<td style="text-align: center; color: orange;">●</td>
498+
<td style="text-align: center; color: orange;">● <a href="#footnote7"><sup>7</sup></a></td>
499499
</tr>
500500
<tr>
501501
<td style="padding-left: 1em;">Number Format Mask</td>
502502
<td style="text-align: center; color: green;">✔</td>
503503
<td style="text-align: center; color: green;">✔</td>
504504
<td style="text-align: center; color: green;">✔</td>
505-
<td style="text-align: center; color: green;"></td>
505+
<td style="text-align: center; color: orange;"></td>
506506
<td style="text-align: center; color: green;">✔</td>
507507
<td style="text-align: center;">N/A</td>
508508
<td style="text-align: center; color: green;">✔</td>
@@ -517,7 +517,7 @@
517517
<td style="text-align: center; color: green;">✔</td>
518518
<td style="text-align: center;">N/A</td>
519519
<td style="text-align: center; color: red;">✖</td>
520-
<td style="text-align: center; color: orange;">●</td>
520+
<td style="text-align: center; color: orange;">● <a href="#footnote7"><sup>7</sup></a></td>
521521
</tr>
522522
<tr>
523523
<td style="padding-left: 2em;">Horizontal</td>
@@ -583,7 +583,7 @@
583583
<td style="text-align: center; color: green;">✔</td>
584584
<td style="text-align: center;">N/A</td>
585585
<td style="text-align: center; color: green;">✔</td>
586-
<td style="text-align: center; color: green;"></td>
586+
<td style="text-align: center; color: orange;">● <a href="#footnote7"><sup>7</sup></a></td>
587587
</tr>
588588
<tr>
589589
<td style="padding-left: 2em;">Patterned</td>
@@ -605,7 +605,7 @@
605605
<td style="text-align: center; color: green;">✔</td>
606606
<td style="text-align: center;">N/A</td>
607607
<td style="text-align: center; color: green;">✔</td>
608-
<td style="text-align: center; color: green;"></td>
608+
<td style="text-align: center; color: orange;">● <a href="#footnote7"><sup>7</sup></a></td>
609609
</tr>
610610
<tr>
611611
<td style="padding-left: 2em;">Font Face</td>
@@ -704,7 +704,7 @@
704704
<td style="text-align: center; color: green;">✔</td>
705705
<td style="text-align: center;">N/A</td>
706706
<td style="text-align: center; color: orange;">●</td>
707-
<td style="text-align: center; color: green;"></td>
707+
<td style="text-align: center; color: orange;">● <a href="#footnote7"><sup>7</sup></a></td>
708708
</tr>
709709
<tr>
710710
<td style="padding-left: 2em;">Line Style</td>
@@ -797,13 +797,13 @@
797797
<tr>
798798
<td style="padding-left: 2em;">Alignment</td>
799799
<td style="text-align: center; color: red;">✖ <a href="#footnote3"><sup>3</sup></a></td>
800-
<td style="text-align: center; color: red;"></td>
800+
<td style="text-align: center; color: green;"></td>
801801
<td style="text-align: center; color: red;">✖</td>
802802
<td style="text-align: center; color: red;">✖</td>
803803
<td style="text-align: center; color: red;">✖</td>
804804
<td style="text-align: center;">N/A</td>
805805
<td style="text-align: center; color: red;">✖</td>
806-
<td style="text-align: center; color: red;"></td>
806+
<td style="text-align: center; color: green;"></td>
807807
</tr>
808808
<tr>
809809
<td style="padding-left: 2em;">Background Image</td>
@@ -929,7 +929,7 @@
929929
<tr>
930930
<td style="padding-left: 0.5em;"><a href="#setGetMacro"><strong>Macros</strong></a></td>
931931
<td style="text-align: center; color: red;">✖</td>
932-
<td style="text-align: center; color: green;"></td>
932+
<td style="text-align: center; color: orange;">● <a href="#footnote5"><sup>5</sup</td>
933933
<td style="text-align: center; color: red;">✖</td>
934934
<td style="text-align: center; color: red;">✖</td>
935935
<td style="text-align: center; color: red;">✖</td>
@@ -940,7 +940,7 @@
940940
<tr>
941941
<td style="padding-left: 0.5em;"><strong>Form Controls</strong></td>
942942
<td style="text-align: center; color: red;">✖</td>
943-
<td style="text-align: center; color: red;"></td>
943+
<td style="text-align: center; color: orange;">● <a href="#footnote4"><sup>4</sup</td>
944944
<td style="text-align: center; color: red;">✖</td>
945945
<td style="text-align: center; color: red;">✖</td>
946946
<td style="text-align: center; color: red;">✖</td>
@@ -1001,6 +1001,10 @@
10011001
1. <span id="footnote1">Only text contents</span>
10021002
2. <span id="footnote2">Only BIFF8 files support Rich Text. Prior to that, comments could only be plain text</span>
10031003
3. <span id="footnote3">Only BIFF8 files support alignment and rotation. Prior to that, comments could only be unformatted text</span>
1004+
4. <span id="footnote4">Xlsx forms and controls can be read and written but not otherwise manipulated</span>
1005+
5. <span id="footnote5">Xlsx macros can be read and written; their values can be retrieved and changed, but only in a binary form which is unlikely to be useful</span>
1006+
6. <span id="footnote6">There is very limited support for reading styles from an Ods spreadsheet. Writing styles has better support, although Number Format is incomplete.</span>
1007+
7. <span id="footnote7">In most cases, Html reader processes only inline styles; styles provided by Css classes may be ignored.</span>
10041008

10051009
## Writers
10061010

@@ -1184,7 +1188,7 @@
11841188
<td style="padding-left: 1em;">Row Height/Column Width</td>
11851189
<td style="text-align: center; color: green;">✔</td>
11861190
<td style="text-align: center; color: green;">✔</td>
1187-
<td style="text-align: center; color: red;"></td>
1191+
<td style="text-align: center; color: green;"></td>
11881192
<td style="text-align: center;">N/A</td>
11891193
<td style="text-align: center; color: green;">✔</td>
11901194
<td style="text-align: center; color: green;">✔</td>
@@ -1256,7 +1260,7 @@
12561260
<td style="padding-left: 1em;">Number Format Mask</td>
12571261
<td style="text-align: center; color: green;">✔</td>
12581262
<td style="text-align: center; color: green;">✔</td>
1259-
<td style="text-align: center; color: green;"></td>
1263+
<td style="text-align: center; color: orange;"></td>
12601264
<td style="text-align: center;">N/A</td>
12611265
<td style="text-align: center; color: green;">✔</td>
12621266
<td style="text-align: center; color: green;">✔</td>
@@ -1472,10 +1476,10 @@
14721476
<td style="padding-left: 0.5em;"><strong>Merged Cells</strong></td>
14731477
<td style="text-align: center; color: green;">✔</td>
14741478
<td style="text-align: center; color: green;">✔</td>
1475-
<td style="text-align: center; color: red;"></td>
1479+
<td style="text-align: center; color: green;"></td>
14761480
<td style="text-align: center;">N/A</td>
14771481
<td style="text-align: center; color: green;">✔</td>
1478-
<td style="text-align: center; color: red;"></td>
1482+
<td style="text-align: center; color: green;"></td>
14791483
</tr>
14801484
<tr>
14811485
<td style="padding-left: 0.5em;"><a href="#setGetComment"><strong>Cell Comments</strong></a></td>
@@ -1498,10 +1502,10 @@
14981502
<tr>
14991503
<td style="padding-left: 1em;">Alignment</td>
15001504
<td style="text-align: center; color: red;">✖</td>
1501-
<td style="text-align: center; color: red;"></td>
1505+
<td style="text-align: center; color: green;"></td>
15021506
<td style="text-align: center; color: red;">✖</td>
15031507
<td style="text-align: center;">N/A</td>
1504-
<td style="text-align: center; color: red;"></td>
1508+
<td style="text-align: center; color: green;"></td>
15051509
<td style="text-align: center;">N/A</td>
15061510
</tr>
15071511
<tr>
@@ -1606,7 +1610,7 @@
16061610
<tr>
16071611
<td style="padding-left: 0.5em;"><a href="#setGetMacro"><strong>Macros</strong></a></td>
16081612
<td style="text-align: center; color: red;">✖</td>
1609-
<td style="text-align: center; color: green;"></td>
1613+
<td style="text-align: center; color: orange;">● <a href="#footnote5"><sup>5</sup</td>
16101614
<td style="text-align: center; color: red;">✖</td>
16111615
<td style="text-align: center;">N/A</td>
16121616
<td style="text-align: center; color: red;">✖</td>
@@ -1615,7 +1619,7 @@
16151619
<tr>
16161620
<td style="padding-left: 0.5em;"><strong>Form Controls</strong></td>
16171621
<td style="text-align: center; color: red;">✖</td>
1618-
<td style="text-align: center; color: red;"></td>
1622+
<td style="text-align: center; color: orange;">● <a href="#footnote4"><sup>4</sup</td>
16191623
<td style="text-align: center; color: red;">✖</td>
16201624
<td style="text-align: center;">N/A</td>
16211625
<td style="text-align: center; color: red;">✖</td>
@@ -1803,8 +1807,8 @@
18031807
</tr>
18041808
<tr>
18051809
<td id="setGetMacro"><strong>Macros</strong></td>
1806-
<td>$spreadsheet->getMacrosCode();</td>
1807-
<td>$spreadsheet->setMacrosCode();</td>
1810+
<td>$spreadsheet->getMacrosCode();<a href="#footnote5"><sup>5</sup></td>
1811+
<td>$spreadsheet->setMacrosCode();<a href="#footnote5"><sup>5</sup></td>
18081812
</tr>
18091813
<tr>
18101814
<td id="setGetSecurity"><strong>Security</strong></td>

src/PhpSpreadsheet/Reader/Ods.php

+5-1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
use DOMDocument;
77
use DOMElement;
88
use DOMNode;
9+
use DOMText;
910
use PhpOffice\PhpSpreadsheet\Cell\Coordinate;
1011
use PhpOffice\PhpSpreadsheet\Cell\DataType;
1112
use PhpOffice\PhpSpreadsheet\Helper\Dimension as HelperDimension;
@@ -403,8 +404,11 @@ public function loadIntoExisting(string $filename, Spreadsheet $spreadsheet): Sp
403404
}
404405

405406
$columnID = 'A';
406-
/** @var DOMElement $cellData */
407+
/** @var DOMElement|DOMText $cellData */
407408
foreach ($childNode->childNodes as $cellData) {
409+
if ($cellData instanceof DOMText) {
410+
continue; // should just be whitespace
411+
}
408412
if ($this->getReadFilter() !== null) {
409413
if (!$this->getReadFilter()->readCell($columnID, $rowID, $worksheetName)) {
410414
if ($cellData->hasAttributeNS($tableNs, 'number-columns-repeated')) {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace PhpOffice\PhpSpreadsheetTests\Reader\Ods;
6+
7+
use PhpOffice\PhpSpreadsheet\Reader\Ods;
8+
use PHPUnit\Framework\TestCase;
9+
10+
class Issue804Test extends TestCase
11+
{
12+
public function testPreliminaries(): void
13+
{
14+
$file = 'zip://';
15+
$file .= 'tests/data/Reader/Ods/issue.804.ods';
16+
$file .= '#content.xml';
17+
$data = file_get_contents($file);
18+
// confirm that file contains expected namespaced xml tag
19+
if ($data === false) {
20+
self::fail('Unable to read file');
21+
} else {
22+
self::assertStringContainsString('<table:table-row>
23+
<table:table-cell office:value-type="string" table:number-rows-spanned="1" table:style-name="heading">
24+
<text:p>Name</text:p>', $data);
25+
}
26+
}
27+
28+
public function testIssue2810(): void
29+
{
30+
// Whitespace between Xml nodes
31+
$filename = 'tests/data/Reader/Ods/issue.804.ods';
32+
$reader = new Ods();
33+
$spreadsheet = $reader->load($filename);
34+
$sheet = $spreadsheet->getActiveSheet();
35+
self::assertSame('Straße', $sheet->getCell('G1')->getValue());
36+
$spreadsheet->disconnectWorksheets();
37+
}
38+
}

tests/data/Reader/Ods/issue.804.ods

4.86 KB
Binary file not shown.

0 commit comments

Comments
 (0)