diff --git a/src/PhpSpreadsheet/Reader/Ods.php b/src/PhpSpreadsheet/Reader/Ods.php index 908e8327..86b3ee38 100644 --- a/src/PhpSpreadsheet/Reader/Ods.php +++ b/src/PhpSpreadsheet/Reader/Ods.php @@ -47,7 +47,7 @@ class Ods extends BaseReader // Load file - if (File::testFileNoThrow($filename)) { + if (File::testFileNoThrow($filename, '')) { $zip = new ZipArchive(); if ($zip->open($filename) === true) { // check if it is an OOXML archive diff --git a/src/PhpSpreadsheet/Shared/File.php b/src/PhpSpreadsheet/Shared/File.php index 83103b49..293b15ca 100644 --- a/src/PhpSpreadsheet/Shared/File.php +++ b/src/PhpSpreadsheet/Shared/File.php @@ -61,7 +61,7 @@ class File if (self::validateZipFirst4($zipFile)) { $zip = new ZipArchive(); - $res = $zip->open($zipFile, ZipArchive::CHECKCONS); + $res = $zip->open($zipFile); if ($res === true) { $returnValue = ($zip->getFromName($archiveFile) !== false); $zip->close(); @@ -164,23 +164,22 @@ class File /** * Same as assertFile, except return true/false and don't throw Exception. */ - public static function testFileNoThrow(string $filename, string $zipMember = ''): bool + public static function testFileNoThrow(string $filename, ?string $zipMember = null): bool { if (!is_file($filename)) { return false; } - if (!is_readable($filename)) { return false; } - - if ($zipMember !== '') { - $zipfile = "zip://$filename#$zipMember"; - if (!self::fileExists($zipfile)) { - return false; - } + if ($zipMember === null) { + return true; + } + // validate zip, but don't check specific member + if ($zipMember === '') { + return self::validateZipFirst4($filename); } - return true; + return self::fileExists("zip://$filename#$zipMember"); } } diff --git a/tests/PhpSpreadsheetTests/Reader/Xlsx/Issue2362Test.php b/tests/PhpSpreadsheetTests/Reader/Xlsx/Issue2362Test.php new file mode 100644 index 00000000..7efb04ad --- /dev/null +++ b/tests/PhpSpreadsheetTests/Reader/Xlsx/Issue2362Test.php @@ -0,0 +1,43 @@ +open($filename, ZipArchive::CHECKCONS); + self::assertSame(ZipArchive::ER_INCONS, $res); + } + + public function testIssue2362(): void + { + $filename = 'tests/data/Reader/XLSX/issue.2362.xlsx'; + $reader = IOFactory::createReader('Xlsx'); + $spreadsheet = $reader->load($filename); + $sheet = $spreadsheet->getActiveSheet(); + + $value = $sheet->getCell('A1')->getValue(); + if ($value instanceof RichText) { + self::assertSame('Дата', (string) $value); + } else { + self::fail('A1 is not RichText'); + } + $value = $sheet->getCell('D21')->getValue(); + if ($value instanceof RichText) { + self::assertSame('391800, Рязанская область, г. Скопин, ул. Ленина, д. 40', (string) $value); + } else { + self::fail('D21 is not RichText'); + } + $spreadsheet->disconnectWorksheets(); + } +} diff --git a/tests/data/Reader/XLSX/issue.2362.xlsx b/tests/data/Reader/XLSX/issue.2362.xlsx new file mode 100644 index 00000000..a96fedad Binary files /dev/null and b/tests/data/Reader/XLSX/issue.2362.xlsx differ