From d02013c82e3f5dfa79b52f65663ad0b73f9fca57 Mon Sep 17 00:00:00 2001 From: Adrien Loison Date: Wed, 29 Apr 2015 00:48:09 -0700 Subject: [PATCH] Allow custom sheet name in the XLSX writer Added setter Added test Updated README --- README.md | 17 ++++++++++ src/Spout/Writer/Internal/XLSX/Worksheet.php | 2 +- src/Spout/Writer/Sheet.php | 12 ++++++- tests/Spout/Writer/SheetTest.php | 4 +-- tests/Spout/Writer/XLSXTest.php | 35 ++++++++++++++++++++ 5 files changed, 66 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 5276443..d562d37 100644 --- a/README.md +++ b/README.md @@ -180,6 +180,23 @@ It is also possible to retrieve all the sheets currently created: $sheets = $writer->getSheets(); ``` +If you rely on the sheet's name in your application, you can access it and customize it this way: +```php +// Accessing the sheet name when reading +while ($reader->hasNextSheet()) { + $sheet = $reader->nextSheet(); + $sheetName = $sheet->getName(); +} + +// Accessing the sheet name when writing +$sheet = $writer->getCurrentSheet(); +$sheetName = $sheet->getName(); + +// Customizing the sheet name when writing +$sheet = $writer->getCurrentSheet(); +$sheetName = $sheet->setName('My custom name'); +``` + ### Fluent interface Because fluent interfaces are great, you can use them with Spout: diff --git a/src/Spout/Writer/Internal/XLSX/Worksheet.php b/src/Spout/Writer/Internal/XLSX/Worksheet.php index ecea628..c94ec59 100644 --- a/src/Spout/Writer/Internal/XLSX/Worksheet.php +++ b/src/Spout/Writer/Internal/XLSX/Worksheet.php @@ -97,7 +97,7 @@ EOD; public function getId() { // sheet number is zero-based, while ID is 1-based - return $this->externalSheet->getSheetNumber() + 1; + return $this->externalSheet->getNumber() + 1; } /** diff --git a/src/Spout/Writer/Sheet.php b/src/Spout/Writer/Sheet.php index fd86c18..f077028 100644 --- a/src/Spout/Writer/Sheet.php +++ b/src/Spout/Writer/Sheet.php @@ -30,7 +30,7 @@ class Sheet /** * @return int Number of the sheet, based on order of creation (zero-based) */ - public function getSheetNumber() + public function getNumber() { return $this->sheetNumber; } @@ -42,4 +42,14 @@ class Sheet { return $this->name; } + + /** + * @param string $name Name of the sheet + * @return \Box\Spout\Writer\Sheet + */ + public function setName($name) + { + $this->name = $name; + return $this; + } } diff --git a/tests/Spout/Writer/SheetTest.php b/tests/Spout/Writer/SheetTest.php index 155c885..a79e803 100644 --- a/tests/Spout/Writer/SheetTest.php +++ b/tests/Spout/Writer/SheetTest.php @@ -22,8 +22,8 @@ class SheetTest extends \PHPUnit_Framework_TestCase $sheets = $this->writeDataAndReturnSheets('test_get_sheet_number.xlsx'); $this->assertEquals(2, count($sheets), '2 sheets should have been created'); - $this->assertEquals(0, $sheets[0]->getSheetNumber(), 'The first sheet should be number 0'); - $this->assertEquals(1, $sheets[1]->getSheetNumber(), 'The second sheet should be number 1'); + $this->assertEquals(0, $sheets[0]->getNumber(), 'The first sheet should be number 0'); + $this->assertEquals(1, $sheets[1]->getNumber(), 'The second sheet should be number 1'); } /** diff --git a/tests/Spout/Writer/XLSXTest.php b/tests/Spout/Writer/XLSXTest.php index e99ab80..174d8cc 100644 --- a/tests/Spout/Writer/XLSXTest.php +++ b/tests/Spout/Writer/XLSXTest.php @@ -343,6 +343,27 @@ class XLSXTest extends \PHPUnit_Framework_TestCase $this->assertInlineDataWasWrittenToSheet($fileName, 1, 'control's _x0015_ "character"'); } + /** + * @return void + */ + public function testSetNameShouldCreateSheetWithCustomName() + { + $fileName = 'test_set_name_should_create_sheet_with_custom_name.xlsx'; + $this->createGeneratedFolderIfNeeded($fileName); + $resourcePath = $this->getGeneratedResourcePath($fileName); + + $writer = WriterFactory::create(Type::XLSX); + $writer->openToFile($resourcePath); + + $customSheetName = 'CustomName'; + $sheet = $writer->getCurrentSheet(); + $sheet->setName($customSheetName); + + $writer->addRow(['xlsx--11', 'xlsx--12']); + $writer->close(); + + $this->assertSheetNameEquals($customSheetName, $resourcePath, "The sheet name should have been changed to '$customSheetName'"); + } /** * @param array $allRows @@ -445,4 +466,18 @@ class XLSXTest extends \PHPUnit_Framework_TestCase $this->assertContains($sharedString, $xmlContents, $message); } + + /** + * @param string $expectedName + * @param string $resourcePath + * @param string $message + * @return void + */ + private function assertSheetNameEquals($expectedName, $resourcePath, $message = '') + { + $pathToWorkbookFile = $resourcePath . '#xl/workbook.xml'; + $xmlContents = file_get_contents('zip://' . $pathToWorkbookFile); + + $this->assertContains('