Skip to content

Commit 627f76a

Browse files
committed
Merge branch 'master' into powerkiki
2 parents 6160dc9 + 52f5b24 commit 627f76a

23 files changed

+447
-30
lines changed

src/PhpSpreadsheet/Cell/Cell.php

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -450,12 +450,9 @@ public function getDataType(): string
450450
*/
451451
public function setDataType($dataType): self
452452
{
453-
if ($dataType == DataType::TYPE_STRING2) {
454-
$dataType = DataType::TYPE_STRING;
455-
}
456-
$this->dataType = $dataType;
453+
$this->setValueExplicit($this->value, $dataType);
457454

458-
return $this->updateInCollection();
455+
return $this;
459456
}
460457

461458
/**

src/PhpSpreadsheet/Reader/BaseReader.php

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ abstract class BaseReader implements IReader
3939
/**
4040
* Restrict which sheets should be loaded?
4141
* This property holds an array of worksheet names to be loaded. If null, then all worksheets will be loaded.
42+
* This property is ignored for Csv, Html, and Slk.
4243
*
4344
* @var null|string[]
4445
*/
@@ -200,4 +201,39 @@ protected function openFile(string $filename): void
200201

201202
$this->fileHandle = $fileHandle;
202203
}
204+
205+
/**
206+
* Return worksheet info (Name, Last Column Letter, Last Column Index, Total Rows, Total Columns).
207+
*
208+
* @param string $filename
209+
*
210+
* @return array
211+
*/
212+
public function listWorksheetInfo($filename)
213+
{
214+
throw new PhpSpreadsheetException('Reader classes must implement their own listWorksheetInfo() method');
215+
}
216+
217+
/**
218+
* Returns names of the worksheets from a file,
219+
* possibly without parsing the whole file to a Spreadsheet object.
220+
* Readers will often have a more efficient method with which
221+
* they can override this method.
222+
*
223+
* @param string $filename
224+
*
225+
* @return array
226+
*/
227+
public function listWorksheetNames($filename)
228+
{
229+
$returnArray = [];
230+
$info = $this->listWorksheetInfo($filename);
231+
foreach ($info as $infoArray) {
232+
if (isset($infoArray['worksheetName'])) {
233+
$returnArray[] = $infoArray['worksheetName'];
234+
}
235+
}
236+
237+
return $returnArray;
238+
}
203239
}

src/PhpSpreadsheet/Reader/Csv.php

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
use PhpOffice\PhpSpreadsheet\Shared\StringHelper;
1111
use PhpOffice\PhpSpreadsheet\Spreadsheet;
1212
use PhpOffice\PhpSpreadsheet\Style\NumberFormat;
13+
use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet;
1314

