PhpSpreadsheet 条件操作

PhpSpreadsheet提供了一种使用条件格式的方法,允许根据单元格的值设置格式。这个功能类似于Excel中的条件格式,可以应用于单个或多个单元格。条件格式规则可以基于各种条件,如单元格值的大小、文本、日期等。向导功能简化了创建和应用这些规则的过程,使得开发者无需深入了解复杂的Excel公式和运算符。向导支持多种规则类型,如单元值、文本值、日期值等,同时还考虑了条件规则的评估顺序。此外,PhpSpreadsheet的部分读写器支持条件格式,但不是所有类型都受支持。
摘要由CSDN通过智能技术生成

条件格式

介绍

除了标准的单元格格式选项外,大多数电子表格软件都提供了一个称为条件格式的选项,它允许根据单元格的值设置格式选项。

单元格的标准格式定义了将始终应用的大多数样式元素,例如字体和大小;但是条件格式允许您覆盖该单元格样式的某些元素,例如数字格式掩码;字体颜色、粗体、斜体和下划线;边界;并填充颜色和图案。

条件格式可以应用于单个单元格或一系列单元格。

例子

作为 MS Excel 本身的一个简单示例,如果我们想突出显示范围 A1:A10 中包含大于 80 的值的所有单元格,请首先选择单元格范围。

在“开始”选项卡的“样式”组中,单击“条件格式”。这允许我们选择一个 Excel 向导来指导我们完成创建条件规则并为该规则定义样式的过程。

单击“突出显示单元格规则”,然后单击“大于”。

在提示框中输入数值“80”;并选择一种预定义的格式样式(或从那里创建自定义样式)。

然后单击“确定”。该规则立即应用于选定的单元格范围,突出显示所选样式中值大于 80 的所有单元格。

对该范围内单元格值的任何更改都将立即检查规则,并在适用时自动应用新样式。

如果我们想在 PHPSpreadsheet 中设置相同的条件格式规则,我们可以使用以下代码:

$conditional = new \PhpOffice\PhpSpreadsheet\Style\Conditional();
$conditional->setConditionType(\PhpOffice\PhpSpreadsheet\Style\Conditional::CONDITION_CELLIS);
$conditional->setOperatorType(\PhpOffice\PhpSpreadsheet\Style\Conditional::OPERATOR_GREATERTHAN);
$conditional->addCondition(80);
$conditional->getStyle()->getFont()->getColor()->setARGB(\PhpOffice\PhpSpreadsheet\Style\Color::COLOR_DARKGREEN);
$conditional->getStyle()->getFill()->setFillType(\PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID);
$conditional->getStyle()->getFill()->getStartColor()->setARGB(\PhpOffice\PhpSpreadsheet\Style\Color::COLOR_GREEN);

$conditionalStyles = $spreadsheet->getActiveSheet()->getStyle('A1:A10')->getConditionalStyles();
$conditionalStyles[] = $conditional;

$spreadsheet->getActiveSheet()->getStyle('A1:A10')->setConditionalStyles($conditionalStyles);

根据我们可能想要申请条件的规则,有时需要“运算符类型”,有时不需要(并且并非所有运算符类型都适用于所有条件类型);有时需要一个“条件”(甚至是几个条件),有时不需要,有时它必须是特定的 Excel 公式表达式。手动创建条件需要很好地了解何时需要设置这些不同的属性,以及使用什么类型的值。这不是最终用户开发人员应该知道的事情。

所以 - 为了消除对复杂和神秘知识的需求 - 由于 PHPSpreadsheet 版本 1.22.0 还有一系列向导可以帮助创建条件格式规则,并且能够设置适当的运算符和条件(包括有时复杂的Excel 公式表达式)用于条件规则:

$wizardFactory = new \PhpOffice\PhpSpreadsheet\Style\ConditionalFormatting\Wizard('A1:A10');
$wizard = $wizardFactory->newRule(\PhpOffice\PhpSpreadsheet\Style\ConditionalFormatting\Wizard::CELL_VALUE);
$wizard->greaterThan(80);
$wizard->getStyle()->getFont()->getColor()->setARGB(\PhpOffice\PhpSpreadsheet\Style\Color::COLOR_DARKGREEN);
$wizard->getStyle()->getFill()->setFillType(\PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID);
$wizard->getStyle()->getFill()->getStartColor()->setARGB(\PhpOffice\PhpSpreadsheet\Style\Color::COLOR_GREEN);

$conditional = $wizard->getConditional();

向导知道哪些运算符类型与条件类型匹配,并为运算符提供更有意义的方法名称,并在需要时构建表达式和公式;并且还可以与 PHPStorm 等 IDE 配合使用。


