1 回答

TA貢獻1824條經驗 獲得超5個贊
表單事件的實現可能相當混亂,很難找到示例,所以當我看到這樣的帖子時,我會嘗試伸出援手。首先,我會說您真的應該查看這些附加功能的PHPSpreadsheet 文檔。在這里您可以找到所需的重要信息。然后你可以翻譯你在Laravel Excel中使用的內容。
PHPSpreadsheet:在單元格上設置數據驗證 https://phpspreadsheet.readthedocs.io/en/latest/topics/recipes/#setting-data-validation-on-a-cell
這是一個基于您現有文件的示例。我還加入了一些額外的格式來自動調整列寬——我認為這是必須的。
namespace App\Exports;
use Maatwebsite\Excel\Concerns\FromCollection;
use Maatwebsite\Excel\Concerns\WithHeadings;
use Maatwebsite\Excel\Concerns\WithStrictNullComparison;
use Maatwebsite\Excel\Concerns\WithEvents;
use Maatwebsite\Excel\Events\AfterSheet;
use PhpOffice\PhpSpreadsheet\Cell\Coordinate;
use PhpOffice\PhpSpreadsheet\Cell\DataValidation;
class ActionItemExport implements FromCollection, WithHeadings, WithEvents, WithStrictNullComparison
{
protected $results;
public function collection()
{
// store the results for later use
$this->results = $this->getActionItems();
return $this->results;
}
// ...
public function registerEvents(): array
{
return [
// handle by a closure.
AfterSheet::class => function(AfterSheet $event) {
// get layout counts (add 1 to rows for heading row)
$row_count = $this->results->count() + 1;
$column_count = count($this->results[0]->toArray());
// set dropdown column
$drop_column = 'A';
// set dropdown options
$options = [
'option 1',
'option 2',
'option 3',
];
// set dropdown list for first data row
$validation = $event->sheet->getCell("{$drop_column}2")->getDataValidation();
$validation->setType(DataValidation::TYPE_LIST );
$validation->setErrorStyle(DataValidation::STYLE_INFORMATION );
$validation->setAllowBlank(false);
$validation->setShowInputMessage(true);
$validation->setShowErrorMessage(true);
$validation->setShowDropDown(true);
$validation->setErrorTitle('Input error');
$validation->setError('Value is not in list.');
$validation->setPromptTitle('Pick from list');
$validation->setPrompt('Please pick a value from the drop-down list.');
$validation->setFormula1(sprintf('"%s"',implode(',',$options)));
// clone validation to remaining rows
for ($i = 3; $i <= $row_count; $i++) {
$event->sheet->getCell("{$drop_column}{$i}")->setDataValidation(clone $validation);
}
// set columns to autosize
for ($i = 1; $i <= $column_count; $i++) {
$column = Coordinate::stringFromColumnIndex($i);
$event->sheet->getColumnDimension($column)->setAutoSize(true);
}
},
];
}
}
- 1 回答
- 0 關注
- 398 瀏覽
添加回答
舉報