1415
class Csv extends BaseReader
1516
{
@@ -98,6 +99,9 @@ class Csv extends BaseReader
9899
/** @var bool */
99100
private $preserveNullString = false;
100101

102+
/** @var bool */
103+
private $sheetNameIsFileName = false;
104+
101105
/**
102106
* Create a new CSV Reader instance.
103107
*/
@@ -212,8 +216,12 @@ protected function inferSeparator(): void
212216

213217
/**
214218
* Return worksheet info (Name, Last Column Letter, Last Column Index, Total Rows, Total Columns).
219+
*
220+
* @param string $filename
221+
*
222+
* @return array
215223
*/
216-
public function listWorksheetInfo(string $filename): array
224+
public function listWorksheetInfo($filename)
217225
{
218226
// Open file
219227
$this->openFileOrMemory($filename);
@@ -373,6 +381,9 @@ private function loadStringOrFile(string $filename, Spreadsheet $spreadsheet, bo
373381
$spreadsheet->createSheet();
374382
}
375383
$sheet = $spreadsheet->setActiveSheetIndex($this->sheetIndex);
384+
if ($this->sheetNameIsFileName) {
385+
$sheet->setTitle(substr(basename($filename, '.csv'), 0, Worksheet::SHEET_TITLE_MAXIMUM_LENGTH));
386+
}
376387

377388
// Set our starting row based on whether we're in contiguous mode or not
378389
$currentRow = 1;
@@ -635,4 +646,11 @@ public function getPreserveNullString(): bool
635646
{
636647
return $this->preserveNullString;
637648
}
649+
650+
public function setSheetNameIsFileName(bool $sheetNameIsFileName): self
651+
{
652+
$this->sheetNameIsFileName = $sheetNameIsFileName;
653+
654+
return $this;
655+
}
638656
}

src/PhpSpreadsheet/Reader/Html.php

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1164,4 +1164,29 @@ private function setBorderStyle(Style $cellStyle, string $styleValue, string $ty
11641164
],
11651165
]);
11661166
}
1167+
1168+
/**
1169+
* Return worksheet info (Name, Last Column Letter, Last Column Index, Total Rows, Total Columns).
1170+
*
1171+
* @param string $filename
1172+
*
1173+
* @return array
1174+
*/
1175+
public function listWorksheetInfo($filename)
1176+
{
1177+
$info = [];
1178+
$spreadsheet = new Spreadsheet();
1179+
$this->loadIntoExisting($filename, $spreadsheet);
1180+
foreach ($spreadsheet->getAllSheets() as $sheet) {
1181+
$newEntry = ['worksheetName' => $sheet->getTitle()];
1182+
$newEntry['lastColumnLetter'] = $sheet->getHighestDataColumn();
1183+
$newEntry['lastColumnIndex'] = Coordinate::columnIndexFromString($sheet->getHighestDataColumn()) - 1;
1184+
$newEntry['totalRows'] = $sheet->getHighestDataRow();
1185+
$newEntry['totalColumns'] = $newEntry['lastColumnIndex'] + 1;
1186+
$info[] = $newEntry;
1187+
}
1188+
$spreadsheet->disconnectWorksheets();
1189+
1190+
return $info;
1191+
}
11671192
}

src/PhpSpreadsheet/Reader/Ods.php

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -234,6 +234,7 @@ protected function loadSpreadsheetFromFile(string $filename): Spreadsheet
234234
{
235235
// Create new Spreadsheet
236236
$spreadsheet = new Spreadsheet();
237+
$spreadsheet->removeSheetByIndex(0);
237238

238239
// Load into this instance
239240
return $this->loadIntoExisting($filename, $spreadsheet);
@@ -335,9 +336,7 @@ public function loadIntoExisting(string $filename, Spreadsheet $spreadsheet): Sp
335336
$worksheetStyleName = $worksheetDataSet->getAttributeNS($tableNs, 'style-name');
336337

337338
// Create sheet
338-
if ($worksheetID > 0) {
339-
$spreadsheet->createSheet(); // First sheet is added by default
340-
}
339+
$spreadsheet->createSheet();
341340
$spreadsheet->setActiveSheetIndex($worksheetID);
342341

343342
if ($worksheetName || is_numeric($worksheetName)) {

src/PhpSpreadsheet/Reader/Slk.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,7 @@ public function listWorksheetInfo(string $filename): array
165165

166166
break;
167167
case 'Y':
168-
$rowIndex = substr($rowDatum, 1);
168+
$rowIndex = (int) substr($rowDatum, 1);
169169

170170
break;
171171
}

src/PhpSpreadsheet/Reader/Xls.php

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -416,6 +416,9 @@ class Xls extends BaseReader
416416
*/
417417
private $baseCell;
418418

419+
/** @var bool */
420+
private $activeSheetSet = false;
421+
419422
/**
420423
* Create a new Xls Reader instance.
421424
*/
@@ -820,6 +823,7 @@ protected function loadSpreadsheetFromFile(string $filename): Spreadsheet
820823
}
821824

822825
// Parse the individual sheets
826+
$this->activeSheetSet = false;
823827
foreach ($this->sheets as $sheet) {
824828
if ($sheet['sheetType'] != 0x00) {
825829
// 0x00: Worksheet, 0x02: Chart, 0x06: Visual Basic module
@@ -1231,6 +1235,9 @@ protected function loadSpreadsheetFromFile(string $filename): Spreadsheet
12311235
}
12321236
}
12331237
}
1238+
if ($this->activeSheetSet === false) {
1239+
$this->spreadsheet->setActiveSheetIndex(0);
1240+
}
12341241

