zhaojs
2023-07-31 0de015249a3abe05031eb4f5d988e8eb7ef83c87
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__);