2014-07-14 106 views
8

我想在依賴的phpexcel中設置多個下拉列表。基本上,當您在列A的下拉列表中選擇一個值時,它會在列B的下拉列表中加載不同的內容。PHPExcel多個下拉列表,依賴於

我能夠在單元格上舒適地設置下拉列表。我試圖找出如何基於選擇一個下拉列表來加載內容。

任何意見或解決方案或指導將不勝感激

+0

你能想出如何在MS Excel本身實現你想要的? –

+1

是的。找到這個方便的指南http://www.excel-easy.com/examples/dependent-drop-down-lists.html –

回答

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! 

現在的下拉列表根據國家加載城市。這使用稱爲間接的Excel函數。基本上返回選定的值。因此具有相似的命名範圍。所以我選擇「英國」,它加載了名爲「英國」的範圍,其中有英國的城市。

$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或默認保存下拉菜單。祝一切順利。

+3

謝謝你提供了一個詳細的答案,如果他們問同樣的問題,指出其他人將會很有用;我將嘗試在下一個版本的PHPExcel –

+0

中提供一個示例@MarkBaker先生,我如何將我的數組傳遞給它。我從數據庫中提取數據並想將其導出爲ex​​cel。我怎樣才能通過這個數組。 – Mukesh

0

偉大的答案,只是一個小東西來解決:

當傳遞getCell細胞('A1') - > getDataValidation()應當'A0'代替。 getCell('B1') - > getDataValidation();應該是'B0'以防止選擇和數據之間的衝突。

編輯:如果我想讓城市也成爲一個列表並依賴於另一個名爲neighborhoods的列表,該怎麼辦?

非常感謝!