diff --git a/src/PhpSpreadsheet/Cell/Cell.php b/src/PhpSpreadsheet/Cell/Cell.php index c0e864168..6a532892b 100644 --- a/src/PhpSpreadsheet/Cell/Cell.php +++ b/src/PhpSpreadsheet/Cell/Cell.php @@ -450,12 +450,9 @@ class Cell */ public function setDataType($dataType): self { - if ($dataType == DataType::TYPE_STRING2) { - $dataType = DataType::TYPE_STRING; - } - $this->dataType = $dataType; + $this->setValueExplicit($this->value, $dataType); - return $this->updateInCollection(); + return $this; } /** diff --git a/src/PhpSpreadsheet/Reader/BaseReader.php b/src/PhpSpreadsheet/Reader/BaseReader.php index 0779641ec..1b096f025 100644 --- a/src/PhpSpreadsheet/Reader/BaseReader.php +++ b/src/PhpSpreadsheet/Reader/BaseReader.php @@ -39,6 +39,7 @@ abstract class BaseReader implements IReader /** * Restrict which sheets should be loaded? * This property holds an array of worksheet names to be loaded. If null, then all worksheets will be loaded. + * This property is ignored for Csv, Html, and Slk. * * @var null|string[] */ @@ -200,4 +201,39 @@ abstract class BaseReader implements IReader $this->fileHandle = $fileHandle; } + + /** + * Return worksheet info (Name, Last Column Letter, Last Column Index, Total Rows, Total Columns). + * + * @param string $filename + * + * @return array + */ + public function listWorksheetInfo($filename) + { + throw new PhpSpreadsheetException('Reader classes must implement their own listWorksheetInfo() method'); + } + + /** + * Returns names of the worksheets from a file, + * possibly without parsing the whole file to a Spreadsheet object. + * Readers will often have a more efficient method with which + * they can override this method. + * + * @param string $filename + * + * @return array + */ + public function listWorksheetNames($filename) + { + $returnArray = []; + $info = $this->listWorksheetInfo($filename); + foreach ($info as $infoArray) { + if (isset($infoArray['worksheetName'])) { + $returnArray[] = $infoArray['worksheetName']; + } + } + + return $returnArray; + } } diff --git a/src/PhpSpreadsheet/Reader/Csv.php b/src/PhpSpreadsheet/Reader/Csv.php index 02134abfd..2b96a38af 100644 --- a/src/PhpSpreadsheet/Reader/Csv.php +++ b/src/PhpSpreadsheet/Reader/Csv.php @@ -10,6 +10,7 @@ use PhpOffice\PhpSpreadsheet\Reader\Exception as ReaderException; use PhpOffice\PhpSpreadsheet\Shared\StringHelper; use PhpOffice\PhpSpreadsheet\Spreadsheet; use PhpOffice\PhpSpreadsheet\Style\NumberFormat; +use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet; class Csv extends BaseReader { @@ -98,6 +99,9 @@ class Csv extends BaseReader /** @var bool */ private $preserveNullString = false; + /** @var bool */ + private $sheetNameIsFileName = false; + /** * Create a new CSV Reader instance. */ @@ -212,8 +216,12 @@ class Csv extends BaseReader /** * Return worksheet info (Name, Last Column Letter, Last Column Index, Total Rows, Total Columns). + * + * @param string $filename + * + * @return array */ - public function listWorksheetInfo(string $filename): array + public function listWorksheetInfo($filename) { // Open file $this->openFileOrMemory($filename); @@ -373,6 +381,9 @@ class Csv extends BaseReader $spreadsheet->createSheet(); } $sheet = $spreadsheet->setActiveSheetIndex($this->sheetIndex); + if ($this->sheetNameIsFileName) { + $sheet->setTitle(substr(basename($filename, '.csv'), 0, Worksheet::SHEET_TITLE_MAXIMUM_LENGTH)); + } // Set our starting row based on whether we're in contiguous mode or not $currentRow = 1; @@ -635,4 +646,11 @@ class Csv extends BaseReader { return $this->preserveNullString; } + + public function setSheetNameIsFileName(bool $sheetNameIsFileName): self + { + $this->sheetNameIsFileName = $sheetNameIsFileName; + + return $this; + } } diff --git a/src/PhpSpreadsheet/Reader/Html.php b/src/PhpSpreadsheet/Reader/Html.php index f4d91470a..386675d75 100644 --- a/src/PhpSpreadsheet/Reader/Html.php +++ b/src/PhpSpreadsheet/Reader/Html.php @@ -1164,4 +1164,29 @@ class Html extends BaseReader ], ]); } + + /** + * Return worksheet info (Name, Last Column Letter, Last Column Index, Total Rows, Total Columns). + * + * @param string $filename + * + * @return array + */ + public function listWorksheetInfo($filename) + { + $info = []; + $spreadsheet = new Spreadsheet(); + $this->loadIntoExisting($filename, $spreadsheet); + foreach ($spreadsheet->getAllSheets() as $sheet) { + $newEntry = ['worksheetName' => $sheet->getTitle()]; + $newEntry['lastColumnLetter'] = $sheet->getHighestDataColumn(); + $newEntry['lastColumnIndex'] = Coordinate::columnIndexFromString($sheet->getHighestDataColumn()) - 1; + $newEntry['totalRows'] = $sheet->getHighestDataRow(); + $newEntry['totalColumns'] = $newEntry['lastColumnIndex'] + 1; + $info[] = $newEntry; + } + $spreadsheet->disconnectWorksheets(); + + return $info; + } } diff --git a/src/PhpSpreadsheet/Reader/Ods.php b/src/PhpSpreadsheet/Reader/Ods.php index 095666ecd..719dd67ac 100644 --- a/src/PhpSpreadsheet/Reader/Ods.php +++ b/src/PhpSpreadsheet/Reader/Ods.php @@ -234,6 +234,7 @@ class Ods extends BaseReader { // Create new Spreadsheet $spreadsheet = new Spreadsheet(); + $spreadsheet->removeSheetByIndex(0); // Load into this instance return $this->loadIntoExisting($filename, $spreadsheet); @@ -335,9 +336,7 @@ class Ods extends BaseReader $worksheetStyleName = $worksheetDataSet->getAttributeNS($tableNs, 'style-name'); // Create sheet - if ($worksheetID > 0) { - $spreadsheet->createSheet(); // First sheet is added by default - } + $spreadsheet->createSheet(); $spreadsheet->setActiveSheetIndex($worksheetID); if ($worksheetName || is_numeric($worksheetName)) { diff --git a/src/PhpSpreadsheet/Reader/Slk.php b/src/PhpSpreadsheet/Reader/Slk.php index be862008d..7170a2a91 100644 --- a/src/PhpSpreadsheet/Reader/Slk.php +++ b/src/PhpSpreadsheet/Reader/Slk.php @@ -165,7 +165,7 @@ class Slk extends BaseReader break; case 'Y': - $rowIndex = substr($rowDatum, 1); + $rowIndex = (int) substr($rowDatum, 1); break; } diff --git a/src/PhpSpreadsheet/Reader/Xls.php b/src/PhpSpreadsheet/Reader/Xls.php index 4eb96b4c2..a1ab019ac 100644 --- a/src/PhpSpreadsheet/Reader/Xls.php +++ b/src/PhpSpreadsheet/Reader/Xls.php @@ -416,6 +416,9 @@ class Xls extends BaseReader */ private $baseCell; + /** @var bool */ + private $activeSheetSet = false; + /** * Create a new Xls Reader instance. */ @@ -820,6 +823,7 @@ class Xls extends BaseReader } // Parse the individual sheets + $this->activeSheetSet = false; foreach ($this->sheets as $sheet) { if ($sheet['sheetType'] != 0x00) { // 0x00: Worksheet, 0x02: Chart, 0x06: Visual Basic module @@ -1231,6 +1235,9 @@ class Xls extends BaseReader } } } + if ($this->activeSheetSet === false) { + $this->spreadsheet->setActiveSheetIndex(0); + } // add the named ranges (defined names) foreach ($this->definedname as $definedName) { @@ -4389,6 +4396,7 @@ class Xls extends BaseReader $isActive = (bool) ((0x0400 & $options) >> 10); if ($isActive) { $this->spreadsheet->setActiveSheetIndex($this->spreadsheet->getIndex($this->phpSheet)); + $this->activeSheetSet = true; } // bit: 11; mask: 0x0800; 0 = normal view, 1 = page break view diff --git a/src/PhpSpreadsheet/Reader/Xlsx/WorkbookView.php b/src/PhpSpreadsheet/Reader/Xlsx/WorkbookView.php index 1b5fda1e5..3f7a4f857 100644 --- a/src/PhpSpreadsheet/Reader/Xlsx/WorkbookView.php +++ b/src/PhpSpreadsheet/Reader/Xlsx/WorkbookView.php @@ -19,9 +19,6 @@ class WorkbookView */ public function viewSettings(SimpleXMLElement $xmlWorkbook, $mainNS, array $mapSheetId, bool $readDataOnly): void { - if ($this->spreadsheet->getSheetCount() == 0) { - $this->spreadsheet->createSheet(); - } // Default active sheet index to the first loaded worksheet from the file $this->spreadsheet->setActiveSheetIndex(0); diff --git a/tests/PhpSpreadsheetTests/Cell/DataType2Test.php b/tests/PhpSpreadsheetTests/Cell/DataType2Test.php new file mode 100644 index 000000000..29c614735 --- /dev/null +++ b/tests/PhpSpreadsheetTests/Cell/DataType2Test.php @@ -0,0 +1,44 @@ +getActiveSheet(); + $sheet->getCell('A1')->setValue(28.1); + self::assertSame(28.1, $sheet->getCell('A1')->getValue()); + self::assertSame('28.1', (string) $sheet->getCell('A1')); + $sheet->getCell('A1')->setDataType(DataType::TYPE_STRING); + self::assertSame('28.1', $sheet->getCell('A1')->getValue()); + $sheet->getCell('A1')->setDataType(DataType::TYPE_NUMERIC); + self::assertSame(28.1, $sheet->getCell('A1')->getValue()); + $sheet->getCell('A1')->setDataType(DataType::TYPE_STRING2); + self::assertSame('28.1', $sheet->getCell('A1')->getValue()); + $sheet->getCell('A1')->setDataType(DataType::TYPE_INLINE); + self::assertSame('28.1', $sheet->getCell('A1')->getValue()); + $sheet->getCell('A1')->setDataType(DataType::TYPE_BOOL); + self::assertTrue($sheet->getCell('A1')->getValue()); + $sheet->getCell('A1')->setDataType(DataType::TYPE_NUMERIC); + self::assertSame(1, $sheet->getCell('A1')->getValue()); + + $sheet->getCell('A2')->setValue('X'); + + try { + $sheet->getCell('A2')->setDataType(DataType::TYPE_NUMERIC); + } catch (PhpSpreadsheetException $e) { + self::assertSame('Invalid numeric value for datatype Numeric', $e->getMessage()); + } + + $spreadsheet->disconnectWorksheets(); + } +} diff --git a/tests/PhpSpreadsheetTests/Reader/BaseNoLoad.php b/tests/PhpSpreadsheetTests/Reader/BaseNoLoad.php index 9655dc596..1673f2c95 100644 --- a/tests/PhpSpreadsheetTests/Reader/BaseNoLoad.php +++ b/tests/PhpSpreadsheetTests/Reader/BaseNoLoad.php @@ -12,9 +12,4 @@ class BaseNoLoad extends BaseReader { return $filename !== ''; } - - public function loadxxx(string $filename): void - { - $this->loadSpreadsheetFromFile($filename); - } } diff --git a/tests/PhpSpreadsheetTests/Reader/BaseNoLoadTest.php b/tests/PhpSpreadsheetTests/Reader/BaseNoLoadTest.php index 473aa6d66..6943e8cd1 100644 --- a/tests/PhpSpreadsheetTests/Reader/BaseNoLoadTest.php +++ b/tests/PhpSpreadsheetTests/Reader/BaseNoLoadTest.php @@ -14,6 +14,14 @@ class BaseNoLoadTest extends TestCase $this->expectException(SpreadsheetException::class); $this->expectExceptionMessage('Reader classes must implement their own loadSpreadsheetFromFile() method'); $reader = new BaseNoLoad(); - $reader->loadxxx('unknown.file'); + $reader->load('unknown.file'); + } + + public function testBaseNoLoadInfo(): void + { + $this->expectException(SpreadsheetException::class); + $this->expectExceptionMessage('Reader classes must implement their own listWorksheetInfo() method'); + $reader = new BaseNoLoad(); + $reader->listWorksheetInfo('unknown.file'); } } diff --git a/tests/PhpSpreadsheetTests/Reader/Csv/CsvCallbackTest.php b/tests/PhpSpreadsheetTests/Reader/Csv/CsvCallbackTest.php index 6c28cb71e..753ddfec3 100644 --- a/tests/PhpSpreadsheetTests/Reader/Csv/CsvCallbackTest.php +++ b/tests/PhpSpreadsheetTests/Reader/Csv/CsvCallbackTest.php @@ -29,12 +29,14 @@ class CsvCallbackTest extends TestCase $spreadsheet = $reader->load($filename); $sheet = $spreadsheet->getActiveSheet(); self::assertEquals('Å', $sheet->getCell('A1')->getValue()); + $spreadsheet->disconnectWorksheets(); } public function callbackSetFallbackEncoding(Csv $reader): void { $reader->setFallbackEncoding('ISO-8859-2'); $reader->setInputEncoding(Csv::GUESS_ENCODING); + $reader->setSheetNameIsFileName(true); $reader->setEscapeCharacter(''); } @@ -47,6 +49,7 @@ class CsvCallbackTest extends TestCase $sheet = $spreadsheet->getActiveSheet(); self::assertEquals('premičre', $sheet->getCell('A1')->getValue()); self::assertEquals('sixičme', $sheet->getCell('C2')->getValue()); + $spreadsheet->disconnectWorksheets(); } public function testIOFactory(): void @@ -57,6 +60,7 @@ class CsvCallbackTest extends TestCase $sheet = $spreadsheet->getActiveSheet(); self::assertEquals('premičre', $sheet->getCell('A1')->getValue()); self::assertEquals('sixičme', $sheet->getCell('C2')->getValue()); + $spreadsheet->disconnectWorksheets(); } public function testNonFallbackEncoding(): void @@ -68,6 +72,7 @@ class CsvCallbackTest extends TestCase $sheet = $spreadsheet->getActiveSheet(); self::assertEquals('première', $sheet->getCell('A1')->getValue()); self::assertEquals('sixième', $sheet->getCell('C2')->getValue()); + $spreadsheet->disconnectWorksheets(); } public function testDefaultEscape(): void @@ -78,6 +83,7 @@ class CsvCallbackTest extends TestCase $sheet = $spreadsheet->getActiveSheet(); // this is not how Excel views the file self::assertEquals('a\"hello', $sheet->getCell('A1')->getValue()); + $spreadsheet->disconnectWorksheets(); } public function testBetterEscape(): void @@ -88,5 +94,7 @@ class CsvCallbackTest extends TestCase $sheet = $spreadsheet->getActiveSheet(); // this is how Excel views the file self::assertEquals('a\"hello;hello;hello;\"', $sheet->getCell('A1')->getValue()); + self::assertSame('escape', $sheet->getTitle(), 'callback set sheet title to use file name rather than default'); + $spreadsheet->disconnectWorksheets(); } } diff --git a/tests/PhpSpreadsheetTests/Reader/Csv/CsvEncodingTest.php b/tests/PhpSpreadsheetTests/Reader/Csv/CsvEncodingTest.php index 2aeffa354..7ce3c5f4f 100644 --- a/tests/PhpSpreadsheetTests/Reader/Csv/CsvEncodingTest.php +++ b/tests/PhpSpreadsheetTests/Reader/Csv/CsvEncodingTest.php @@ -29,11 +29,13 @@ class CsvEncodingTest extends TestCase $reader = new Csv(); $reader->setInputEncoding($encoding); $info = $reader->listWorksheetInfo($filename); - self::assertEquals('Worksheet', $info[0]['worksheetName']); - self::assertEquals('B', $info[0]['lastColumnLetter']); - self::assertEquals(1, $info[0]['lastColumnIndex']); - self::assertEquals(2, $info[0]['totalRows']); - self::assertEquals(2, $info[0]['totalColumns']); + self::assertCount(1, $info); + self::assertSame('Worksheet', $info[0]['worksheetName']); + self::assertSame('B', $info[0]['lastColumnLetter']); + self::assertSame(1, $info[0]['lastColumnIndex']); + self::assertSame(2, $info[0]['totalRows']); + self::assertSame(2, $info[0]['totalColumns']); + self::assertSame(['Worksheet'], $reader->listWorksheetNames($filename)); } public static function providerEncodings(): array @@ -74,6 +76,9 @@ class CsvEncodingTest extends TestCase $filename = 'tests/data/Reader/CSV/premiere.utf16le.csv'; $reader = new Csv(); $reader->setInputEncoding(Csv::guessEncoding($filename)); + $names = $reader->listWorksheetNames($filename); + // Following ignored, just make sure it's executable. + $reader->setLoadSheetsOnly([$names[0]]); $spreadsheet = $reader->load($filename); $sheet = $spreadsheet->getActiveSheet(); self::assertEquals('𐐀', $sheet->getCell('A3')->getValue()); diff --git a/tests/PhpSpreadsheetTests/Reader/Gnumeric/GnumericLoadTest.php b/tests/PhpSpreadsheetTests/Reader/Gnumeric/GnumericLoadTest.php index e5e3a57e3..1d8d0060d 100644 --- a/tests/PhpSpreadsheetTests/Reader/Gnumeric/GnumericLoadTest.php +++ b/tests/PhpSpreadsheetTests/Reader/Gnumeric/GnumericLoadTest.php @@ -5,6 +5,7 @@ declare(strict_types=1); namespace PhpOffice\PhpSpreadsheetTests\Reader\Gnumeric; use DateTimeZone; +use PhpOffice\PhpSpreadsheet\Exception as PhpSpreadsheetException; use PhpOffice\PhpSpreadsheet\Reader\Exception as ReaderException; use PhpOffice\PhpSpreadsheet\Reader\Gnumeric; use PhpOffice\PhpSpreadsheet\Shared\Date; @@ -172,6 +173,16 @@ class GnumericLoadTest extends TestCase $spreadsheet->disconnectWorksheets(); } + public function testLoadNoSelectedSheets(): void + { + $this->expectException(PhpSpreadsheetException::class); + $this->expectExceptionMessage('You tried to set a sheet active by the out of bounds index'); + $filename = 'samples/templates/GnumericTest.gnumeric'; + $reader = new Gnumeric(); + $reader->setLoadSheetsOnly(['Unknown Sheet', 'xReport Data']); + $reader->load($filename); + } + public function testLoadNotGnumeric(): void { $this->expectException(ReaderException::class); diff --git a/tests/PhpSpreadsheetTests/Reader/Html/Issue2942Test.php b/tests/PhpSpreadsheetTests/Reader/Html/Issue2942Test.php index 4b253c7ac..5fbb6248b 100644 --- a/tests/PhpSpreadsheetTests/Reader/Html/Issue2942Test.php +++ b/tests/PhpSpreadsheetTests/Reader/Html/Issue2942Test.php @@ -16,6 +16,7 @@ class Issue2942Test extends TestCase $spreadsheet = $reader->loadFromString($content); $sheet = $spreadsheet->getActiveSheet(); self::assertSame('éàâèî', $sheet->getCell('A1')->getValue()); + $spreadsheet->disconnectWorksheets(); } public function testLoadFromFile(): void @@ -34,5 +35,30 @@ class Issue2942Test extends TestCase self::assertSame('അആ', $sheet->getCell('B3')->getValue()); self::assertSame('กขฃ', $sheet->getCell('C3')->getValue()); self::assertSame('✀✐✠', $sheet->getCell('D3')->getValue()); + $spreadsheet->disconnectWorksheets(); + } + + public function testInfo(): void + { + $file = 'tests/data/Reader/HTML/utf8chars.charset.html'; + $reader = new Html(); + $info = $reader->listWorksheetInfo($file); + self::assertCount(1, $info); + $info0 = $info[0]; + self::assertSame('Test Utf-8 characters voilà', $info0['worksheetName']); + self::assertSame('D', $info0['lastColumnLetter']); + self::assertSame(3, $info0['lastColumnIndex']); + self::assertSame(7, $info0['totalRows']); + self::assertSame(4, $info0['totalColumns']); + $names = $reader->listWorksheetNames($file); + self::assertCount(1, $names); + self::assertSame('Test Utf-8 characters voilà', $names[0]); + + // Following ignored, just make sure it's executable. + $reader->setLoadSheetsOnly([$names[0]]); + $spreadsheet = $reader->load($file); + $sheet = $spreadsheet->getActiveSheet(); + self::assertSame('✀✐✠', $sheet->getCell('D3')->getValue()); + $spreadsheet->disconnectWorksheets(); } } diff --git a/tests/PhpSpreadsheetTests/Reader/Ods/OdsTest.php b/tests/PhpSpreadsheetTests/Reader/Ods/OdsTest.php index c26f99d50..fd17ae037 100644 --- a/tests/PhpSpreadsheetTests/Reader/Ods/OdsTest.php +++ b/tests/PhpSpreadsheetTests/Reader/Ods/OdsTest.php @@ -5,6 +5,7 @@ declare(strict_types=1); namespace PhpOffice\PhpSpreadsheetTests\Reader\Ods; use PhpOffice\PhpSpreadsheet\Cell\DataType; +use PhpOffice\PhpSpreadsheet\Exception as PhpSpreadsheetException; use PhpOffice\PhpSpreadsheet\Reader\Exception as ReaderException; use PhpOffice\PhpSpreadsheet\Reader\Ods; use PhpOffice\PhpSpreadsheet\Spreadsheet; @@ -71,7 +72,9 @@ class OdsTest extends TestCase public function testLoadOneWorksheet(): void { $reader = new Ods(); - $reader->setLoadSheetsOnly(['Sheet1']); + //$reader->setLoadSheetsOnly(['Sheet1']); + $names = $reader->listWorksheetNames(self::ODS_DATA_FILE); + $reader->setLoadSheetsOnly([$names[0]]); $spreadsheet = $reader->load(self::ODS_DATA_FILE); self::assertEquals(1, $spreadsheet->getSheetCount()); @@ -92,6 +95,15 @@ class OdsTest extends TestCase $spreadsheet->disconnectWorksheets(); } + public function testLoadNoSelectedWorksheet(): void + { + $this->expectException(PhpSpreadsheetException::class); + $this->expectExceptionMessage('You tried to set a sheet active by the out of bounds index'); + $reader = new Ods(); + $reader->setLoadSheetsOnly(['xSecond Sheet']); + $reader->load(self::ODS_DATA_FILE); + } + public function testLoadBadFile(): void { $this->expectException(ReaderException::class); diff --git a/tests/PhpSpreadsheetTests/Reader/Slk/SlkTest.php b/tests/PhpSpreadsheetTests/Reader/Slk/SlkTest.php index c6820a873..ac8b381df 100644 --- a/tests/PhpSpreadsheetTests/Reader/Slk/SlkTest.php +++ b/tests/PhpSpreadsheetTests/Reader/Slk/SlkTest.php @@ -35,12 +35,14 @@ class SlkTest extends \PHPUnit\Framework\TestCase { $reader = new Slk(); $workSheetInfo = $reader->listWorkSheetInfo(self::$testbook); + self::assertCount(1, $workSheetInfo); $info0 = $workSheetInfo[0]; - self::assertEquals('SylkTest', $info0['worksheetName']); - self::assertEquals('J', $info0['lastColumnLetter']); - self::assertEquals(9, $info0['lastColumnIndex']); - self::assertEquals(18, $info0['totalRows']); - self::assertEquals(10, $info0['totalColumns']); + self::assertSame('SylkTest', $info0['worksheetName']); + self::assertSame('J', $info0['lastColumnLetter']); + self::assertSame(9, $info0['lastColumnIndex']); + self::assertSame(18, $info0['totalRows']); + self::assertSame(10, $info0['totalColumns']); + self::assertSame(['SylkTest'], $reader->listWorksheetNames(self::$testbook)); } public function testBadFileName(): void @@ -160,6 +162,9 @@ class SlkTest extends \PHPUnit\Framework\TestCase . '/123456789a123456789b123456789c12345.slk'; file_put_contents($this->filename, $contents); $reader = new Slk(); + $names = $reader->listWorksheetNames($this->filename); + // Following ignored, just make sure it's executable. + $reader->setLoadSheetsOnly([$names[0]]); $spreadsheet = $reader->load($this->filename); $sheet = $spreadsheet->getActiveSheet(); self::assertEquals('123456789a123456789b123456789c1', $sheet->getTitle()); diff --git a/tests/PhpSpreadsheetTests/Reader/Xls/LoadSheetsOnlyTest.php b/tests/PhpSpreadsheetTests/Reader/Xls/LoadSheetsOnlyTest.php new file mode 100644 index 000000000..e723dbda2 --- /dev/null +++ b/tests/PhpSpreadsheetTests/Reader/Xls/LoadSheetsOnlyTest.php @@ -0,0 +1,61 @@ +spreadsheet !== null) { + $this->spreadsheet->disconnectWorksheets(); + $this->spreadsheet = null; + } + } + + public function testLoadSheet1Only(): void + { + $filename = self::$testbook; + $reader = new Xls(); + //$reader->setLoadSheetsOnly(['Sheet1']); + $names = $reader->listWorksheetNames($filename); + $reader->setLoadSheetsOnly([$names[0]]); + $this->spreadsheet = $reader->load($filename); + self::assertSame(1, $this->spreadsheet->getSheetCount()); + self::assertSame('Sheet1', $this->spreadsheet->getActiveSheet()->getTitle()); + } + + public function testLoadSheet2Only(): void + { + $filename = self::$testbook; + $reader = new Xls(); + $reader->setLoadSheetsOnly(['Sheet2']); + $this->spreadsheet = $reader->load($filename); + self::assertSame(1, $this->spreadsheet->getSheetCount()); + self::assertSame('Sheet2', $this->spreadsheet->getActiveSheet()->getTitle()); + } + + public function testLoadNoSheet(): void + { + $this->expectException(PhpSpreadsheetException::class); + $this->expectExceptionMessage('You tried to set a sheet active by the out of bounds index'); + $filename = self::$testbook; + $reader = new Xls(); + $reader->setLoadSheetsOnly(['Sheet3']); + $reader->load($filename); + } +} diff --git a/tests/PhpSpreadsheetTests/Reader/Xlsx/LoadSheetsOnlyTest.php b/tests/PhpSpreadsheetTests/Reader/Xlsx/LoadSheetsOnlyTest.php new file mode 100644 index 000000000..3513fd981 --- /dev/null +++ b/tests/PhpSpreadsheetTests/Reader/Xlsx/LoadSheetsOnlyTest.php @@ -0,0 +1,74 @@ +spreadsheet !== null) { + $this->spreadsheet->disconnectWorksheets(); + $this->spreadsheet = null; + } + } + + public function testLoadSheet1Only(): void + { + $filename = self::$testbook; + $reader = new Xlsx(); + //$reader->setLoadSheetsOnly(['Sheet1']); + $names = $reader->listWorksheetNames($filename); + $reader->setLoadSheetsOnly([$names[0]]); + $this->spreadsheet = $reader->load($filename); + self::assertSame(1, $this->spreadsheet->getSheetCount()); + self::assertSame('Sheet1', $this->spreadsheet->getActiveSheet()->getTitle()); + } + + public function testLoadSheet2Only(): void + { + $filename = self::$testbook; + $reader = new Xlsx(); + $reader->setLoadSheetsOnly(['Sheet2']); + $this->spreadsheet = $reader->load($filename); + self::assertSame(1, $this->spreadsheet->getSheetCount()); + self::assertSame('Sheet2', $this->spreadsheet->getActiveSheet()->getTitle()); + } + + public function testLoadNoSheet(): void + { + $this->expectException(PhpSpreadsheetException::class); + $this->expectExceptionMessage('You tried to set a sheet active by the out of bounds index'); + $filename = self::$testbook; + $reader = new Xlsx(); + $reader->setLoadSheetsOnly(['Sheet3']); + $reader->load($filename); + } + + public function testLoadMultipleSheets(): void + { + $filename = 'tests/data/Reader/XLSX/threesheets.xlsx'; + $reader = new Xlsx(); + $reader->setLoadSheetsOnly(['Sheet3', 'Sheet1']); + $spreadsheet = $this->spreadsheet = $reader->load($filename); + self::assertSame(2, $spreadsheet->getSheetCount()); + $sheet = $spreadsheet->getSheetByNameOrThrow('Sheet1'); + self::assertSame('First', $sheet->getCell('A1')->getValue()); + $sheet = $spreadsheet->getSheetByNameOrThrow('Sheet3'); + self::assertSame('Third', $sheet->getCell('A1')->getValue()); + } +} diff --git a/tests/PhpSpreadsheetTests/Reader/Xml/XmlLoadTest.php b/tests/PhpSpreadsheetTests/Reader/Xml/XmlLoadTest.php index 821533aae..befac3b9e 100644 --- a/tests/PhpSpreadsheetTests/Reader/Xml/XmlLoadTest.php +++ b/tests/PhpSpreadsheetTests/Reader/Xml/XmlLoadTest.php @@ -5,6 +5,7 @@ declare(strict_types=1); namespace PhpOffice\PhpSpreadsheetTests\Reader\Xml; use DateTimeZone; +use PhpOffice\PhpSpreadsheet\Exception as PhpSpreadsheetException; use PhpOffice\PhpSpreadsheet\Reader\Xml; use PhpOffice\PhpSpreadsheet\Settings; use PhpOffice\PhpSpreadsheet\Shared\Date; @@ -128,6 +129,18 @@ class XmlLoadTest extends TestCase self::assertEquals('Third Heading', $sheet->getCell('C2')->getValue()); } + public function testLoadNoSelectedSheets(): void + { + $this->expectException(PhpSpreadsheetException::class); + $this->expectExceptionMessage('You tried to set a sheet active by the out of bounds index'); + $filename = __DIR__ + . '/../../../..' + . '/samples/templates/excel2003.xml'; + $reader = new Xml(); + $reader->setLoadSheetsOnly(['Unknown Sheet', 'xReport Data']); + $this->spreadsheet = $reader->load($filename); + } + public function testLoadUnusableSample(): void { // Sample spreadsheet is not readable by Excel. diff --git a/tests/PhpSpreadsheetTests/Writer/Xlsx/Issue3711Test.php b/tests/PhpSpreadsheetTests/Writer/Xlsx/Issue3711Test.php new file mode 100644 index 000000000..b454a4724 --- /dev/null +++ b/tests/PhpSpreadsheetTests/Writer/Xlsx/Issue3711Test.php @@ -0,0 +1,32 @@ +getActiveSheet(); + $sheet->getCell('A1')->setValue('21.5'); + self::assertSame(21.5, $sheet->getCell('A1')->getValue()); + $sheet->getCell('A1')->setDataType(DataType::TYPE_STRING); + $sheet->getCell('A2')->setValue('21'); + self::assertSame(21, $sheet->getCell('A2')->getValue()); + $sheet->getCell('A2')->setDataType(DataType::TYPE_STRING); + + $reloadedSpreadsheet = $this->writeAndReload($spreadsheet, 'Xlsx'); + $spreadsheet->disconnectWorksheets(); + $rsheet = $reloadedSpreadsheet->getActiveSheet(); + self::assertSame('21.5', $rsheet->getCell('A1')->getValue()); + self::assertSame('21', $rsheet->getCell('A2')->getValue()); + $reloadedSpreadsheet->disconnectWorksheets(); + } +} diff --git a/tests/data/Reader/HTML/utf8chars.charset.html b/tests/data/Reader/HTML/utf8chars.charset.html new file mode 100644 index 000000000..e180dfd7c --- /dev/null +++ b/tests/data/Reader/HTML/utf8chars.charset.html @@ -0,0 +1,43 @@ + + + + +Test Utf-8 characters voilà + + + + + + + + + + + + + + + + + + + + +
éàâèîαβγδε
𐐁𐐂𐐃 & だけちאבגדה𪔀𪔁𪔂
᠐᠑᠒അആกขฃ✀✐✠
+ + + + + + +
second table
+ + + + + + + +
third tablesecond cell
+ + diff --git a/tests/data/Reader/XLSX/threesheets.xlsx b/tests/data/Reader/XLSX/threesheets.xlsx new file mode 100644 index 000000000..de30d849e Binary files /dev/null and b/tests/data/Reader/XLSX/threesheets.xlsx differ