You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 12:40:30