diff --git a/src/PhpSpreadsheet/Reader/Xls.php b/src/PhpSpreadsheet/Reader/Xls.php index 816e7698d..760f8a519 100644 --- a/src/PhpSpreadsheet/Reader/Xls.php +++ b/src/PhpSpreadsheet/Reader/Xls.php @@ -213,7 +213,7 @@ class Xls extends BaseReader * * @var int */ - private $version; + private $version = 0; /** * Codepage set in the Excel file being read. Only important for BIFF5 (Excel 5.0 - Excel 95) @@ -221,7 +221,7 @@ class Xls extends BaseReader * * @var string */ - private $codepage; + private $codepage = ''; /** * Shared formats. @@ -459,6 +459,11 @@ class Xls extends BaseReader $this->codepage = $codepage; } + public function getCodepage(): string + { + return $this->codepage; + } + /** * Reads names of the worksheets from a file, without parsing the whole file to a PhpSpreadsheet object. * @@ -498,6 +503,10 @@ class Xls extends BaseReader $this->readDefault(); break 2; + case self::XLS_TYPE_CODEPAGE: + $this->readCodepage(); + + break; default: $this->readDefault(); @@ -557,6 +566,10 @@ class Xls extends BaseReader $this->readDefault(); break 2; + case self::XLS_TYPE_CODEPAGE: + $this->readCodepage(); + + break; default: $this->readDefault(); @@ -8088,4 +8101,9 @@ class Xls extends BaseReader $this->phpSheet->getStyle($cellRange)->setConditionalStyles($conditionalStyles); } } + + public function getVersion(): int + { + return $this->version; + } } diff --git a/tests/PhpSpreadsheetTests/Reader/Xls/InfoNamesTest.php b/tests/PhpSpreadsheetTests/Reader/Xls/InfoNamesTest.php new file mode 100644 index 000000000..a493d65be --- /dev/null +++ b/tests/PhpSpreadsheetTests/Reader/Xls/InfoNamesTest.php @@ -0,0 +1,142 @@ +listWorksheetNames($filename); + $expected = ['Invoice', 'Terms and conditions']; + self::assertSame($expected, $names); + } + + public function testWorksheetInfoBiff5(): void + { + $filename = 'samples/templates/30templatebiff5.xls'; + $reader = new Xls(); + $info = $reader->listWorksheetInfo($filename); + $expected = [ + [ + 'worksheetName' => 'Invoice', + 'lastColumnLetter' => 'E', + 'lastColumnIndex' => 4, + 'totalRows' => 19, + 'totalColumns' => 5, + ], + [ + 'worksheetName' => 'Terms and conditions', + 'lastColumnLetter' => 'B', + 'lastColumnIndex' => 1, + 'totalRows' => 3, + 'totalColumns' => 2, + ], + ]; + self::assertSame($expected, $info); + self::assertSame(Xls::XLS_BIFF7, $reader->getVersion()); + self::assertSame('CP1252', $reader->getCodepage()); + } + + public function testWorksheetNamesBiff8(): void + { + $filename = 'samples/templates/31docproperties.xls'; + $reader = new Xls(); + $names = $reader->listWorksheetNames($filename); + $expected = ['Worksheet']; + self::assertSame($expected, $names); + } + + public function testWorksheetInfoBiff8(): void + { + $filename = 'samples/templates/31docproperties.xls'; + $reader = new Xls(); + $info = $reader->listWorksheetInfo($filename); + $expected = [ + [ + 'worksheetName' => 'Worksheet', + 'lastColumnLetter' => 'B', + 'lastColumnIndex' => 1, + 'totalRows' => 1, + 'totalColumns' => 2, + ], + ]; + self::assertSame($expected, $info); + self::assertSame(Xls::XLS_BIFF8, $reader->getVersion()); + self::assertSame('UTF-16LE', $reader->getCodepage()); + } + + /** + * Test load Xls file with MACCENTRALEUROPE encoding, which is implemented + * as MAC-CENTRALEUROPE on some systems. Issue #549. + */ + private const MAC_CE = ['MACCENTRALEUROPE', 'MAC-CENTRALEUROPE']; + + private const MAC_FILE5 = 'tests/data/Reader/XLS/maccentraleurope.biff5.xls'; + private const MAC_FILE8 = 'tests/data/Reader/XLS/maccentraleurope.xls'; + + public function testWorksheetNamesBiff5Mac(): void + { + $codePages = CodePage::getEncodings(); + self::assertSame(self::MAC_CE, $codePages[10029]); + $reader = new Xls(); + $names = $reader->listWorksheetNames(self::MAC_FILE5); + $expected = ['Ärkusz1']; + self::assertSame($expected, $names); + } + + public function testWorksheetInfoBiff5Mac(): void + { + $codePages = CodePage::getEncodings(); + // prior test has replaced array with single string + self::assertContains($codePages[10029], self::MAC_CE); + $reader = new Xls(); + $info = $reader->listWorksheetInfo(self::MAC_FILE5); + $expected = [ + [ + 'worksheetName' => 'Ärkusz1', + 'lastColumnLetter' => 'P', + 'lastColumnIndex' => 15, + 'totalRows' => 3, + 'totalColumns' => 16, + ], + ]; + self::assertSame($expected, $info); + self::assertSame(Xls::XLS_BIFF7, $reader->getVersion()); + self::assertContains($reader->getCodepage(), self::MAC_CE); + } + + public function testLoadMacCentralEuropeBiff5(): void + { + $reader = new Xls(); + $spreadsheet = $reader->load(self::MAC_FILE5); + $sheet = $spreadsheet->getActiveSheet(); + self::assertSame('Ärkusz1', $sheet->getTitle()); + self::assertSame('Ładowność', $sheet->getCell('I1')->getValue()); + self::assertSame(Xls::XLS_BIFF7, $reader->getVersion()); + self::assertContains($reader->getCodepage(), self::MAC_CE); + $spreadsheet->disconnectWorksheets(); + } + + public function testLoadMacCentralEuropeBiff8(): void + { + // Document is UTF-16LE as a whole, + // but some strings are stored as MACCENTRALEUROPE + $reader = new Xls(); + $spreadsheet = $reader->load(self::MAC_FILE8); + $sheet = $spreadsheet->getActiveSheet(); + self::assertSame('Arkusz1', $sheet->getTitle()); + self::assertSame('Ładowność', $sheet->getCell('I1')->getValue()); + self::assertSame(Xls::XLS_BIFF8, $reader->getVersion()); + self::assertSame('UTF-16LE', $reader->getCodepage()); + $properties = $spreadsheet->getProperties(); + // the following is stored as MACCENTRALEUROPE, not UTF-16LE + self::assertSame('Użytkownik Microsoft Office', $properties->getLastModifiedBy()); + $spreadsheet->disconnectWorksheets(); + } +} diff --git a/tests/PhpSpreadsheetTests/Reader/Xls/XlsTest.php b/tests/PhpSpreadsheetTests/Reader/Xls/XlsTest.php index 2cd14a87c..03c3afd4c 100644 --- a/tests/PhpSpreadsheetTests/Reader/Xls/XlsTest.php +++ b/tests/PhpSpreadsheetTests/Reader/Xls/XlsTest.php @@ -4,7 +4,6 @@ namespace PhpOffice\PhpSpreadsheetTests\Reader\Xls; use PhpOffice\PhpSpreadsheet\Cell\Cell; use PhpOffice\PhpSpreadsheet\Reader\Xls; -use PhpOffice\PhpSpreadsheet\Shared\CodePage; use PhpOffice\PhpSpreadsheetTests\Functional\AbstractFunctional; class XlsTest extends AbstractFunctional @@ -88,40 +87,6 @@ class XlsTest extends AbstractFunctional $newspreadsheet->disconnectWorksheets(); } - /** - * Test load Xls file with MACCENTRALEUROPE encoding, which is implemented - * as MAC-CENTRALEUROPE on some systems. Issue #549. - */ - public function testLoadMacCentralEurope(): void - { - $codePages = CodePage::getEncodings(); - self::assertIsArray($codePages[10029]); - $filename = 'tests/data/Reader/XLS/maccentraleurope.xls'; - $reader = new Xls(); - // When no fix applied, spreadsheet fails to load on some systems - $spreadsheet = $reader->load($filename); - $sheet = $spreadsheet->getActiveSheet(); - self::assertSame('Ładowność', $sheet->getCell('I1')->getValue()); - $spreadsheet->disconnectWorksheets(); - } - - /** - * First test changes array entry in CodePage. - * This test confirms new that new entry is okay. - */ - public function testLoadMacCentralEurope2(): void - { - $codePages = CodePage::getEncodings(); - self::assertIsString($codePages[10029]); - $filename = 'tests/data/Reader/XLS/maccentraleurope.xls'; - $reader = new Xls(); - // When no fix applied, spreadsheet fails to load on some systems - $spreadsheet = $reader->load($filename); - $sheet = $spreadsheet->getActiveSheet(); - self::assertSame('Ładowność', $sheet->getCell('I1')->getValue()); - $spreadsheet->disconnectWorksheets(); - } - public function testLoadXlsBug1114(): void { $filename = 'tests/data/Reader/XLS/bug1114.xls'; diff --git a/tests/data/Reader/XLS/maccentraleurope.biff5.xls b/tests/data/Reader/XLS/maccentraleurope.biff5.xls new file mode 100644 index 000000000..6ab0157fe Binary files /dev/null and b/tests/data/Reader/XLS/maccentraleurope.biff5.xls differ