12351242
// add the named ranges (defined names)
12361243
foreach ($this->definedname as $definedName) {
@@ -4389,6 +4396,7 @@ private function readWindow2(): void
43894396
$isActive = (bool) ((0x0400 & $options) >> 10);
43904397
if ($isActive) {
43914398
$this->spreadsheet->setActiveSheetIndex($this->spreadsheet->getIndex($this->phpSheet));
4399+
$this->activeSheetSet = true;
43924400
}
43934401

43944402
// bit: 11; mask: 0x0800; 0 = normal view, 1 = page break view

src/PhpSpreadsheet/Reader/Xlsx/WorkbookView.php

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,6 @@ public function __construct(Spreadsheet $spreadsheet)
1919
*/
2020
public function viewSettings(SimpleXMLElement $xmlWorkbook, $mainNS, array $mapSheetId, bool $readDataOnly): void
2121
{
22-
if ($this->spreadsheet->getSheetCount() == 0) {
23-
$this->spreadsheet->createSheet();
24-
}
2522
// Default active sheet index to the first loaded worksheet from the file
2623
$this->spreadsheet->setActiveSheetIndex(0);
2724

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace PhpOffice\PhpSpreadsheetTests\Cell;
6+
7+
use PhpOffice\PhpSpreadsheet\Cell\DataType;
8+
use PhpOffice\PhpSpreadsheet\Exception as PhpSpreadsheetException;
9+
use PhpOffice\PhpSpreadsheet\Spreadsheet;
10+
use PHPUnit\Framework\TestCase;
11+
12+
class DataType2Test extends TestCase
13+
{
14+
public function testSetDataType(): void
15+
{
16+
$spreadsheet = new Spreadsheet();
17+
$sheet = $spreadsheet->getActiveSheet();
18+
$sheet->getCell('A1')->setValue(28.1);
19+
self::assertSame(28.1, $sheet->getCell('A1')->getValue());
20+
self::assertSame('28.1', (string) $sheet->getCell('A1'));
21+
$sheet->getCell('A1')->setDataType(DataType::TYPE_STRING);
22+
self::assertSame('28.1', $sheet->getCell('A1')->getValue());
23+
$sheet->getCell('A1')->setDataType(DataType::TYPE_NUMERIC);
24+
self::assertSame(28.1, $sheet->getCell('A1')->getValue());
25+
$sheet->getCell('A1')->setDataType(DataType::TYPE_STRING2);
26+
self::assertSame('28.1', $sheet->getCell('A1')->getValue());
27+
$sheet->getCell('A1')->setDataType(DataType::TYPE_INLINE);
28+
self::assertSame('28.1', $sheet->getCell('A1')->getValue());
29+
$sheet->getCell('A1')->setDataType(DataType::TYPE_BOOL);
30+
self::assertTrue($sheet->getCell('A1')->getValue());
31+
$sheet->getCell('A1')->setDataType(DataType::TYPE_NUMERIC);
32+
self::assertSame(1, $sheet->getCell('A1')->getValue());
33+
34+
$sheet->getCell('A2')->setValue('X');
35+
36+
try {
37+
$sheet->getCell('A2')->setDataType(DataType::TYPE_NUMERIC);
38+
} catch (PhpSpreadsheetException $e) {
39+
self::assertSame('Invalid numeric value for datatype Numeric', $e->getMessage());
40+
}
41+
42+
$spreadsheet->disconnectWorksheets();
43+
}
44+
}

tests/PhpSpreadsheetTests/Reader/BaseNoLoad.php

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,4 @@ public function canRead(string $filename): bool
1212
{
1313
return $filename !== '';
1414
}
15-
16-
public function loadxxx(string $filename): void
17-
{
18-
$this->loadSpreadsheetFromFile($filename);
19-
}
2015
}

0 commit comments

Comments
 (0)