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

如何使用PhpSpreadsheet读取Xlsx文件中的下拉列表值

解决PhpSpreadsheet读取Excel下拉菜单选项的问题

首先要明确Excel下拉菜单(数据验证)的选项分为两种存储形式,需针对性解析:

  • 静态直接定义的选项列表,格式为带双引号的逗号分隔字符串
  • 引用单元格区域的动态选项,格式为单元格范围表达式

以下是可直接运行的完整代码:

$inputFileName = 'file.xlsx';
$spreadsheet = \PhpOffice\PhpSpreadsheet\IOFactory::load($inputFileName);
$sheet = $spreadsheet->getSheet(2);

$cell = $sheet->getCell('F3');
$validation = $cell->getDataValidation();

// 仅处理列表类型的数据验证
if ($validation->getType() === \PhpOffice\PhpSpreadsheet\Cell\DataValidation::TYPE_LIST) {
    $formula1 = $validation->getFormula1();
    $options = [];

    // 处理静态选项列表
    if (str_starts_with($formula1, '"')) {
        $optionsStr = trim($formula1, '"');
        $options = explode(',', $optionsStr);
    } 
    // 处理单元格区域引用的动态选项
    else {
        $rangeParts = \PhpOffice\PhpSpreadsheet\Cell\Coordinate::splitRange($formula1);
        foreach ($rangeParts as $range) {
            [$startCell, $endCell] = $range;
            $cellRefs = \PhpOffice\PhpSpreadsheet\Cell\Coordinate::extractAllCellReferencesInRange($startCell, $endCell);
            
            foreach ($cellRefs as $cellRef) {
                // 处理跨工作表引用
                if (str_contains($cellRef, '!')) {
                    [$sheetName, $cellAddr] = explode('!', $cellRef);
                    $targetSheet = $spreadsheet->getSheetByName(ltrim($sheetName, "'"));
                    $options[] = $targetSheet->getCell($cellAddr)->getValue();
                } else {
                    $options[] = $sheet->getCell($cellRef)->getValue();
                }
            }
        }
    }

    // 输出获取到的下拉选项
    print_r($options);
}

核心要点

  • 先通过getType()过滤出列表类型的数据验证,避免无效处理
  • 静态选项需去除首尾双引号后拆分字符串
  • 区域引用借助Coordinate工具类解析单元格范围,同时兼容跨工作表的引用场景

内容的提问来源于stack exchange,提问作者Attilio Di Pompeo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 06:40:42