//获取单元格类型
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
];
}
}