为了账号安全,请及时绑定邮箱和手机立即绑定

maatwebsite laravel excel 导出列与下拉列表

maatwebsite laravel excel 导出列与下拉列表

PHP
呼啦一阵风 2022-05-27 14:56:39
我一直在使用Laravel Excel以 csv 格式导出数据,到目前为止效果很好。现在我需要以 xlsx 格式导出,以便可以在某些列中包含下拉列表。我看过这个问题,但看起来这是针对旧版本的 Laravel Excel。我还查看了文档中解释扩展包的页面,但我似乎无法弄清楚如何在导出数据时将下拉列表添加到列中。这是我的导出类的简化版本:namespace App\Exports;use Maatwebsite\Excel\Concerns\FromCollection;use Maatwebsite\Excel\Concerns\WithHeadings;use Maatwebsite\Excel\Concerns\WithStrictNullComparison;class ActionItemExport implements FromCollection, WithHeadings, WithStrictNullComparison{    public function collection()    {        return $this->getActionItems();    }    public function headings(): array    {        $columns = [            'Column 1',            'Column 2',            'Column 3',            'Column 4',            'Column 5',            'Column 6',            'Column 7'        ];        return $columns;    }    private function getActionItems()    {        $select = 'column1, column2, column3, column4, column5, column6, column7';        $query = \DB::table('action_items')->select(\DB::raw($select));        $query->whereNull('action_items.deleted_at');        $ai = $query->orderBy('column1')->get();        return $ai;    }}我想做的是查询具有 column1 选项的查找表,并将这些值用于列中的下拉列表,以便当用户想要更改 Excel 工作表时,它们仅限于下拉值.在文档中它提到使用\Maatwebsite\Excel\Sheetor \Maatwebsite\Excel\Writer,但我什至不确定在哪里使用它们,或者使用哪个。在我的搜索过程中,我似乎无法拼凑出一个解决方案,因此我们将不胜感激。我在用着:maatwebsite/excel 3.1、php 7.2、laravel 5.8
查看完整描述

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

                }

            },

        ];

    }

}


查看完整回答
反对 回复 2022-05-27
  • 1 回答
  • 0 关注
  • 441 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号