Delay sheetData and add sheetDataStarted flag to worksheet

This commit is contained in:
Martin Wind 2020-03-29 20:32:24 +02:00
parent 26e5f966fb
commit de3241b57c
2 changed files with 38 additions and 4 deletions

View File

@ -23,6 +23,9 @@ class Worksheet
/** @var int Index of the last written row */ /** @var int Index of the last written row */
private $lastWrittenRowIndex; private $lastWrittenRowIndex;
/** @var bool has the sheet data header been written */
private $sheetDataStarted = false;
/** /**
* Worksheet constructor. * Worksheet constructor.
* *
@ -36,6 +39,7 @@ class Worksheet
$this->externalSheet = $externalSheet; $this->externalSheet = $externalSheet;
$this->maxNumColumns = 0; $this->maxNumColumns = 0;
$this->lastWrittenRowIndex = 0; $this->lastWrittenRowIndex = 0;
$this->sheetDataStarted = false;
} }
/** /**
@ -110,4 +114,20 @@ class Worksheet
// sheet index is zero-based, while ID is 1-based // sheet index is zero-based, while ID is 1-based
return $this->externalSheet->getIndex() + 1; return $this->externalSheet->getIndex() + 1;
} }
/**
* @return bool
*/
public function getSheetDataStarted()
{
return $this->sheetDataStarted;
}
/**
* @param bool $sheetDataStarted
*/
public function setSheetDataStarted($sheetDataStarted)
{
$this->sheetDataStarted = $sheetDataStarted;
}
} }

View File

@ -119,9 +119,22 @@ EOD;
$worksheet->setFilePointer($sheetFilePointer); $worksheet->setFilePointer($sheetFilePointer);
\fwrite($sheetFilePointer, self::SHEET_XML_FILE_HEADER); \fwrite($sheetFilePointer, self::SHEET_XML_FILE_HEADER);
\fwrite($sheetFilePointer, $this->getXMLFragmentForDefaultCellSizing()); }
\fwrite($sheetFilePointer, $this->getXMLFragmentForColumnWidths());
\fwrite($sheetFilePointer, '<sheetData>'); /**
* Writes the sheet data header
*
* @param Worksheet $worksheet The worksheet to add the row to
* @return void
*/
private function ensureSheetDataStated(Worksheet $worksheet) {
if (!$worksheet->getSheetDataStarted()) {
$worksheetFilePointer = $worksheet->getFilePointer();
\fwrite($worksheetFilePointer, $this->getXMLFragmentForDefaultCellSizing());
\fwrite($worksheetFilePointer, $this->getXMLFragmentForColumnWidths());
\fwrite($worksheetFilePointer, '<sheetData>');
$worksheet->setSheetDataStarted(true);
}
} }
/** /**
@ -161,6 +174,7 @@ EOD;
*/ */
private function addNonEmptyRow(Worksheet $worksheet, Row $row) private function addNonEmptyRow(Worksheet $worksheet, Row $row)
{ {
$this->ensureSheetDataStated($worksheet);
$sheetFilePointer = $worksheet->getFilePointer(); $sheetFilePointer = $worksheet->getFilePointer();
$rowStyle = $row->getStyle(); $rowStyle = $row->getStyle();
$rowIndexOneBased = $worksheet->getLastWrittenRowIndex() + 1; $rowIndexOneBased = $worksheet->getLastWrittenRowIndex() + 1;
@ -316,7 +330,7 @@ EOD;
if (!\is_resource($worksheetFilePointer)) { if (!\is_resource($worksheetFilePointer)) {
return; return;
} }
$this->ensureSheetDataStated($worksheet);
\fwrite($worksheetFilePointer, '</sheetData>'); \fwrite($worksheetFilePointer, '</sheetData>');
\fwrite($worksheetFilePointer, '</worksheet>'); \fwrite($worksheetFilePointer, '</worksheet>');
\fclose($worksheetFilePointer); \fclose($worksheetFilePointer);