如何为PHP PEAR生成的Excel添加单元格数值离线验证?
实现Excel单元格离线验证与上传后验证方案
一、生成带离线单元格验证的Excel
你用的Spreadsheet_Excel_Writer自带数据验证功能,直接通过addValidation方法给单元格设置Excel内置规则,用户离线填写时Excel会自动校验输入,不用依赖PHP。
修改你的生成代码如下:
require_once 'Spreadsheet/Excel/Writer.php'; $workbook = new Spreadsheet_Excel_Writer(); $filename = "Validate.xls"; $workbook->send($filename); $worksheet =& $workbook->addWorksheet('Number validation'); // 写入表头 $worksheet->write(0, 0, 'S/N'); $worksheet->write(0, 1, 'VALUE 1'); // 对应需求的cell1 $worksheet->write(0, 2, 'VALUE 2'); // 对应cell2 $worksheet->write(0, 3, 'VALUE 3'); // 对应cell3 // 写入初始值 $worksheet->write(1, 0, '1'); $worksheet->write(1, 1, '0'); $worksheet->write(1, 2, '0'); $worksheet->write(1, 3, '0'); // 给单元格设置离线验证规则 // Cell1(B2,行1列1):最大值5 $worksheet->addValidation(1, 1, 1, 1, 'decimal', // 数据类型为数值 'between', // 验证规则:介于指定范围 0, 5, // 最小值0,最大值5 null, null, '输入错误', // 错误提示标题 '请输入0-5之间的数值' // 输入提示内容 ); // Cell2(C2,行1列2):最大值10 $worksheet->addValidation(1, 2, 1, 2, 'decimal', 'between', 0, 10, null, null, '输入错误', '请输入0-10之间的数值' ); // Cell3(D2,行1列3):最大值15 $worksheet->addValidation(1, 3, 1, 3, 'decimal', 'between', 0, 15, null, null, '输入错误', '请输入0-15之间的数值' ); $workbook->close();
这样用户在Excel里输入超出范围的值时,会直接弹出错误提示,实现离线验证。
二、上传Excel后的服务器端验证
用户上传填写好的文件后,需要读取Excel内容并结合PEAR Validate做服务器端校验(防止用户绕过Excel验证)。这里需要用到Spreadsheet_Excel_Reader包来读取文件:
require_once 'Spreadsheet/Excel/Reader.php'; require_once 'Validate.php'; // 读取上传的临时文件 $reader = new Spreadsheet_Excel_Reader(); $reader->read($_FILES['excel_file']['tmp_name']); // 取第一个工作表的数据(Excel行号从1开始) $worksheet = $reader->sheets[0]; $targetRow = 2; // 对应之前填写的行 // 验证Cell1(B2) $cell1Val = $worksheet['cells'][$targetRow][2]; $cell1Valid = Validate::number($cell1Val, [ 'decimal' => '.', 'dec_prec' => 4, 'max' => 5 // 直接设置最大值限制 ]); // 验证Cell2(C2) $cell2Val = $worksheet['cells'][$targetRow][3]; $cell2Valid = Validate::number($cell2Val, [ 'decimal' => '.', 'dec_prec' => 4, 'max' => 10 ]); // 验证Cell3(D2) $cell3Val = $worksheet['cells'][$targetRow][4]; $cell3Valid = Validate::number($cell3Val, [ 'decimal' => '.', 'dec_prec' => 4, 'max' => 15 ]); // 输出验证结果 if (!$cell1Valid) { echo "VALUE 1 无效:必须是不超过5的数值"; } elseif (!$cell2Valid) { echo "VALUE 2 无效:必须是不超过10的数值"; } elseif (!$cell3Valid) { echo "VALUE 3 无效:必须是不超过15的数值"; } else { echo "所有数据验证通过"; }
注意事项
- 离线验证仅在Excel软件中生效,用户用其他工具修改可能绕过,所以服务器端验证必须做
- 确保PEAR的
Spreadsheet_Excel_Writer、Spreadsheet_Excel_Reader、Validate三个包都已正确安装配置
内容的提问来源于stack exchange,提问作者Dan
相关产品推荐
相关产品推荐