请注意,这$conditionalStyles是一个数组:可以将多个条件应用于相同的单元格范围。如果我们还想突出显示 A1:A10 范围内小于 10 的值,我们可以添加第二个样式规则。

在 Excel 中,我们将通过再次选择范围并执行相同的过程来完成此操作,这次选择“突出显示单元格规则”,然后从“条件样式”菜单中选择“小于”,在中输入值“10”提示框,并选择合适的样式。

在 PHPSpreadsheet 中,我们会这样做:

$conditional2 = new \PhpOffice\PhpSpreadsheet\Style\Conditional();
$conditional2->setConditionType(\PhpOffice\PhpSpreadsheet\Style\Conditional::CONDITION_CELLIS);
$conditional2->setOperatorType(\PhpOffice\PhpSpreadsheet\Style\Conditional::OPERATOR_LESSTHAN);
$conditional2->addCondition(10);
$conditional2->getStyle()->getFont()->getColor()->setARGB(\PhpOffice\PhpSpreadsheet\Style\Color::COLOR_DARKRED);
$conditional2->getStyle()->getFill()->setFillType(\PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID);
$conditional2->getStyle()->getFill()->getStartColor()->setARGB(\PhpOffice\PhpSpreadsheet\Style\Color::COLOR_RED);

$conditionalStyles = $spreadsheet->getActiveSheet()->getStyle('A1:A10')->getConditionalStyles();
$conditionalStyles[] = $conditional2;

$spreadsheet->getActiveSheet()->getStyle('A1:A10')->setConditionalStyles($conditionalStyles);

或者再次使用向导:

$wizardFactory = new \PhpOffice\PhpSpreadsheet\Style\ConditionalFormatting\Wizard('A1:A10');
$wizard = $wizardFactory->newRule(\PhpOffice\PhpSpreadsheet\Style\ConditionalFormatting\Wizard::CELL_VALUE);
$wizard->lessThan(10);
$wizard->getStyle()->getFont()->getColor()->setARGB(\PhpOffice\PhpSpreadsheet\Style\Color::COLOR_DARKGREEN);
$wizard->getStyle()->getFill()->setFillType(\PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID);
$wizard->getStyle()->getFill()->getStartColor()->setARGB(\PhpOffice\PhpSpreadsheet\Style\Color::COLOR_GREEN);

$conditional = $wizard->getConditional();

评估多个规则/条件的顺序

$conditionalStyles是一个数组,它不仅表示可以应用于一个单元格(或单元格范围)的多个条件,还表示它们被检查的顺序。MS Excel 将按定义的顺序依次检查每个条件;并在找到第一个匹配规则后停止检查。这意味着检查条件的顺序可能很重要。

考虑以下。我们有一个条件来检查单元格值是否在 -10 和 10 之间,如果条件匹配,则将单元格样式设置为黄色;第二个条件检查单元格值是否等于 0,如果匹配,则将单元格设置为红色。- 如果值介于 -2 和 2 之间,则为黄色 - 如果值等于 0,则为红色

如果它们按照我上面描述的顺序进行评估,并且单元格的值为 0,那么第一条规则将匹配(因为 0 介于 -2 和 2 之间),并且单元格将被设置为黄色,并且没有将检查进一步的条件。因此,如果值为 0,则将单元格样式设置为红色的规则将永远不会被评估,即使它也会匹配(并且可能是我们真正想要的,否则为什么要为该条件定义明确的规则)。

如果规则顺序颠倒 - 如果值等于 0,则为红色 - 如果值在 -2 和 2 之间,则为黄色

那么包含值 0 的单元格将呈现为红色,因为这是第一个匹配条件;并且不会针对该单元评估 between 规则。

因此,当您有多个规则可能“重叠”的条件时,这些条件的顺序很重要。

读写器支持

目前,以下 Readers 和 Writers 支持以下条件类型:

微软Excel条件类型读者作家
单元格值有条件的::CONDITION_CELLISxlsx
具体文本有条件的::CONDITION_CONTAINSTEXTxlsxxlsx
有条件的::CONDITION_NOTCONTAINSTEXTxlsxxlsx
有条件的::CONDITION_BEGINSWITHxlsxxlsx
有条件的::CONDITION_ENDSWITHxlsxxlsx
发生日期有条件的::CONDITION_TIMEPERIODxlsxxlsx
空白有条件的::CONDITION_CONTAINSBLANKSxlsxxlsx
没有空白有条件的::CONDITION_NOTCONTAINSBLANKSxlsxxlsx
错误有条件的::CONDITION_CONTAINSERRORSxlsxxlsx
没有错误有条件的::CONDITION_NOTCONTAINSERRORSxlsxxlsx
重复/唯一有条件的::CONDITION_DUPLICATESxlsxxlsx
有条件的::CONDITION_UNIQUExlsxxlsx
使用公式条件::CONDITION_EXPRESSIONxlsxXlsx, Xls
数据条条件::CONDITION_DATABARxlsxxlsx

