Resolve problems with writing the CF Header for each group of rules
This commit is contained in:
parent
762300da47
commit
7e89d3397e
|
|
@ -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
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue