Well I managed to figure it out. Here's the gist for anyone in the future:
Best to use Named Ranges. Basically define before hand the list items (named ranges) in cells. this can be on a different worksheet. So, lets use an example of countries and cities. dropdown 1 will have counties, dropdown 2 will have cities. So define the named ranges. One will be called countries. the other two named ranges will be called after the name of the countries. so, lets go.
$objPHPExcel->getSheetByName('Worksheet 1')->SetCellValue("A1", "UK");
$objPHPExcel->getSheetByName('Worksheet 1')->SetCellValue("A2", "USA");
$objPHPExcel->addNamedRange(
new PHPExcel_NamedRange(
'countries',
$objPHPExcel->getSheetByName('Worksheet 1'),
'A1:A2'
)
);
$objPHPExcel->getSheetByName('Worksheet 1')->SetCellValue("B1", "London");
$objPHPExcel->getSheetByName('Worksheet 1')->SetCellValue("B2", "Birmingham");
$objPHPExcel->getSheetByName('Worksheet 1')->SetCellValue("B3", "Leeds");
$objPHPExcel->addNamedRange(
new PHPExcel_NamedRange(
'UK',
$objPHPExcel->getSheetByName('Worksheet 1'),
'B1:B3'
)
);
$objPHPExcel->getSheetByName('Worksheet 1')->SetCellValue("C1", "Atlanta");
$objPHPExcel->getSheetByName('Worksheet 1')->SetCellValue("C2", "New York");
$objPHPExcel->getSheetByName('Worksheet 1')->SetCellValue("C3", "Los Angeles");
$objPHPExcel->addNamedRange(
new PHPExcel_NamedRange(
'USA',
$objPHPExcel->getSheetByName('Worksheet 1'),
'C1:C3'
)
);
So thats the named ranges. One is the country, the others are the ranges for the cities for each of the countries. Now to load up the first dropdown to select the countries.
$objValidation = $objPHPExcel->getActiveSheet()->getCell('A1')->getDataValidation();
$objValidation->setType( PHPExcel_Cell_DataValidation::TYPE_LIST );
$objValidation->setErrorStyle( PHPExcel_Cell_DataValidation::STYLE_INFORMATION );
$objValidation->setAllowBlank(false);
$objValidation->setShowInputMessage(true);
$objValidation->setShowErrorMessage(true);
$objValidation->setShowDropDown(true);
$objValidation->setErrorTitle('Input error');
$objValidation->setError('Value is not in list.');
$objValidation->setPromptTitle('Pick from list');
$objValidation->setPrompt('Please pick a value from the drop-down list.');
$objValidation->setFormula1("=countries"); //note this!
Now for the dropdown to load the cities depending on the country. This uses an excel function called Indirect. Basically returns the selected value. hence the similarly named ranges. so i select "UK", it loads the named range called "UK" which has the UK cities.
$objValidation = $objPHPExcel->getActiveSheet()->getCell('B1')->getDataValidation();
$objValidation->setType( PHPExcel_Cell_DataValidation::TYPE_LIST );
$objValidation->setErrorStyle( PHPExcel_Cell_DataValidation::STYLE_INFORMATION );
$objValidation->setAllowBlank(false);
$objValidation->setShowInputMessage(true);
$objValidation->setShowErrorMessage(true);
$objValidation->setShowDropDown(true);
$objValidation->setErrorTitle('Input error');
$objValidation->setError('Value is not in list.');
$objValidation->setPromptTitle('Pick from list');
$objValidation->setPrompt('Please pick a value from the drop-down list.');
$objValidation->setFormula1('=INDIRECT($A$1)');
Notes: I have used two sheets. Worksheet 1 to hold the data and sheet 0 or default to hold the dropdowns. All the best.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…