Excel 中列格式 (mm/dd/yyyy) 的验证要求

问题描述 投票:0回答:1

我有一个 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);
php excel
1个回答
0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.