PhpSpreadsheet单元格验证规则以禁止无效输入

时间:2019-07-14 15:29:06

标签: php excel laravel phpspreadsheet

我正在Laravel应用程序中使用PhpSpreadsheet来输出需要对其进行相当严格控制的电子表格,以便允许在输入数据后将同一电子表格重新输入到应用程序中。

我可以控制数据类型,甚至当用户输入不正确的类型(例如:

enter image description here

但是,一旦用户单击“确定”或“取消”,则格式错误的文本将保留在单元格中。 是否有一种方法不仅可以为用户标记它,而且可以完全禁止不正确的输入

当前示例代码:

if($sub['type'] === 'date') {
    $ws->getStyle('C' . $row)->getNumberFormat()->setFormatCode(
        \PhpOffice\PhpSpreadsheet\Style\NumberFormat::FORMAT_DATE_DMYSLASH
    );
    $objValidation = $ws->getCell('C' . $row)->getDataValidation();
    $objValidation->setType(\PhpOffice\PhpSpreadsheet\Cell\DataValidation::TYPE_DATE);
    $objValidation->setErrorStyle(\PhpOffice\PhpSpreadsheet\Cell\DataValidation::STYLE_INFORMATION);
    $objValidation->setAllowBlank(true);
    $objValidation->setShowInputMessage(true);
    $objValidation->setShowErrorMessage(true);
    $objValidation->setShowDropDown(true);
    $objValidation->setErrorTitle('Input error');
    $objValidation->setError('Please enter a date in the format d/m/yy only.');
}

我想我已经错过了PhpSpreadsheet手册中的某些内容?我已经在诸如setAllowBlank之类的某些方法上研究了基本代码,但我可能找不到合适的位置。

2 个答案:

答案 0 :(得分:1)

为什么在验证错误后不清空单元格,所以出现isValid function。代码如下:

if(! PhpOffice\PhpSpreadsheet\Cell\DataValidator::isValid($yourCell)){
    $yourCell->setValue("");
}

答案 1 :(得分:0)

我仍然在文档中找不到这个(尽管我确定它在某处)。但是,一旦我能够找出 PhpSpreadsheet 代码的位置,就可以找到它。 PhpSpreadsheet 的非常优雅的解决方案...在我正在研究的基本代码领域中,我只是看不到它!

轻松解决,只需更改一个词:

$objValidation->setErrorStyle(\PhpOffice\PhpSpreadsheet\Cell\DataValidation::STYLE_INFORMATION);

成为:

$objValidation->setErrorStyle(\PhpOffice\PhpSpreadsheet\Cell\DataValidation::STYLE_STOP);

大'!'弹出窗口上的提示给了我一个提示,让他们看看他们的样式代码而不是命令代码。这将弹出相同的框,但带有'X'并防止更改无效的单元格,这正是我想要的。

希望以后能帮助别人。