发新帖

[PHP] PHPExcel读取单元格下拉值

零下一度 12小时前 6
//获取单元格类型
function parseDropdownSource($objPHPExcel, $cellAddress) {
    $sheet = $objPHPExcel->getActiveSheet();
    $cell = $sheet->getCell($cellAddress);
    $objValidation = $cell->getDataValidation();
    $formula1 = $objValidation->getFormula1();
    if ($objValidation->getType() != \PHPExcel_Cell_DataValidation::TYPE_LIST) {
        return ['type' => 'unknown','source'=>$formula1, 'message' => '不是下拉列表类型'];
    } 
    
    // 判断类型
    if (strpos($formula1, ',') !== false && strpos($formula1, '!') === false) {
        // 情况1: 内联列表
        return [
            'type' => 'inline_list',
            'source' => $formula1,
            'values' => explode(',', trim($formula1, '"'))
        ];
    }
    elseif (strpos($formula1, '!') !== false && strpos($formula1, ':') !== false) {
        // 情况2: 跨工作表区域
        list($sheet,$range) = explode('!', $formula1);
        $sheet = trim($sheet,"'");
        $targetSheet = $objPHPExcel->getSheetByName($sheet);
        // 获取目标工作表
    if (!$targetSheet) {
            $error = '工作表不存在';  // 工作表不存在
        }
        $range = str_replace('$', '',$range);
        $data = $targetSheet->rangeToArray($range, NULL, TRUE, TRUE,TRUE);
        return [
            'type' => 'cross_sheet_range',
            'source' => $formula1,
            'sheet' => $sheet,
            'range' => $range,
        'error' => $error,
        'data' => $data
        ];
    }
    elseif (strpos($formula1, ':') !== false) {
        // 情况3: 同工作表区域
        return [
            'type' => 'same_sheet_range',
            'source' => $formula1,
            'range' => $formula1
        ];
    }
    elseif (preg_match('/^[\$]?[A-Z]+[\$]?\d+$/', $formula1)) {
        // 情况4: 单个单元格
        return [
            'type' => 'single_cell',
            'source' => $formula1,
            'cell' => $formula1
        ];
    }
    else {
        // 情况5: 可能是命名范围
        return [
            'type' => 'named_range',
            'source' => $formula1,
            'name' => $formula1
        ];
    }
}
最新回复 (0)
返回
零下一度
主题数
982
帖子数
0
注册排名
1