Minor Performance Improvements

This commit is contained in:
oleibman
2024-06-10 09:19:35 -07:00
parent ef176f382e
commit 846fec7afa
4 changed files with 37 additions and 8 deletions
+15 -6
View File
@@ -171,6 +171,7 @@ class Xlsx extends BaseWriter
$this->numFmtHashTable = new HashTable();
$this->styleHashTable = new HashTable();
$this->stylesConditionalHashTable = new HashTable();
$this->determineUseDynamicArrays();
}
public function getWriterPartChart(): Chart
@@ -251,7 +252,7 @@ class Xlsx extends BaseWriter
public function save($filename, int $flags = 0): void
{
$this->processFlags($flags);
$this->useDynamicArray = $this->preCalculateFormulas && Calculation::getInstance($this->spreadSheet)->getArrayReturnType() === Calculation::RETURN_ARRAY_AS_ARRAY && !$this->useCSEArrays;
$this->determineUseDynamicArrays();
// garbage collect
$this->pathNames = [];
@@ -282,9 +283,9 @@ class Xlsx extends BaseWriter
$zipContent = [];
// Add [Content_Types].xml to ZIP file
$zipContent['[Content_Types].xml'] = $this->getWriterPartContentTypes()->writeContentTypes($this->spreadSheet, $this->includeCharts);
if ($this->useDynamicArrays()) {
$writerPartMetadata = new Xlsx\Metadata($this);
$zipContent['xl/metadata.xml'] = $writerPartMetadata->writeMetadata();
$metadataData = (new Xlsx\Metadata($this))->writeMetadata();
if ($metadataData !== '') {
$zipContent['xl/metadata.xml'] = $metadataData;
}
//if hasMacros, add the vbaProject.bin file, Certificate file(if exists)
@@ -721,13 +722,21 @@ class Xlsx extends BaseWriter
return $this;
}
public function setUseCSEArrays(bool $useCSEArrays): void
public function setUseCSEArrays(?bool $useCSEArrays): void
{
$this->useCSEArrays = $useCSEArrays;
if ($useCSEArrays !== null) {
$this->useCSEArrays = $useCSEArrays;
}
$this->determineUseDynamicArrays();
}
public function useDynamicArrays(): bool
{
return $this->useDynamicArray;
}
private function determineUseDynamicArrays(): void
{
$this->useDynamicArray = $this->preCalculateFormulas && Calculation::getInstance($this->spreadSheet)->getArrayReturnType() === Calculation::RETURN_ARRAY_AS_ARRAY && !$this->useCSEArrays;
}
}
@@ -14,6 +14,9 @@ class Metadata extends WriterPart
*/
public function writeMetadata(): string
{
if (!$this->getParentWriter()->useDynamicArrays()) {
return '';
}
// Create XML writer
$objWriter = null;
if ($this->getParentWriter()->getUseDiskCaching()) {
+6 -2
View File
@@ -5,6 +5,7 @@ namespace PhpOffice\PhpSpreadsheet\Writer\Xlsx;
use PhpOffice\PhpSpreadsheet\Calculation\Information\ErrorValue;
use PhpOffice\PhpSpreadsheet\Cell\Cell;
use PhpOffice\PhpSpreadsheet\Cell\Coordinate;
use PhpOffice\PhpSpreadsheet\Cell\DataType;
use PhpOffice\PhpSpreadsheet\Reader\Xlsx\Namespaces;
use PhpOffice\PhpSpreadsheet\RichText\RichText;
use PhpOffice\PhpSpreadsheet\Settings;
@@ -30,6 +31,8 @@ class Worksheet extends WriterPart
private bool $explicitStyle0;
private bool $useDynamicArrays = false;
/**
* Write worksheet to XML format.
*
@@ -40,6 +43,7 @@ class Worksheet extends WriterPart
*/
public function writeWorksheet(PhpspreadsheetWorksheet $worksheet, array $stringTable = [], bool $includeCharts = false): string
{
$this->useDynamicArrays = $this->getParentWriter()->useDynamicArrays();
$this->explicitStyle0 = $this->getParentWriter()->getExplicitStyle0();
$this->numberStoredAsText = '';
$this->formula = '';
@@ -1559,8 +1563,8 @@ class Worksheet extends WriterPart
$objWriter->startElement('c');
$objWriter->writeAttribute('r', $cellAddress);
$mappedType = $pCell->getDataType();
if (strtolower($mappedType) === 'f') {
if ($this->getParentWriter()->useDynamicArrays()) {
if ($mappedType === DataType::TYPE_FORMULA) {
if ($this->useDynamicArrays) {
$tempCalc = $pCell->getCalculatedValue();
if (is_array($tempCalc)) {
$objWriter->writeAttribute('cm', '1');
@@ -339,4 +339,17 @@ class ArrayFunctionsTest extends TestCase
}
$spreadsheet2->disconnectWorksheets();
}
public function testMetadataWritten(): void
{
Calculation::setArrayReturnType(Calculation::RETURN_ARRAY_AS_ARRAY);
$spreadsheet = new Spreadsheet();
$writer = new XlsxWriter($spreadsheet);
$writerMetadata = new XlsxWriter\Metadata($writer);
self::assertNotEquals('', $writerMetadata->writeMetaData());
$writer->setUseCSEArrays(true);
$writerMetadata2 = new XlsxWriter\Metadata($writer);
self::assertSame('', $writerMetadata2->writeMetaData());
$spreadsheet->disconnectWorksheets();
}
}