Resolve problems with writing the CF Header for each group of rules

This commit is contained in:
MarkBaker 2022-03-12 20:55:37 +01:00
parent 762300da47
commit 7e89d3397e
1 changed files with 42 additions and 34 deletions

View File

@ -539,25 +539,32 @@ class Worksheet extends BIFFwriter
$this->writeSheetProtection(); $this->writeSheetProtection();
$this->writeRangeProtection(); $this->writeRangeProtection();
$arrConditionalStyles = $phpSheet->getConditionalStylesCollection(); // Write Conditional Formatting Rules and Styles
$this->writeConditionalFormatting();
$this->storeEof();
}
private function writeConditionalFormatting(): void
{
$arrConditionalStyles = $this->phpSheet->getConditionalStylesCollection();
if (!empty($arrConditionalStyles)) { if (!empty($arrConditionalStyles)) {
$arrConditional = []; $arrConditional = [];
$cfHeaderWritten = false;
// Write ConditionalFormattingTable records // Write ConditionalFormattingTable records
foreach ($arrConditionalStyles as $cellCoordinate => $conditionalStyles) { foreach ($arrConditionalStyles as $cellCoordinate => $conditionalStyles) {
$cfHeaderWritten = false;
foreach ($conditionalStyles as $conditional) { foreach ($conditionalStyles as $conditional) {
/** @var Conditional $conditional */ /** @var Conditional $conditional */
if ( if (
$conditional->getConditionType() == Conditional::CONDITION_EXPRESSION || $conditional->getConditionType() === Conditional::CONDITION_EXPRESSION ||
$conditional->getConditionType() == Conditional::CONDITION_CELLIS $conditional->getConditionType() === Conditional::CONDITION_CELLIS
) { ) {
// Write CFHEADER record (only if there are Conditional Styles that we are able to write) // Write CFHEADER record (only if there are Conditional Styles that we are able to write)
if ($cfHeaderWritten === false) { if ($cfHeaderWritten === false) {
$this->writeCFHeader(); $cfHeaderWritten = $this->writeCFHeader($cellCoordinate, $conditionalStyles);
$cfHeaderWritten = true;
} }
if (!isset($arrConditional[$conditional->getHashCode()])) { if ($cfHeaderWritten === true && !isset($arrConditional[$conditional->getHashCode()])) {
// This hash code has been handled // This hash code has been handled
$arrConditional[$conditional->getHashCode()] = true; $arrConditional[$conditional->getHashCode()] = true;
@ -568,8 +575,6 @@ class Worksheet extends BIFFwriter
} }
} }
} }
$this->storeEof();
} }
/** /**
@ -3127,8 +3132,10 @@ class Worksheet extends BIFFwriter
/** /**
* Write CFHeader record. * Write CFHeader record.
*
* @param Conditional[] $conditionalStyles
*/ */
private function writeCFHeader(): void private function writeCFHeader(string $cellCoordinate, array $conditionalStyles): bool
{ {
$record = 0x01B0; // Record identifier $record = 0x01B0; // Record identifier
$length = 0x0016; // Bytes to follow $length = 0x0016; // Bytes to follow
@ -3137,13 +3144,9 @@ class Worksheet extends BIFFwriter
$numColumnMax = null; $numColumnMax = null;
$numRowMin = null; $numRowMin = null;
$numRowMax = null; $numRowMax = null;
$arrConditional = []; $arrConditional = [];
foreach ($this->phpSheet->getConditionalStylesCollection() as $cellCoordinate => $conditionalStyles) {
foreach ($conditionalStyles as $conditional) { foreach ($conditionalStyles as $conditional) {
if (
$conditional->getConditionType() == Conditional::CONDITION_EXPRESSION ||
$conditional->getConditionType() == Conditional::CONDITION_CELLIS
) {
if (!in_array($conditional->getHashCode(), $arrConditional)) { if (!in_array($conditional->getHashCode(), $arrConditional)) {
$arrConditional[] = $conditional->getHashCode(); $arrConditional[] = $conditional->getHashCode();
} }
@ -3162,8 +3165,11 @@ class Worksheet extends BIFFwriter
$numRowMax = (int) $rangeCoordinates[1][1]; $numRowMax = (int) $rangeCoordinates[1][1];
} }
} }
if (count($arrConditional) === 0) {
return false;
} }
}
$needRedraw = 1; $needRedraw = 1;
$cellRange = pack('vvvv', $numRowMin - 1, $numRowMax - 1, $numColumnMin - 1, $numColumnMax - 1); $cellRange = pack('vvvv', $numRowMin - 1, $numRowMax - 1, $numColumnMin - 1, $numColumnMax - 1);
@ -3173,6 +3179,8 @@ class Worksheet extends BIFFwriter
$data .= pack('v', 0x0001); $data .= pack('v', 0x0001);
$data .= $cellRange; $data .= $cellRange;
$this->append($header . $data); $this->append($header . $data);
return true;
} }
private function getDataBlockProtection(Conditional $conditional): int private function getDataBlockProtection(Conditional $conditional): int