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à
+
+
+
+
+
+ | éàâèî |
+ αβγδε |
+
+
+ | 𐐁𐐂𐐃 & だけち |
+ אבגדה |
+ 𪔀𪔁𪔂 |
+
+
+ | ᠐᠑᠒ |
+ അആ |
+ กขฃ |
+ ✀✐✠ |
+
+
+
+
+
+
+
+ | third table |
+ second 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