任何 Readers 或 Writers 目前不支持以下条件类型:

微软Excel条件类型
高于/低于平均水平?
顶部/底部项目?
顶部/底部百分比?
色标?
图标集?

不支持的类型将被读者忽略,并且不能通过 PHPSpreadsheet 创建。

奇才

虽然 Wizards 并没有简化 Conditional Style 本身的定义;它们确实使定义应用该样式的条件(规则)变得更加容易。MS Excel 本身有向导来指导条件格式规则和样式的创建。

向导工厂允许我们为要应用的 CF 规则检索适当的向导。大多数已经定义的都属于“仅格式化包含的单元格”类别。MS Excel 提供了一系列不同类型的规则,每种规则都有自己的格式和逻辑。向导尝试复制此逻辑和行为,类似于 Excel 自己的“格式化规则”帮助向导。

微软Excel向导工厂 newRule() 类型常量向导类名称
单元格值向导::CELL_VALUE单元格值
具体文本向导::TEXT_VALUE文本值
发生日期向导::DATES_OCCURRING日期值
空白向导::空白空白
没有空白向导::NOT_BLANKS空白
错误向导::错误错误
没有错误向导::NOT_ERRORS错误

此外,“仅格式化唯一或重复值”和“使用公式确定要格式化的单元格”还存在向导:

微软Excel向导工厂 newRule() 类型常量向导类名称
重复/唯一Wizard::DUPLICATES 或 Wizard::UNIQUE重复
使用公式Wizard::EXPRESSION 或 Wizard::FORMULA表达

当前没有数据栏向导,即使 Xlsx 读取器和写入器支持此条件类型。


我们实例化向导工厂,传入我们要应用条件格式规则的单元格范围;然后可以调用该newRule()方法,传入我们要创建的条件规则类型,以返回相应的向导:

$wizardFactory = new \PhpOffice\PhpSpreadsheet\Style\ConditionalFormatting\Wizard('C3:E5');
$wizard = $wizardFactory->newRule(\PhpOffice\PhpSpreadsheet\Style\ConditionalFormatting\Wizard::CELL_VALUE);

当然,您可以直接实例化您想要的向导,而不是使用工厂;但仍然记得在单元格范围内传递。

$wizard = new \PhpOffice\PhpSpreadsheet\Style\ConditionalFormatting\Wizard\CellValue('C3:E5');

然后,该向导提供允许我们定义规则、设置运算符和我们要为该规则比较的值的方法。请注意,并非所有规则都需要值甚至运算符,但各个向导提供了必要的内容;本文档列出了每个向导可用的所有选项。

一旦我们使用向导定义了我们想要的条件和值;并使用该setStyle()方法定义了一个样式,然后我们调用向导的getConditional()方法返回一个条件对象,该对象可以添加到我们传递给的条件样式数组中setConditionalStyles()

单元值向导

对于CellValue向导,​​我们总是需要提供一个操作符和一个值;而对于“between”和“notBetween”运算符,我们需要提供两个值来指定范围。

