设置 Laravel-excel 和 PhpSpreadsheet 宏

Setting up Laravel-excel and PhpSpreadsheet macro

我正在使用 Maatwebsite Laravel-excel 3.1 版。我想设置 sheet 的默认样式。我已经阅读了有关通过在我的 AppServiceProvider boot() 方法中设置宏来在 laravel 应用程序中包含宏的文档。 :

Sheet::macro('getDefaultStyle',function(Sheet $sheet){
        $sheet->getDefaultStyle();
    });

但是当我每次重新加载页面时它都会崩溃页面并且我的 cmd 中的 laravel 服务器停止并重新 运行。这是我的 Export.php 样子:

 public function registerEvents():array 
{
    return[
        AfterSheet::class=>function(AfterSheet $event){

    $header_style_array = [
        'font'=>['bold'=>true]
    ];
    $style_array = [
        'font'=>['bold'=>true]
    ];
            $event->sheet->getStyle('A1:B1')->getAlignment()->setHorizontal('center');
            $event->sheet->getStyle('A1:B1')->applyFromArray($header_style_array);
            $event->sheet->getDefaultStyle()->getFont()->setSize(5);
    }];
}

我已经在 Export.php 文件上方添加了 use Maatwebsite\Excel\Concerns\WithEvents; use Maatwebsite\Excel\Events\AfterSheet;

有什么我遗漏的吗?我发现这很难设置。并且几乎没有关于设置它的文章。

任何帮助将不胜感激 参考:https://phpspreadsheet.readthedocs.io/en/latest/topics/recipes/#styles https://docs.laravel-excel.com/3.1/exports/extending.html

如果您查看 PhpSpreadsheet 的文档,我想您会发现 getDefaultStyle() 方法无法从活动 sheet.

访问

到LaravelExcel,$event->sheet相当于$spreadsheet->getActiveSheet()。这就是为什么您当前的配置不起作用的原因。

// this doesn't work
// $spreadsheet->getActiveSheet()->getDefaultStyle()->getFont()->setSize(5);

// this does
$spreadsheet->getDefaultStyle()->getFont()->setSize(5);

你应该在 BeforeWriting.

中通过编写器设置默认样式
public function registerEvents():array
{
    return [
        BeforeWriting::class=>function(BeforeWriting $event){
            $event->writer->getDefaultStyle()->getFont()->setSize(5);
        },
    ];
}

如果你想把它变成一个宏,你应该使用 Writer 宏而不是 Sheet 宏。
https://docs.laravel-excel.com/3.1/exports/extending.html#writer

public function registerEvents():array
{
    Writer::macro('setDefaultStyle', function (Writer $writer) {
        $writer->getDefaultStyle()->getFont()->setSize(5);
    });

    return [
        BeforeWriting::class=>function(BeforeWriting $event){
            $event->writer->setDefaultStyle();
        },
    ];
}