Skip to content

Commit 846fec7

Browse files
committed
Minor Performance Improvements
1 parent ef176f3 commit 846fec7

File tree

4 files changed

+37
-8
lines changed

4 files changed

+37
-8
lines changed

src/PhpSpreadsheet/Writer/Xlsx.php

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,7 @@ public function __construct(Spreadsheet $spreadsheet)
171171
$this->numFmtHashTable = new HashTable();
172172
$this->styleHashTable = new HashTable();
173173
$this->stylesConditionalHashTable = new HashTable();
174+
$this->determineUseDynamicArrays();
174175
}
175176

176177
public function getWriterPartChart(): Chart
@@ -251,7 +252,7 @@ public function getWriterPartWorksheet(): Worksheet
251252
public function save($filename, int $flags = 0): void
252253
{
253254
$this->processFlags($flags);
254-
$this->useDynamicArray = $this->preCalculateFormulas && Calculation::getInstance($this->spreadSheet)->getArrayReturnType() === Calculation::RETURN_ARRAY_AS_ARRAY && !$this->useCSEArrays;
255+
$this->determineUseDynamicArrays();
255256

256257
// garbage collect
257258
$this->pathNames = [];
@@ -282,9 +283,9 @@ public function save($filename, int $flags = 0): void
282283
$zipContent = [];
283284
// Add [Content_Types].xml to ZIP file
284285
$zipContent['[Content_Types].xml'] = $this->getWriterPartContentTypes()->writeContentTypes($this->spreadSheet, $this->includeCharts);
285-
if ($this->useDynamicArrays()) {
286-
$writerPartMetadata = new Xlsx\Metadata($this);
287-
$zipContent['xl/metadata.xml'] = $writerPartMetadata->writeMetadata();
286+
$metadataData = (new Xlsx\Metadata($this))->writeMetadata();
287+
if ($metadataData !== '') {
288+
$zipContent['xl/metadata.xml'] = $metadataData;
288289
}
289290

290291
//if hasMacros, add the vbaProject.bin file, Certificate file(if exists)
@@ -721,13 +722,21 @@ public function setExplicitStyle0(bool $explicitStyle0): self
721722
return $this;
722723
}
723724

724-
public function setUseCSEArrays(bool $useCSEArrays): void
725+
public function setUseCSEArrays(?bool $useCSEArrays): void
725726
{
726-
$this->useCSEArrays = $useCSEArrays;
727+
if ($useCSEArrays !== null) {
728+
$this->useCSEArrays = $useCSEArrays;
729+
}
730+
$this->determineUseDynamicArrays();
727731
}
728732

729733
public function useDynamicArrays(): bool
730734
{
731735
return $this->useDynamicArray;
732736
}
737+
738+
private function determineUseDynamicArrays(): void
739+
{
740+
$this->useDynamicArray = $this->preCalculateFormulas && Calculation::getInstance($this->spreadSheet)->getArrayReturnType() === Calculation::RETURN_ARRAY_AS_ARRAY && !$this->useCSEArrays;
741+
}
733742
}

src/PhpSpreadsheet/Writer/Xlsx/Metadata.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,9 @@ class Metadata extends WriterPart
1414
*/
1515
public function writeMetadata(): string
1616
{
17+
if (!$this->getParentWriter()->useDynamicArrays()) {
18+
return '';
19+
}
1720
// Create XML writer
1821
$objWriter = null;
1922
if ($this->getParentWriter()->getUseDiskCaching()) {

src/PhpSpreadsheet/Writer/Xlsx/Worksheet.php

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
use PhpOffice\PhpSpreadsheet\Calculation\Information\ErrorValue;
66
use PhpOffice\PhpSpreadsheet\Cell\Cell;
77
use PhpOffice\PhpSpreadsheet\Cell\Coordinate;
8+
use PhpOffice\PhpSpreadsheet\Cell\DataType;
89
use PhpOffice\PhpSpreadsheet\Reader\Xlsx\Namespaces;
910
use PhpOffice\PhpSpreadsheet\RichText\RichText;
1011
use PhpOffice\PhpSpreadsheet\Settings;
@@ -30,6 +31,8 @@ class Worksheet extends WriterPart
3031

3132
private bool $explicitStyle0;
3233

34+
private bool $useDynamicArrays = false;
35+
3336
/**
3437
* Write worksheet to XML format.
3538
*
@@ -40,6 +43,7 @@ class Worksheet extends WriterPart
4043
*/
4144
public function writeWorksheet(PhpspreadsheetWorksheet $worksheet, array $stringTable = [], bool $includeCharts = false): string
4245
{
46+
$this->useDynamicArrays = $this->getParentWriter()->useDynamicArrays();
4347
$this->explicitStyle0 = $this->getParentWriter()->getExplicitStyle0();
4448
$this->numberStoredAsText = '';
4549
$this->formula = '';
@@ -1559,8 +1563,8 @@ private function writeCell(XMLWriter $objWriter, PhpspreadsheetWorksheet $worksh
15591563
$objWriter->startElement('c');
15601564
$objWriter->writeAttribute('r', $cellAddress);
15611565
$mappedType = $pCell->getDataType();
1562-
if (strtolower($mappedType) === 'f') {
1563-
if ($this->getParentWriter()->useDynamicArrays()) {
1566+
if ($mappedType === DataType::TYPE_FORMULA) {
1567+
if ($this->useDynamicArrays) {
15641568
$tempCalc = $pCell->getCalculatedValue();
15651569
if (is_array($tempCalc)) {
15661570
$objWriter->writeAttribute('cm', '1');

tests/PhpSpreadsheetTests/Writer/Xlsx/ArrayFunctionsTest.php

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -339,4 +339,17 @@ public function testArrayMultipleColumns(): void
339339
}
340340
$spreadsheet2->disconnectWorksheets();
341341
}
342+
343+
public function testMetadataWritten(): void
344+
{
345+
Calculation::setArrayReturnType(Calculation::RETURN_ARRAY_AS_ARRAY);
346+
$spreadsheet = new Spreadsheet();
347+
$writer = new XlsxWriter($spreadsheet);
348+
$writerMetadata = new XlsxWriter\Metadata($writer);
349+
self::assertNotEquals('', $writerMetadata->writeMetaData());
350+
$writer->setUseCSEArrays(true);
351+
$writerMetadata2 = new XlsxWriter\Metadata($writer);
352+
self::assertSame('', $writerMetadata2->writeMetaData());
353+
$spreadsheet->disconnectWorksheets();
354+
}
342355
}

0 commit comments

Comments
 (0)