mirror of
https://github.com/PHPOffice/PhpSpreadsheet.git
synced 2026-09-15 04:26:25 +00:00
Minor Performance Improvements
This commit is contained in:
@@ -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()) {
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user