39_Dropdown.php
3.9 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
<?php
use PhpOffice\PhpSpreadsheet\Cell\DataValidation;
use PhpOffice\PhpSpreadsheet\NamedRange;
use PhpOffice\PhpSpreadsheet\Spreadsheet;
require __DIR__ . '/../Header.php';
// Create new Spreadsheet object
$helper->log('Create new Spreadsheet object');
$spreadsheet = new Spreadsheet();
// Set document properties
$helper->log('Set document properties');
$spreadsheet->getProperties()
->setCreator('PHPOffice')
->setLastModifiedBy('PHPOffice')
->setTitle('PhpSpreadsheet Test Document')
->setSubject('PhpSpreadsheet Test Document')
->setDescription('Test document for PhpSpreadsheet, generated using PHP classes.')
->setKeywords('Office PhpSpreadsheet php')
->setCategory('Test result file');
function transpose($value)
{
return [$value];
}
// Add some data
$continentColumn = 'D';
$column = 'F';
// Set data for dropdowns
$continents = glob(__DIR__ . '/data/continents/*');
foreach ($continents as $key => $filename) {
$continent = pathinfo($filename, PATHINFO_FILENAME);
$helper->log("Loading $continent");
$continent = str_replace(' ', '_', $continent);
$countries = file($filename, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
$countryCount = count($countries);
// Transpose $countries from a row to a column array
$countries = array_map('transpose', $countries);
$spreadsheet->getActiveSheet()
->fromArray($countries, null, $column . '1');
$spreadsheet->addNamedRange(
new NamedRange(
$continent,
$spreadsheet->getActiveSheet(),
$column . '1:' . $column . $countryCount
)
);
$spreadsheet->getActiveSheet()
->getColumnDimension($column)
->setVisible(false);
$spreadsheet->getActiveSheet()
->setCellValue($continentColumn . ($key + 1), $continent);
++$column;
}
// Hide the dropdown data
$spreadsheet->getActiveSheet()
->getColumnDimension($continentColumn)
->setVisible(false);
$spreadsheet->addNamedRange(
new NamedRange(
'Continents',
$spreadsheet->getActiveSheet(),
$continentColumn . '1:' . $continentColumn . count($continents)
)
);
// Set selection cells
$spreadsheet->getActiveSheet()
->setCellValue('A1', 'Continent:');
$spreadsheet->getActiveSheet()
->setCellValue('B1', 'Select continent');
$spreadsheet->getActiveSheet()
->setCellValue('B3', '=' . $column . 1);
$spreadsheet->getActiveSheet()
->setCellValue('B3', 'Select country');
$spreadsheet->getActiveSheet()
->getStyle('A1:A3')
->getFont()->setBold(true);
// Set linked validators
$validation = $spreadsheet->getActiveSheet()
->getCell('B1')
->getDataValidation();
$validation->setType(DataValidation::TYPE_LIST)
->setErrorStyle(DataValidation::STYLE_INFORMATION)
->setAllowBlank(false)
->setShowInputMessage(true)
->setShowErrorMessage(true)
->setShowDropDown(true)
->setErrorTitle('Input error')
->setError('Continent is not in the list.')
->setPromptTitle('Pick from the list')
->setPrompt('Please pick a continent from the drop-down list.')
->setFormula1('=Continents');
$spreadsheet->getActiveSheet()
->setCellValue('A3', 'Country:');
$spreadsheet->getActiveSheet()
->getStyle('A3')
->getFont()->setBold(true);
$validation = $spreadsheet->getActiveSheet()
->getCell('B3')
->getDataValidation();
$validation->setType(DataValidation::TYPE_LIST)
->setErrorStyle(DataValidation::STYLE_INFORMATION)
->setAllowBlank(false)
->setShowInputMessage(true)
->setShowErrorMessage(true)
->setShowDropDown(true)
->setErrorTitle('Input error')
->setError('Country is not in the list.')
->setPromptTitle('Pick from the list')
->setPrompt('Please pick a country from the drop-down list.')
->setFormula1('=INDIRECT($B$1)');
$spreadsheet->getActiveSheet()->getColumnDimension('A')->setWidth(12);
$spreadsheet->getActiveSheet()->getColumnDimension('B')->setWidth(30);
// Save
$helper->write($spreadsheet, __FILE__);