Merge branch 'master' into powerkiki

This commit is contained in:
Adrien Crivelli
2023-09-12 11:07:32 +08:00
23 changed files with 447 additions and 30 deletions
+2 -5
View File
@@ -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;
}
/**
+36
View File
@@ -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;
}
}
+19 -1
View File
@@ -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;
}
}
+25
View File
@@ -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;
}
}
+2 -3
View File
@@ -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)) {
+1 -1
View File
@@ -165,7 +165,7 @@ class Slk extends BaseReader
break;
case 'Y':
$rowIndex = substr($rowDatum, 1);
$rowIndex = (int) substr($rowDatum, 1);
break;
}
+8
View File
@@ -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
@@ -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);
@@ -0,0 +1,44 @@
<?php
declare(strict_types=1);
namespace PhpOffice\PhpSpreadsheetTests\Cell;
use PhpOffice\PhpSpreadsheet\Cell\DataType;
use PhpOffice\PhpSpreadsheet\Exception as PhpSpreadsheetException;
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PHPUnit\Framework\TestCase;
class DataType2Test extends TestCase
{
public function testSetDataType(): void
{
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->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();
}
}
@@ -12,9 +12,4 @@ class BaseNoLoad extends BaseReader
{
return $filename !== '';
}
public function loadxxx(string $filename): void
{
$this->loadSpreadsheetFromFile($filename);
}
}
@@ -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');
}
}
@@ -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();
}
}
@@ -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());
@@ -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);
@@ -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();
}
}
@@ -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);
@@ -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());
@@ -0,0 +1,61 @@
<?php
declare(strict_types=1);
namespace PhpOffice\PhpSpreadsheetTests\Reader\Xls;
use PhpOffice\PhpSpreadsheet\Exception as PhpSpreadsheetException;
use PhpOffice\PhpSpreadsheet\Reader\Xls;
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PHPUnit\Framework\TestCase;
class LoadSheetsOnlyTest extends TestCase
{
/** @var ?Spreadsheet */
private $spreadsheet;
/**
* @var string
*/
private static $testbook = 'tests/data/Reader/XLS/HiddenSheet.xls';
protected function tearDown(): void
{
if ($this->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);
}
}
@@ -0,0 +1,74 @@
<?php
declare(strict_types=1);
namespace PhpOffice\PhpSpreadsheetTests\Reader\Xlsx;
use PhpOffice\PhpSpreadsheet\Exception as PhpSpreadsheetException;
use PhpOffice\PhpSpreadsheet\Reader\Xlsx;
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PHPUnit\Framework\TestCase;
class LoadSheetsOnlyTest extends TestCase
{
/** @var ?Spreadsheet */
private $spreadsheet;
/**
* @var string
*/
private static $testbook = 'tests/data/Reader/XLSX/HiddenSheet.xlsx';
protected function tearDown(): void
{
if ($this->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());
}
}
@@ -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.
@@ -0,0 +1,32 @@
<?php
declare(strict_types=1);
namespace PhpOffice\PhpSpreadsheetTests\Writer\Xlsx;
use PhpOffice\PhpSpreadsheet\Cell\DataType;
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheetTests\Functional\AbstractFunctional;
class Issue3711Test extends AbstractFunctional
{
public function testIssue3711(): void
{
// Issue 3711 - float being used as index in StringTable.
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->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();
}
}
@@ -0,0 +1,43 @@
<!DOCTYPE html>
<html>
<head>
<meta charset='UTF-8'>
<title>Test Utf-8 characters voilà</title>
</head>
<body>
<table>
<tbody>
<tr>
<td>éàâèî</td><!-- Latin1 -->
<td>αβγδε</td><!-- Greek -->
</tr>
<tr>
<td>𐐁𐐂𐐃 &amp; だけち</td><!-- Osmanya (not in BMP) and Hiragana -->
<td>אבגדה</td><!-- Hebrew -->
<td>𪔀𪔁𪔂</td><!-- CJK Unified Ideographs Extension B (not in BMP) -->
</tr>
<tr>
<td>᠐᠑᠒</td><!-- Mongolian -->
<td>അആ</td><!-- Malayalam -->
<td>กขฃ</td><!-- Thai -->
<td>✀✐✠</td><!-- Dingbats -->
</tr>
</tbody>
</table>
<table>
<tbody>
<tr>
<td>second table</td>
</tr>
</tbody>
</table>
<table>
<tbody>
<tr>
<td>third table</td>
<td>second cell</td>
</tr>
</tbody>
</table>
</body>
</html>
Binary file not shown.