条件类型向导工厂 newRule() 类型常量条件运算符类型向导方法笔记
有条件的::CONDITION_CELLIS向导::CELL_VALUE有条件的::OPERATOR_EQUAL等于()
有条件的::OPERATOR_NOTEQUAL不等于()
有条件的::OPERATOR_GREATERTHAN比...更棒()
有条件的::OPERATOR_GREATERTHANOREQUAL大于等于()
有条件的::OPERATOR_LESSTHAN少于()
有条件的::OPERATOR_LESSTHANOREQUAL小于等于()
有条件的::OPERATOR_BETWEEN之间()
有条件的::OPERATOR_NOTBETWEEN不在()之间
和()用于为between()and `notBetween()提供第二个操作数

每个规则都需要一个操作员调用(除between()notBetween,向导还提供and());并且为所有操作员提供一个值是强制性的。我们需要为每个运算符提供的值可以是数字、布尔值或字符串文字(甚至是 NULL);单元格引用;或公式。

因此,要使用运算符设置规则,我们将进行如下调用:

$wizard->lessThan(10);

或者在设置between()ornotBetween()规则时,我们可以使用 fluent interface 的and()方法来设置值的范围:

$wizard->between(-10)->and(10);

对于or范围,提供第二个值 usingand()是强制性的。between()notBetween()

要检索 Conditional 并将其添加到我们的$conditionalStyles数组中,我们调用 Wizard 的getConditional()方法。

$conditional = $wizard->getConditional();
$conditionalStyles = [$conditional];

或者干脆

$conditionalStyles[] = $wizard->getConditional();

综上所述,我们可以使用如下代码块(使用预定义的 Style 对象):

$cellRange = 'A2:E5';
$conditionalStyles = [];
$wizardFactory = new Wizard($cellRange);
/** @var Wizard\CellValue $cellWizard */
$cellWizard = $wizardFactory->newRule(Wizard::CELL_VALUE);

$cellWizard->equals(0)
    ->setStyle($yellowStyle);
$conditionalStyles[] = $cellWizard->getConditional();

$cellWizard->greaterThan(0)
    ->setStyle($greenStyle);
$conditionalStyles[] = $cellWizard->getConditional();

$cellWizard->lessThan(0)
    ->setStyle($redStyle);
$conditionalStyles[] = $cellWizard->getConditional();

$spreadsheet->getActiveSheet()
    ->getStyle($cellWizard->getCellRange())
    ->setConditionalStyles($conditionalStyles);

您可以在 repo的代码示例中找到一个示例来演示这一点。

值类型

当我们需要为运算符提供值时,该值可以是数字、布尔值或字符串字面量(甚至是 NULL);单元格引用;甚至是 Excel 公式。

字面量

如果值是字面量(甚至是字符串字面量),我们只需要传递值;当我们从向导获得条件时,向导将确保正确引用字符串。

$wizard->equals('Hello World');

如果您没有使用向导,而是直接创建 Conditional,则需要记住自己将该值括在引号中 ( '"Hello World"')

但是,单元格引用或公式也是字符串数据,因此我们需要告诉向导我们传入的值是否不仅仅是字符串文字值,而是应被视为单元格引用或公式。

单元格引用

如果我们想H9在规则中使用来自单元格的值;VALUE_TYPE_CELL那么除了单元格引用本身之外,我们还需要将值类型传递给运算符。

$wizard->equals('$H$9', Wizard::VALUE_TYPE_CELL);

您可以在 repo的代码示例中找到一个示例来演示这一点。

请注意,我们将单元格作为绝对单元格引用传递,$为行和列“固定”(带有符号)。

在下一个示例中,我们需要使用相对单元格引用,以便比较将列A中的值与列中的值B以及C范围内的每一行匹配(A18:A20);即,测试 in 的值A18是否介于 and 的值之间B18C18测试 in 的值是否介于and的值A19之间,等等。 B19C19

$wizard->between('$B1', Wizard::VALUE_TYPE_CELL)
    ->and('$C1', Wizard::VALUE_TYPE_CELL)
    ->setStyle($greenStyle);

此示例也可以在repo的代码示例中找到。

在这种情况下,我们“固定”地址列;但让该行“取消固定”。另请注意,我们将范围中的第一个单元格视为单元格A1:相对行号将自动调整以匹配我们定义的范围;也就是说,当我们调用getConditional().

公式

也可以将值/操作数设置为 Excel 公式表达式,而不仅仅是文字值或单元格引用。同样,我们确实需要指定该值是一个公式。

$cellRange = 'C26:C28';
$conditionalStyles = [];
$wizardFactory = new Wizard($cellRange);
/** @var Wizard\CellValue $cellWizard */
$cellWizard = $wizardFactory->newRule(Wizard::CELL_VALUE);

$cellWizard->equals('CONCATENATE($A1," ",$B1)', Wizard::VALUE_TYPE_FORMULA)
    ->setStyle($yellowStyle);
$conditionalStyles[] = $cellWizard->getConditional();

$spreadsheet->getActiveSheet()
    ->getStyle($cellWizard->getCellRange())
    ->setConditionalStyles($conditionalStyles);

您可以在 repo的代码示例中找到一个示例来演示这一点。

当公式包含单元格引用时,我们再次需要小心固定到绝对列/行;A1当取消固定时,我们在定义公式时基于单元格区域的左上角单元格进行引用。在这里,我们将公式定义为CONCATENATE($A1," ",$B1),因此我们“固定”列AB;的列引用。但是保持该行未固定(明确设置为从第 1 行开始),然后在我们从向导中获取条件时将其调整为条件范围,并在 MS Excel 显示结果时调整为该范围内的各个行。

文本值向导

虽然我们可以使用CellValue向导来执行基本的字符串比较规则,但TextValue向导提供了比较字符串值部分的规则。

对于TextValue向导,​​我们总是需要提供一个运算符和一个值。与CellValue向导一样,值可以是文字(但应始终是字符串文字)、单元格引用或公式。

条件类型向导工厂 newRule() 类型常量条件运算符类型向导方法笔记
有条件的::CONDITION_CONTAINSTEXT向导::TEXT_VALUE有条件的::OPERATOR_CONTAINSTEXT包含()
有条件的::CONDITION_NOTCONTAINSTEXT向导::TEXT_VALUE有条件的::OPERATOR_NOTCONTAINS不含()
不包含()同义词doesNotContain()
有条件的::CONDITION_BEGINSWITH向导::TEXT_VALUE有条件的::OPERATOR_BEGINSWITH开始于()
以。。开始()同义词beginsWith()
有条件的::CONDITION_ENDSWITH向导::TEXT_VALUE有条件的::OPERATOR_ENDSWITH以。。结束()

Conditional 实际上为每个选项使用单独的“条件类型”,每个选项都有自己的“运算符类型”,条件应该是 Excel 公式(不仅仅是要检查的字符串值),并带有自定义text属性。向导应该使创建这些条件规则变得更加容易。

要手动创建条件规则,您需要执行以下操作:

$cellRange = 'A14:B16';
$conditionalStyles = [];
$conditional = new Conditional();
// Remember to use the correct Condition Type
$conditional->setConditionType(Conditional::CONDITION_CONTAINSTEXT);
// Remember to use the correct Operator Type
$conditional->setOperatorType(Conditional::OPERATOR_CONTAINSTEXT);
// Remember to set the text attribute
// Remember to wrap the string literal
$conditional->setText('"LL"');
// Remember that the condition should be the first element in an array
// Remember that we need a specific formula for this Conditional 
// Remember to wrap the string literal
// Remember to use the top-left cell of the range that we want to apply this rule to
$conditional->setConditions(['NOT(ISERROR(SEARCH("LL",A14)))']);
$conditional->setStyle($greenStyle);

$conditionalStyles[]

$spreadsheet->getActiveSheet()
    ->getStyle($cellRange)
    ->setConditionalStyles($conditionalStyles);

但是使用向导,可以通过以下方式创建相同的条件规则:

$cellRange = 'A14:B16';
$conditionalStyles = [];
$wizardFactory = new Wizard($cellRange);
/** @var Wizard\TextValue $textWizard */
$textWizard = $wizardFactory->newRule(Wizard::TEXT_VALUE);

$textWizard->contains('LL')
    ->setStyle($greenStyle);
$conditionalStyles[] = $textWizard->getConditional();

$spreadsheet->getActiveSheet()
    ->getStyle($textWizard->getCellRange())
    ->setConditionalStyles($conditionalStyles);

您可以在 repo的代码示例中找到一个示例来演示这一点。

该文件中还有用于notContains(),beginsWith()endsWith()比较的示例;使用文字文本和单元格引用。

下面列出了实际使用的 Excel 表达式(如果您自己定义条件而不是使用向导,则需要手动设置):

条件类型条件表达式
有条件的::CONDITION_CONTAINSTEXT非(ISERROR(搜索(<value><cell address>)))
有条件的::CONDITION_NOTCONTAINSTEXT错误(搜索(<value><cell address>))</
有条件的::CONDITION_BEGINSWITH左( <cell address>,LEN( <value>))=<value>
有条件的::CONDITION_ENDSWITH右( <cell address>,LEN( <value>))=<value>

<cell address>始终引用此条件格式规则的单元格区域中的左上角单元格。对于字符串文字,<value>应该用双引号 ( ) 括起来;"但如果它是存储在单元格引用或公式中的值,则不加引号。TextValue向导会为您定义这些表达式。

CellValue向导的操作数一样,您可以将传递给contains()doesNotContain()beginsWith()的值指定endsWith()为单元格引用或公式;如果你这样做了,那么你需要将第二个参数传递给那些指定Wizard::VALUE_TYPE_CELLor的方法Wizard::VALUE_TYPE_FORMULA。相同的规则也适用于上述CellValue向导的“固定”单元格引用。

$textWizard->beginsWith('$D$1', Wizard::VALUE_TYPE_CELL)
    ->setStyle($yellowStyle);

日期值向导

对于DateValue向导,​​我们总是需要提供一个操作符;但不需要任何值。

条件类型向导工厂 newRule() 类型常量条件运算符类型向导方法笔记
有条件的::CONDITION_TIMEPERIOD向导::DATES_OCCURRING有条件的::TIMEPERIOD_TODAY今天()
有条件的::TIMEPERIOD_YESTERDAY昨天()
有条件的::TIMEPERIOD_TOMORROW明天()
有条件的::TIMEPERIOD_LAST_7_DAYS最后7天()
最后七天()同义词last7Days()
有条件的::TIMEPERIOD_LAST_WEEK上周()
有条件的::TIMEPERIOD_THIS_WEEK本星期()
有条件的::TIMEPERIOD_NEXT_WEEK下周()
有条件的::TIMEPERIOD_LAST_MONTH上个月()
有条件的::TIMEPERIOD_THIS_MONTH这个月()
有条件的::TIMEPERIOD_NEXT_MONTH下个月()

条件没有实际的“运算符类型”,条件/值应该是 Excel 公式,并具有自定义timePeriod属性。向导应该使创建这些条件规则变得更加容易。

上图显示了一个网格,展示了每个可能的日期发生规则,并且是使用代码示例生成的

典型的示例代码看起来像:

$wizardFactory = new Wizard("E2:E19");
/** @var Wizard\DateValue $dateWizard */
$dateWizard = $wizardFactory->newRule(Wizard::DATES_OCCURRING);
$conditionalStyles = [];

$dateWizard->last7Days()
    ->setStyle($yellowStyle);

$conditionalStyles[] = $dateWizard->getConditional();

$spreadsheet->getActiveSheet()
    ->getStyle($dateWizard->getCellRange())
    ->setConditionalStyles($conditionalStyles);

下面列出了实际使用的 Excel 表达式(如果您自己定义条件而不是使用向导,则需要手动设置):

timePeriod 属性条件表达式
今天楼层(<cell address>,1)=今天()-1
昨天楼层(<cell address>,1)=今天()
明天楼层(<cell address>,1)=今天()+1
最后7天AND(今天()-地板( <cell address>,1)<=6,地板( <cell address>,1)<=今天())
上周AND(TODAY()-ROUNDDOWN( <cell address>,0)>=(WEEKDAY(TODAY())),TODAY()-ROUNDDOWN( <cell address>,0)<(WEEKDAY(TODAY())+7))
本星期AND(TODAY()-ROUNDDOWN( <cell address>,0)<=WEEKDAY(TODAY())-1,ROUNDDOWN( <cell address>,0)-TODAY()<=7-WEEKDAY(TODAY()))
下周AND(ROUNDDOWN( <cell address>,0)-TODAY()>(7-WEEKDAY(TODAY())),ROUNDDOWN( <cell address>,0)-TODAY()<(15-WEEKDAY(TODAY())))
上个月与(月(<cell address>)=月(日期(今天(),0-1)),年(<cell address>)=年(日期(今天(),0-1)))
这个月与(月(<cell address>)=月(今天()),年(<cell address>)=年(今天()))
下个月AND(MONTH( <cell address>)=MONTH(EDATE(TODAY(),0+1)),YEAR( <cell address>)=YEAR(EDATE(TODAY(),0+1)))

<cell address>始终引用此条件格式规则的单元格区域中的左上角单元格。

空白向导

此向导用于定义简单的布尔状态规则,以确定单元格是否为空白。无论是使用规则类型为Wizard::BLANKS或的向导工厂创建的,都会返回Wizard::NOT_BLANKS相同的向导。Blanks唯一的区别是,在一种情况下,规则状态是为 预设的CONDITION_CONTAINSBLANKS,在另一种情况下,它是为 预设的CONDITION_NOTCONTAINSBLANKSisBlank()但是,您可以使用andnotBlank()方法在两个规则之间切换;并且仅在您调用时getConditional()才会根据向导的当前状态返回条件。

条件类型向导工厂 newRule() 类型常量条件运算符类型向导方法笔记
有条件的::CONDITION_CONTAINSBLANKS向导::空白-是空白()默认状态
非空白()
是空的()同义词isBlank()
不是空的()同义词notBlank()
有条件的::CONDITION_NOTCONTAINSBLANKS向导::NOT_BLANKS-非空白()默认状态
是空白()
是空的()同义词isBlank()
不是空的()同义词notBlank()

以下代码显示了用于创建空白和非空白条件的相同空白向导,使用预定义的$redStyle样式对象用于空白,使用预定义的$greenStyle样式对象用于非空白。

$cellRange = 'A2:B3';
$conditionalStyles = [];
$wizardFactory = new Wizard($cellRange);
/** @var Wizard\Blanks $blanksWizard */
$blanksWizard = $wizardFactory->newRule(Wizard::BLANKS);

$blanksWizard->setStyle($redStyle);
$conditionalStyles[] = $blanksWizard->getConditional();

$blanksWizard->notBlank()
    ->setStyle($greenStyle);
$conditionalStyles[] = $blanksWizard->getConditional();

$spreadsheet->getActiveSheet()
    ->getStyle($blanksWizard->getCellRange())
    ->setConditionalStyles($conditionalStyles);

此示例也可以在repo的代码示例中找到。

空白向导方法不需要操作数/值;但返回的 Conditional 包含一个带有 Excel 公式的已定义表达式:

毛坯类型条件表达式
是空白()LEN(修剪( <cell address>))=0
非空白()镜头(修剪(<cell address>))>0

<cell address>始终引用此条件格式规则的单元格区域中的左上角单元格。

错误向导

Blanks向导一样,此向导用于定义简单的布尔状态规则,以确定具有公式值的单元格是否导致错误。无论是使用规则类型为Wizard::ERRORS或的向导工厂创建的,都会返回Wizard::NOT_ERRORS相同的向导。Errors唯一的区别是,在一种情况下,规则状态是为 预设的CONDITION_CONTAINSERRORS,在另一种情况下,它是为 预设的CONDITION_NOTCONTAINSERRORSisError()但是,您可以使用andnotError()方法在两个规则之间切换;并且仅在您调用时getConditional()才会根据向导的当前状态返回条件。

条件类型向导工厂 newRule() 类型常量条件运算符类型向导方法笔记
有条件的::CONDITION_CONTAINSERRORS向导::错误-错误()默认状态
没有错误()
有条件的::CONDITION_NOTCONTAINSERRORS向导::NOT_ERRORS-没有错误()默认状态
错误()

以下代码显示了用于创建错误和非错误条件的相同错误向导,使用预定义的$redStyle样式对象用于错误,使用预定义的$greenStyle样式对象用于非错误。

$cellRange = 'C2:C6';
$conditionalStyles = [];
$wizardFactory = new Wizard($cellRange);
/** @var Wizard\Errors $errorsWizard */
$errorsWizard = $wizardFactory->newRule(Wizard::ERRORS);

$errorsWizard->setStyle($redStyle);
$conditionalStyles[] = $errorsWizard->getConditional();

$errorsWizard->notError()
    ->setStyle($greenStyle);
$conditionalStyles[] = $errorsWizard->getConditional();

$spreadsheet->getActiveSheet()
    ->getStyle($errorsWizard->getCellRange())
    ->setConditionalStyles($conditionalStyles);

此示例也可以在repo的代码示例中找到。

错误向导方法不需要操作数/值;但返回的 Conditional 包含一个带有 Excel 公式的已定义表达式:

毛坯类型条件表达式
错误()错误(<cell address>
没有错误()非(ISERROR(<cell address>))

<cell address>始终引用此条件格式规则的单元格区域中的左上角单元格。

重复/唯一向导

此向导用于定义简单的布尔状态规则,以确定单元格值是否与条件单元格范围内具有相同值的任何其他单元格匹配,或者该值在该单元格范围内是否唯一。它只有在应用于一系列单元格时才有意义,而不是应用于单个单元格。无论是使用规则类型为Wizard::DUPLICATES或的向导工厂创建的,都会返回Wizard::UNIQUE相同的向导。Duplicates唯一的区别是,在一种情况下,规则状态是为 预设的CONDITION_DUPLICATES,在另一种情况下,它是为 预设的CONDITION_UNIQUEduplicates()但是,您可以使用andunique()方法在两个规则之间切换;并且仅在您调用时getConditional()才会根据向导的当前状态返回条件。

条件类型向导工厂 newRule() 类型常量条件运算符类型向导方法笔记
有条件的::CONDITION_DUPLICATES向导::重复-重复()默认状态
独特的()
有条件的::CONDITION_UNIQUE向导::唯一-独特的()默认状态
重复()

以下代码显示了用于创建空白和非空白条件的相同重复向导,使用预定义的$redStyle样式对象用于空白,以及使用预定义的$greenStyle样式对象用于非空白。

$cellRange = 'A2:E6';
$conditionalStyles = [];
$wizardFactory = new Wizard($cellRange);
/** @var Wizard\Duplicats $duplicatesWizard */
$duplicatesWizard = $wizardFactory->newRule(Wizard::DUPLICATES);

$duplicatesWizard->setStyle($redStyle);
$conditionalStyles[] = $duplicatesWizard->getConditional();

$duplicatesWizard->unique()
    ->setStyle($greenStyle);
$conditionalStyles[] = $duplicatesWizard->getConditional();

$spreadsheet->getActiveSheet()
    ->getStyle($duplicatesWizard->getCellRange())
    ->setConditionalStyles($conditionalStyles);

此示例也可以在repo的代码示例中找到。

重复/唯一条件仅由 Excel 中的条件类型标识,没有运算符,也没有表达式。

表达式向导

Expression向导期望提供一个表达式,一个 MS Excel 公式,其计算结果为假或真。

条件类型向导工厂 newRule() 类型常量条件运算符类型向导方法笔记
条件::CONDITION_EXPRESSIONWizard::EXPRESSION 或 Wizard::FORMULA-表达()参数是一个 Excel 公式,计算结果为真或假
公式()

作为一个简单的例子,这里有一个代码片段演示了确定单元格是否包含奇数或偶数值的表达式:

$cellRange = 'A2:C11';
$conditionalStyles = [];
$wizardFactory = new Wizard($cellRange);
/** @var Wizard\Expression $expressionWizard */
$expressionWizard = $wizardFactory->newRule(Wizard::EXPRESSION);

$expressionWizard->expression('ISODD(A1)')
    ->setStyle($greenStyle);
$conditionalStyles[] = $expressionWizard->getConditional();

$expressionWizard->expression('ISEVEN(A1)')
    ->setStyle($yellowStyle);
$conditionalStyles[] = $expressionWizard->getConditional();

$spreadsheet->getActiveSheet()
    ->getStyle($expressionWizard->getCellRange())
    ->setConditionalStyles($conditionalStyles);

此示例也可以在repo的代码示例中找到。

作为一个更复杂的示例,让我们看一下销售网格,并使用条件格式突出显示“美国”地区的销售情况:

$greenStyleMoney = clone $greenStyle;
$greenStyleMoney->getNumberFormat()->setFormatCode(NumberFormat::FORMAT_ACCOUNTING_USD);

$cellRange = 'A17:D22';
$conditionalStyles = [];
$wizardFactory = new Wizard($cellRange);
/** @var Wizard\Expression $expressionWizard */
$expressionWizard = $wizardFactory->newRule(Wizard::EXPRESSION);

$expressionWizard->expression('$C1="USA"')
    ->setStyle($greenStyleMoney);
$conditionalStyles[] = $expressionWizard->getConditional();

$spreadsheet->getActiveSheet()
    ->getStyle($expressionWizard->getCellRange())
    ->setConditionalStyles($conditionalStyles);

此示例也可以在repo的代码示例中找到。

或者我们可以在同一个表达式中应用多重比较,以便检查“第四季度”中“美国”地区的所有销售额,使用 Excel 将它们组合起来AND()

$expressionWizard->expression('AND($C1="USA",$D1="Q4")')
    ->setStyle($greenStyleMoney);

此示例也可以在repo的代码示例中找到。

一般注意事项

如果为真则停止

更改单元格范围

如果您想将相同的条件规则/样式应用于电子表格上的多个不同区域,则可以使用setCellRange()调用之间的方法来执行此操作getConditional()

$wizardFactory = new Wizard();
/** @var Wizard\CellValue $wizard */
$wizard = $wizardFactory->newRule(Wizard::CELL_VALUE);

// Apply the wizard conditional to cell range A2:A10
$cellRange = 'A2:A10';
$conditionalStyles = [];
$wizard->between('$B1', Wizard::VALUE_TYPE_CELL)
    ->and('$C1', Wizard::VALUE_TYPE_CELL)
    ->setStyle($greenStyle);

$spreadsheet->getActiveSheet()
    ->getStyle($wizard->getCellRange())
    ->setConditionalStyles($conditionalStyles);

// Apply the same wizard conditional to cell range E2:E10
$cellRange = 'E2:E10';
$wizard->setCellRange($cellRange);
$conditionalStyles = [];
$wizard->between('$B1', Wizard::VALUE_TYPE_CELL)
    ->and('$C1', Wizard::VALUE_TYPE_CELL)
    ->setStyle($greenStyle);

$spreadsheet->getActiveSheet()
    ->getStyle($wizard->getCellRange())
    ->setConditionalStyles($conditionalStyles);

因为我们使用单元格A1作为相对引用的基线单元格,向导能够处理单元格引用和公式的必要调整,以匹配getConditional()调用时应用的单元格范围,因此它返回正确的表达式。

将条件转换为向导

如果你已经有一个Conditional对象;您可以从该条件创建一个向导,以使用向导的所有好处来操作它,然后再使用它来创建条件的新版本:

$wizard = Wizard\CellValue::fromConditional($conditional, '$A$3:$E$8');
$wizard->greaterThan(12.5);

$newConditional = $wizard->getConditional();

如果您知道要转换的条件类型,那就可以了;但如果 Conditional 不是适当的类型(即不是 a cellIs),它将抛出异常。

如果你不知道它是什么类型的 Conditional,那么最好改用 Wizard FactoryfromConditional()方法;然后测试返回什么类型的 Wizard 对象:

$wizard = Wizard::fromConditional($conditional, '$A$3:$E$8');
if ($wizard instanceof Wizard\CellValue) {
    $wizard->greaterThan(12.5);

    $newConditional = $wizard->getConditional();
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值