PHPExcel多个下拉列表依赖

时间:2014-07-14 15:27:39

标签: php phpexcel

我正在尝试在依赖的phpexcel中设置多个下拉列表。基本上,当您在A列的下拉列表中选择一个值时,它会在B列的下拉列表中加载不同的内容。

我能够轻松地在单元格上设置下拉列表。我试图找出如何根据一个下拉列表的选择加载内容。

非常感谢任何反馈或解决方案或指南

2 个答案:

答案 0 :(得分:10)

我设法搞清楚了。这是未来任何人的要点:

最好使用命名范围。基本上在单元格中定义列表项(命名范围)。这可以在不同的工作表上。所以,让我们举一个国家和城市的例子。下拉1将有县,下拉2将有城市。因此,定义命名范围。一个将被称为国家。其他两个命名范围将在国家名称后面调用。所以,我们走吧。

$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'
        ) 
    );

那就是命名范围。一个是国家,另一个是每个国家的城市范围。现在加载第一个下拉列表以选择国家。

$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!

现在根据国家/地区的下拉列表加载城市。这使用名为Indirect的excel函数。基本上返回选定的值。因此命名相似的范围。所以我选择" UK",它加载名为" UK"有英国城市。

$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)'); 

注意:我使用过两张纸。工作表1用于保存数据和工作表0或默认用于保存下拉列表。一切顺利。

答案 1 :(得分:0)

很好的答案,只需要修理一件小事:

在getCell中传递单元格时(' A1' ) - > getDataValidation()它应该是' A0' 代替。 getCell相同(' B1' ) - > getDataValidation();应该' B0' 以防止选择和数据之间的冲突。

编辑:如果我想让城市也成为一个列表并依赖于另一个名为邻里的列表,该怎么办?

非常感谢!