我有一个 Excel 工作表,我需要在其中对特定列应用验证。所需的日期格式为“mm/dd/yyyy”。如果用户以不正确的格式输入值,例如“dd/mm/yyyy”、文本、“dd/mm”或“mm/dd”,则验证应以红色突出显示相应的单元格。
当我尝试下面的代码时,在单元格中输入文本时验证会起作用。但是,如果我仅输入“mm/dd”或“dd/mm”,则不会触发验证。我附上了截图供您参考。
我需要的是,当输入“text”或“dd/mm”或“mm/dd”等值时,验证以红色突出显示文本。
提前致谢。
$sheet = $objPHPExcel->getActiveSheet();
$sheet->setTitle('Sheet1');
// Apply bold styling to headers
$sheet->getStyle('A1:J1')->getFont()->setBold(true);
// Define conditional formatting rules for the "Assessment Date" column (F2:F1000)
// Rule for invalid dates (Highlight cells that are not in MM/DD/YYYY format)
$conditionalInvalid = new Conditional();
$conditionalInvalid->setConditionType(Conditional::CONDITION_EXPRESSION)
->setOperatorType(Conditional::OPERATOR_NONE)
->addCondition('=AND(F2<>"", NOT(ISNUMBER(DATEVALUE(F2))))');
$conditionalInvalid->getStyle()->getFont()->setColor(new Color(Color::COLOR_RED));
$conditionalInvalid->getStyle()->getFill()->setFillType(Fill::FILL_SOLID)->getStartColor()->setARGB('FFFFC7CE'); // Light pink background
// Rule for valid MM/DD/YYYY dates (No background highlight)
$conditionalValid = new Conditional();
$conditionalValid->setConditionType(Conditional::CONDITION_EXPRESSION)
->setOperatorType(Conditional::OPERATOR_NONE)
->addCondition('=AND(F2<>"", ISNUMBER(DATEVALUE(F2)))');
$conditionalValid->getStyle()->getFont()->setColor(new Color(Color::COLOR_BLACK));
$conditionalValid->getStyle()->getFill()->setFillType(Fill::FILL_SOLID)->getStartColor()->setARGB('FFFFFFFF'); // No background color
// Apply the conditional formatting rules
$conditionalStyles = $sheet->getStyle('F2:F1000')->getConditionalStyles();
$conditionalStyles[] = $conditionalInvalid;
$conditionalStyles[] = $conditionalValid;
$sheet->getStyle('F2:F1000')->setConditionalStyles($conditionalStyles);
DATEVALUE()
将任何日期格式视为有效。您需要使用强制执行您想要的日期格式的内容来验证该值。
Microsoft 现在拥有正则表达式函数,因此您可以使用以下公式强制执行日期格式。
您需要使用的函数是REGEXTEST,文档如下: https://support.microsoft.com/en-au/office/regextest-function-7d38200b-5e5c-4196-b4e6-9bff73afbd31
您可以使用以下正则表达式来检测 MM/DD/YYYY 日期格式。
[0-1][0-9]/[0-3][0-9]/[0-9]{4}
基本上,它只是确保字符串位置中的每个字符对于该格式都是可能的。
它可以像这样应用于您的条件:
// Invalid conditional
// Formula: =AND(F2<>"", NOT(AND(REGEXTEST(F2, "^[0-1][0-9]/[0-3][0-9]/[0-9]{4}$"), ISNUMBER(DATEVALUE(F2)))))
$conditionalInvalid->setConditionType(Conditional::CONDITION_EXPRESSION)
->setOperatorType(Conditional::OPERATOR_NONE)
->addCondition('=AND(F2<>"", NOT(AND(REGEXTEST(F2, "^[0-1][0-9]/[0-3][0-9]/[0-9]{4}$"), ISNUMBER(DATEVALUE(F2)))))');
// Valid conditional
// Formula: =AND(F2<>"", NOT(AND(REGEXTEST(F2, "^[0-1][0-9]/[0-3][0-9]/[0-9]{4}$"), ISNUMBER(DATEVALUE(F2)))))
$conditionalValid->setConditionType(Conditional::CONDITION_EXPRESSION)
->setOperatorType(Conditional::OPERATOR_NONE)
->addCondition('=AND(F2<>"", REGEXTEST(F2, "^[0-1][0-9]/[0-3][0-9]/[0-9]{4}$"), ISNUMBER(DATEVALUE(F2)))');
这里发生的事情本质上是,新的条件检查单元格是否为空,正则表达式模式是否与 MM/DD/YYYY 格式匹配,以及它是否是有效日期。
请记住,如果单元格格式不是
TEXT
,Excel 将自动删除月份和日期字段中的任何前导 0,因此当用户单击时,01/01/2000
将变为 1/1/2000
。