Skip to content

Commit 817556b

Browse files
authored
Merge pull request #4187 from oleibman/issue2157
Excel 2003 Allows Html Entities
2 parents f4919af + 672be54 commit 817556b

File tree

4 files changed

+153
-3
lines changed

4 files changed

+153
-3
lines changed

CHANGELOG.md

+3-3
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,11 @@ and this project adheres to [Semantic Versioning](https://semver.org).
99

1010
### Added
1111

12-
- Nothing yet.
12+
- Add Dynamic valueBinder Property to Spreadsheet and Readers. [Issue #1395](https://github.com/PHPOffice/PhpSpreadsheet/issues/1395) [PR #4185](https://github.com/PHPOffice/PhpSpreadsheet/pull/4185)
1313

1414
### Changed
1515

16-
- Nothing yet.
16+
- Refactor Xls Reader. [PR #4118](https://github.com/PHPOffice/PhpSpreadsheet/pull/4118)
1717

1818
### Deprecated
1919

@@ -32,7 +32,7 @@ and this project adheres to [Semantic Versioning](https://semver.org).
3232
- Image Transparency/Opacity with Html Reader Changes. [Discussion #4117](https://github.com/PHPOffice/PhpSpreadsheet/discussions/4117) [PR #4142](https://github.com/PHPOffice/PhpSpreadsheet/pull/4142)
3333
- Option to Write Hyperlink Rather Than Label to Csv. [Issue #1412](https://github.com/PHPOffice/PhpSpreadsheet/issues/1412) [PR #4151](https://github.com/PHPOffice/PhpSpreadsheet/pull/4151)
3434
- Invalid Html Due to Cached Filesize. [Issue #1107](https://github.com/PHPOffice/PhpSpreadsheet/issues/1107) [PR #4184](https://github.com/PHPOffice/PhpSpreadsheet/pull/4184)
35-
- Add Dynamic valueBinder Property to Spreadsheet and Readers. [Issue #1395](https://github.com/PHPOffice/PhpSpreadsheet/issues/1395) [PR #4185](https://github.com/PHPOffice/PhpSpreadsheet/pull/4185)
35+
- Excel 2003 Allows Html Entities. [Issue #2157](https://github.com/PHPOffice/PhpSpreadsheet/issues/2157) [PR #4187](https://github.com/PHPOffice/PhpSpreadsheet/pull/4187)
3636

3737
## 2024-09-29 - 3.3.0 (no 3.0.\*, 3.1.\*, 3.2.\*)
3838

src/PhpSpreadsheet/Reader/Xml.php

+12
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,18 @@ public function __construct()
4444
{
4545
parent::__construct();
4646
$this->securityScanner = XmlScanner::getInstance($this);
47+
/** @var callable */
48+
$unentity = [self::class, 'unentity'];
49+
$this->securityScanner->setAdditionalCallback($unentity);
50+
}
51+
52+
public static function unentity(string $contents): string
53+
{
54+
$contents = preg_replace('/&(amp|lt|gt|quot|apos);/', "\u{fffe}\u{feff}\$1;", trim($contents)) ?? $contents;
55+
$contents = html_entity_decode($contents, ENT_NOQUOTES | ENT_SUBSTITUTE | ENT_HTML401, 'UTF-8');
56+
$contents = str_replace("\u{fffe}\u{feff}", '&', $contents);
57+
58+
return $contents;
4759
}
4860

4961
private string $fileContents = '';
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace PhpOffice\PhpSpreadsheetTests\Reader\Xml;
6+
7+
use PhpOffice\PhpSpreadsheet\Reader\Xml as XmlReader;
8+
use PHPUnit\Framework\TestCase;
9+
10+
class HtmlEntitiesLoadTest extends TestCase
11+
{
12+
public static function testIssue2157(): void
13+
{
14+
$infile = 'tests/data/Reader/Xml/issue.2157.small.xml';
15+
$contents = (string) file_get_contents($infile);
16+
self::assertSame("\t", substr($contents, 0, 1));
17+
self::assertStringContainsString('&Tau;', $contents);
18+
self::assertStringContainsString('&lt;/br&gt', $contents);
19+
self::assertStringNotContainsString('Τ', $contents); // that's a Tau, not T
20+
self::assertStringNotContainsString('</br>', $contents);
21+
$reader = new XmlReader();
22+
$spreadsheet = $reader->load($infile);
23+
$sheet = $spreadsheet->getActiveSheet();
24+
self::assertSame('Τέλεια όραση χωρίς γυαλιά', $sheet->getCell('E2')->getValue());
25+
$g2 = $sheet->getCell('G2')->getValue();
26+
self::assertStringContainsString('</br>', $g2);
27+
$spreadsheet->disconnectWorksheets();
28+
}
29+
}
+109
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" xmlns:html="http://www.w3.org/TR/REC-html40">
3+
<Worksheet ss:Name="ProductsAPIData">
4+
<Table>
5+
<Row>
6+
<Cell><Data ss:Type="String">id</Data></Cell>
7+
<Cell><Data ss:Type="String">isbn</Data></Cell>
8+
<Cell><Data ss:Type="String">barcode</Data></Cell>
9+
<Cell><Data ss:Type="String">url</Data></Cell>
10+
<Cell><Data ss:Type="String">title</Data></Cell>
11+
<Cell><Data ss:Type="String">short_description</Data></Cell>
12+
<Cell><Data ss:Type="String">description</Data></Cell>
13+
<Cell><Data ss:Type="String">category</Data></Cell>
14+
<Cell><Data ss:Type="String">weight</Data></Cell>
15+
<Cell><Data ss:Type="String">pages</Data></Cell>
16+
<Cell><Data ss:Type="String">publication_date</Data></Cell>
17+
<Cell><Data ss:Type="String">3d_photo</Data></Cell>
18+
<Cell><Data ss:Type="String">photo</Data></Cell>
19+
<Cell><Data ss:Type="String">pdf_preview</Data></Cell>
20+
<Cell><Data ss:Type="String">flipping_book</Data></Cell>
21+
<Cell><Data ss:Type="String">offer</Data></Cell>
22+
<Cell><Data ss:Type="String">active</Data></Cell>
23+
<Cell><Data ss:Type="String">availability</Data></Cell>
24+
<Cell><Data ss:Type="String">size</Data></Cell>
25+
<Cell><Data ss:Type="String">country</Data></Cell>
26+
<Cell><Data ss:Type="String">subject</Data></Cell>
27+
<Cell><Data ss:Type="String">retail_price</Data></Cell>
28+
<Cell><Data ss:Type="String">wholesale_price</Data></Cell>
29+
<Cell><Data ss:Type="String">ebook-isbn</Data></Cell>
30+
<Cell><Data ss:Type="String">ebook-barcode</Data></Cell>
31+
<Cell><Data ss:Type="String">ebook-retail_price</Data></Cell>
32+
<Cell><Data ss:Type="String">ebook-wholesale_price</Data></Cell>
33+
<Cell><Data ss:Type="String">ebook-urn</Data></Cell>
34+
<Cell><Data ss:Type="String">ebook-drm</Data></Cell>
35+
<Cell><Data ss:Type="String">ebook-format</Data></Cell>
36+
<Cell><Data ss:Type="String">ebook-active</Data></Cell>
37+
<Cell><Data ss:Type="String">author1-name</Data></Cell>
38+
<Cell><Data ss:Type="String">author1-url</Data></Cell>
39+
<Cell><Data ss:Type="String">author1-photo</Data></Cell>
40+
<Cell><Data ss:Type="String">author1-description</Data></Cell>
41+
<Cell><Data ss:Type="String">author1-link</Data></Cell>
42+
<Cell><Data ss:Type="String">author2-name</Data></Cell>
43+
<Cell><Data ss:Type="String">author2-url</Data></Cell>
44+
<Cell><Data ss:Type="String">author2-photo</Data></Cell>
45+
<Cell><Data ss:Type="String">author2-description</Data></Cell>
46+
<Cell><Data ss:Type="String">author2-link</Data></Cell>
47+
<Cell><Data ss:Type="String">translator-name</Data></Cell>
48+
<Cell><Data ss:Type="String">translator-photo</Data></Cell>
49+
<Cell><Data ss:Type="String">translator-description</Data></Cell>
50+
<Cell><Data ss:Type="String">editor-name</Data></Cell>
51+
<Cell><Data ss:Type="String">editor-photo</Data></Cell>
52+
<Cell><Data ss:Type="String">editor-description</Data></Cell>
53+
</Row>
54+
<Row>
55+
<Cell><Data ss:Type="String">2</Data></Cell>
56+
<Cell><Data ss:Type="String">978-960-364-004-2</Data></Cell>
57+
<Cell><Data ss:Type="String">9789603640042</Data></Cell>
58+
<Cell><Data ss:Type="String">https://www.dioptra.gr/vivlio/ygeia-diatrofi/teleia-orasi-xoris-gualia/</Data></Cell>
59+
<Cell><Data ss:Type="String">&Tau;έ&lambda;&epsilon;&iota;&alpha; ό&rho;&alpha;&sigma;&eta; &chi;&omega;&rho;ί&sigmaf; &gamma;&upsilon;&alpha;&lambda;&iota;ά</Data></Cell>
60+
<Cell><Data ss:Type="String">&Mu;&epsilon; &tau;&eta; &mu;έ&theta;&omicron;&delta;&omicron; Bates &beta;&epsilon;&lambda;&tau;&iota;ώ&nu;&omicron;&upsilon;&mu;&epsilon; &tau;&eta;&nu; ό&rho;&alpha;&sigma;ή &mu;&alpha;&sigmaf; ή &pi;&rho;&omicron;&lambda;&alpha;&mu;&beta;ά&nu;&omicron;&upsilon;&mu;&epsilon; &tau;&alpha; &pi;&rho;&omicron;&beta;&lambda;ή&mu;&alpha;&tau;&alpha; &tau;&omicron;&upsilon; &pi;&iota;&omicron; &epsilon;&upsilon;&alpha;ί&sigma;&theta;&eta;&tau;&omicron;&upsilon; &omicron;&rho;&gamma;ά&nu;&omicron;&upsilon; &tau;&omicron;&upsilon; &sigma;ώ&mu;&alpha;&tau;&omicron;&sigmaf; &ndash; &tau;&omega;&nu; &mu;&alpha;&tau;&iota;ώ&nu;.</Data></Cell>
61+
<Cell><Data ss:Type="String">&Phi;&omicron;&rho;ώ&nu;&tau;&alpha;&sigmaf; &tau;&alpha; &gamma;&upsilon;&alpha;&lambda;&iota;ά &laquo;&kappa;&alpha;&tau;&alpha;&lambda;&alpha;&beta;&alpha;ί&nu;&epsilon;&iota;&sigmaf; &alpha;&mu;έ&sigma;&omega;&sigmaf; &tau;&eta; &delta;&iota;&alpha;&phi;&omicron;&rho;ά&raquo;. &Delta;&epsilon;&nu; &nu;&omicron;&iota;ά&zeta;&epsilon;&sigma;&alpha;&iota; &alpha;&nu; &theta;&alpha; &chi;&rho;&epsilon;&iota;&alpha;&sigma;&tau;&epsilon;ί&sigmaf; &alpha;&rho;&gamma;ό&tau;&epsilon;&rho;&alpha; &pi;&iota;&omicron; &delta;&upsilon;&nu;&alpha;&tau;&omicron;ύ&sigmaf; &phi;&alpha;&kappa;&omicron;ύ&sigmaf;, &gamma;&iota;&alpha;&tau;ί &nu;&omicron;&mu;ί&zeta;&epsilon;&iota;&sigmaf; ό&tau;&iota; &delta;&epsilon;&nu; &upsilon;&pi;ά&rho;&chi;&epsilon;&iota; &theta;&epsilon;&rho;&alpha;&pi;&epsilon;ί&alpha; &gamma;&iota;&alpha; &tau;&alpha; &tau;&alpha;&lambda;&alpha;&iota;&pi;&omega;&rho;&eta;&mu;έ&nu;&alpha; &mu;ά&tau;&iota;&alpha;.&lt;/br&gt;
62+
&Kappa;&iota; ό&mu;&omega;&sigmaf; &tau;&alpha; &pi;&rho;ά&gamma;&mu;&alpha;&tau;&alpha; &delta;&epsilon;&nu; &epsilon;ί&nu;&alpha;&iota; έ&tau;&sigma;&iota;.&lt;/br&gt;
63+
&Omicron;&iota; &pi;&epsilon;&rho;&iota;&sigma;&sigma;ό&tau;&epsilon;&rho;&omicron;&iota; &alpha;&pi;ό &alpha;&upsilon;&tau;&omicron;ύ&sigmaf; &pi;&omicron;&upsilon; &phi;&omicron;&rho;&omicron;ύ&nu; &gamma;&upsilon;&alpha;&lambda;&iota;ά &theta;&alpha; &mu;&pi;&omicron;&rho;&omicron;ύ&sigma;&alpha;&nu; &nu;&alpha; &tau;&alpha; &epsilon;ί&chi;&alpha;&nu; &alpha;&pi;&omicron;&phi;ύ&gamma;&epsilon;&iota;. &Alpha;&kappa;ό&mu;&alpha; &kappa;&alpha;&iota; &tau;ώ&rho;&alpha; &mu;&pi;&omicron;&rho;&omicron;ύ&nu; &nu;&alpha; &beta;&epsilon;&lambda;&tau;&iota;ώ&sigma;&omicron;&upsilon;&nu; &tau;&eta;&nu; ό&rho;&alpha;&sigma;ή &tau;&omicron;&upsilon;&sigmaf; &mu;&epsilon; &tau;&eta; &mu;έ&theta;&omicron;&delta;&omicron; Bates.&lt;/br&gt;
64+
&Eta; &mu;έ&theta;&omicron;&delta;&omicron;&sigmaf; Bates &epsilon;ί&nu;&alpha;&iota; &mu;&iota;&alpha; &sigma;&epsilon;&iota;&rho;ά &alpha;&sigma;&kappa;ή&sigma;&epsilon;&omega;&nu; &kappa;&alpha;&iota; &tau;&epsilon;&chi;&nu;&iota;&kappa;ώ&nu; &pi;&omicron;&upsilon; &chi;&alpha;&lambda;&alpha;&rho;ώ&nu;&omicron;&upsilon;&nu; &tau;&omicron;&upsilon;&sigmaf; &omicron;&phi;&theta;&alpha;&lambda;&mu;&omicron;&lambda;&omicron;&gamma;&iota;&kappa;&omicron;ύ&sigmaf; &mu;&upsilon;&sigmaf; &kappa;&alpha;&iota; &tau;&omicron;&upsilon;&sigmaf; &epsilon;&pi;&alpha;&nu;&epsilon;&kappa;&pi;&alpha;&iota;&delta;&epsilon;ύ&omicron;&upsilon;&nu; &nu;&alpha; &epsilon;&sigma;&tau;&iota;ά&zeta;&omicron;&upsilon;&nu; &alpha;&pi;&omicron;&tau;&epsilon;&lambda;&epsilon;&sigma;&mu;&alpha;&tau;&iota;&kappa;ά &tau;&iota;&sigmaf; &phi;&omega;&tau;&epsilon;&iota;&nu;έ&sigmaf; &alpha;&kappa;&tau;ί&nu;&epsilon;&sigmaf; &pi;&omicron;&upsilon; &epsilon;&iota;&sigma;έ&rho;&chi;&omicron;&nu;&tau;&alpha;&iota; &sigma;&tau;&omicron; &mu;ά&tau;&iota;, &epsilon;&pi;&iota;&tau;&rho;έ&pi;&omicron;&nu;&tau;ά&sigmaf; &mu;&alpha;&sigmaf; &nu;&alpha; &beta;&lambda;έ&pi;&omicron;&upsilon;&mu;&epsilon; &kappa;&alpha;&lambda;ά &kappa;&alpha;&iota; &kappa;&alpha;&theta;&alpha;&rho;ά &chi;&omega;&rho;ί&sigmaf; &gamma;&upsilon;&alpha;&lambda;&iota;ά.&lt;/br&gt;
65+
&Epsilon;&phi;&alpha;&rho;&mu;ό&sigma;&tau;&epsilon; &sigma;ή&mu;&epsilon;&rho;&alpha; &kappa;&iota;ό&lambda;&alpha;&sigmaf;, &tau;&eta; &mu;έ&theta;&omicron;&delta;&omicron; Bates &gamma;&iota;&alpha; &nu;&alpha; &beta;&epsilon;&lambda;&tau;&iota;ώ&sigma;&epsilon;&tau;&epsilon; &tau;&eta;&nu; ό&rho;&alpha;&sigma;ή &sigma;&alpha;&sigmaf; ή &nu;&alpha; &pi;&rho;&omicron;&lambda;ά&beta;&epsilon;&tau;&epsilon; &tau;&alpha; &pi;&rho;&omicron;&beta;&lambda;ή&mu;&alpha;&tau;&alpha; &tau;&omicron;&upsilon; &pi;&iota;&omicron; &epsilon;&upsilon;&alpha;ί&sigma;&theta;&eta;&tau;&omicron;&upsilon; &omicron;&rho;&gamma;ά&nu;&omicron;&upsilon; &tau;&omicron;&upsilon; &sigma;ώ&mu;&alpha;&tau;&omicron;&sigmaf; &ndash; &tau;&omega;&nu; &mu;&alpha;&tau;&iota;ώ&nu; &sigma;&alpha;&sigmaf;.&lt;/br&gt;</Data></Cell>
66+
<Cell><Data ss:Type="String">&Upsilon;&gamma;&epsilon;ί&alpha; - &Delta;&iota;&alpha;&tau;&rho;&omicron;&phi;ή</Data></Cell>
67+
<Cell><Data ss:Type="String">0.272</Data></Cell>
68+
<Cell><Data ss:Type="String">160</Data></Cell>
69+
<Cell><Data ss:Type="String">2002-06-03 00:00:00</Data></Cell>
70+
<Cell><Data ss:Type="String">https://www.dioptra.gr/Images/Products/004_list.jpg</Data></Cell>
71+
<Cell><Data ss:Type="String">https://www.dioptra.gr/Images/Products/004.jpg</Data></Cell>
72+
<Cell><Data ss:Type="String"></Data></Cell>
73+
<Cell><Data ss:Type="String"></Data></Cell>
74+
<Cell><Data ss:Type="String">0</Data></Cell>
75+
<Cell><Data ss:Type="String">1</Data></Cell>
76+
<Cell><Data ss:Type="String">1</Data></Cell>
77+
<Cell><Data ss:Type="String">140 x 205</Data></Cell>
78+
<Cell><Data ss:Type="String">&Epsilon;&lambda;&lambda;ά&delta;&alpha;</Data></Cell>
79+
<Cell><Data ss:Type="String">-</Data></Cell>
80+
<Cell><Data ss:Type="String">13.19</Data></Cell>
81+
<Cell><Data ss:Type="String">12.44</Data></Cell>
82+
<Cell><Data ss:Type="String">-</Data></Cell>
83+
<Cell><Data ss:Type="String">-</Data></Cell>
84+
<Cell><Data ss:Type="String">-</Data></Cell>
85+
<Cell><Data ss:Type="String">-</Data></Cell>
86+
<Cell><Data ss:Type="String">-</Data></Cell>
87+
<Cell><Data ss:Type="String">-</Data></Cell>
88+
<Cell><Data ss:Type="String">-</Data></Cell>
89+
<Cell><Data ss:Type="String">-</Data></Cell>
90+
<Cell><Data ss:Type="String">George Kypreotakis</Data></Cell>
91+
<Cell><Data ss:Type="String">https://www.dioptra.gr/suggrafeas/171/</Data></Cell>
92+
<Cell><Data ss:Type="String"></Data></Cell>
93+
<Cell><Data ss:Type="String"></Data></Cell>
94+
<Cell><Data ss:Type="String"></Data></Cell>
95+
<Cell><Data ss:Type="String">-</Data></Cell>
96+
<Cell><Data ss:Type="String">-</Data></Cell>
97+
<Cell><Data ss:Type="String">-</Data></Cell>
98+
<Cell><Data ss:Type="String">-</Data></Cell>
99+
<Cell><Data ss:Type="String">-</Data></Cell>
100+
<Cell><Data ss:Type="String">-</Data></Cell>
101+
<Cell><Data ss:Type="String">-</Data></Cell>
102+
<Cell><Data ss:Type="String">-</Data></Cell>
103+
<Cell><Data ss:Type="String">-</Data></Cell>
104+
<Cell><Data ss:Type="String">-</Data></Cell>
105+
<Cell><Data ss:Type="String">-</Data></Cell>
106+
</Row>
107+
</Table>
108+
</Worksheet>
109+
</Workbook>

0 commit comments

Comments
 (0)