• 用laravel MaatwebsiteExcel 教你导出漂亮的Excel表单


    先来看效果图

    还算是漂亮吧 哈哈哈。

    第一步当然是安装包咯

    环境要求

    PHP: ^7.0
    Laravel: ^5.5

    composer require maatwebsite/excel   

    目前3.1 只支持 Laravel 5.5 以上,所以会自动注册

    发布配置文件:

     php artisan vendor:publish

    好了 就这么简单。

    接下来就是使用啦。

    excel 导出

    代码尽量做到解耦,所以导入导出的代码不要和原来的业务耦合。我们新建一个UserExport

    php artisan make:export UsersExport --model=User
    .
    ├── app
    │   ├── Exports
    │   │   ├── UsersExport.php
    │ 
    └── composer.json

    UserExport的代码

    <?php
    
    namespace AppExports;
    
    use AppUser;
    use MaatwebsiteExcelConcernsFromCollection;
    
    class UsersExport implements FromCollection
    {
        public function collection()
        {
            return User::all();
        }
    }

    业务控制器中的调用

     public function export() 
        {
            return Excel::download(new UsersExport, 'users.xlsx');
        }

    这样最简单的导出就好了。

    接下来我们聊一聊美化的东西。

    首先我们创建一个基类BaseExport,子类直接继承就可以了,从而不用重复写。

    这是我的BaseExport代码

    <?php
    
    namespace AppExports;
    
    use MaatwebsiteExcelConcernsShouldAutoSize;
    use MaatwebsiteExcelConcernsWithEvents;
    use MaatwebsiteExcelConcernsWithStrictNullComparison;
    use MaatwebsiteExcelEventsAfterSheet;
    
    class BaseExport implements WithEvents, WithStrictNullComparison, ShouldAutoSize
    {
        /**
         * 注册事件
         * @return array
         */
        public function registerEvents(): array
        {
            return [
                AfterSheet::class => function (AfterSheet $event) {
                    //设置作者
                    $event->writer->setCreator('寞小陌');//writer属性现在好像有点问题。。。
                    //设置列宽
                    $event->sheet->getDelegate()->getColumnDimension('A')->setWidth(50);
                    //设置区域单元格垂直居中
                    $event->sheet->getDelegate()->getStyle('A1:Z1265')->getAlignment()->setVertical('center');
                    //设置区域单元格水平居中
                    $event->sheet->getDelegate()->getStyle('A1:Z1265')->getAlignment()->setHorizontal('center');
                    //设置区域单元格字体、颜色、背景等,其他设置请查看 applyFromArray 方法,提供了注释
                    $event->sheet->getDelegate()->getStyle('A1:Z1')->applyFromArray([
                        'font' => [
                            'name' => 'Arial',
                            'bold' => true,
                            'italic' => false,
                            'strikethrough' => false,
                            'color' => [
                                'rgb' => 'FFFFFF'
                            ]
                        ],
                        'fill' => [
                            'fillType' => 'linear', //线性填充,类似渐变
                            'rotation' => 45, //渐变角度
                            'startColor' => [
                                'rgb' => '54AE54' //初始颜色
                            ],
                            //结束颜色,如果需要单一背景色,请和初始颜色保持一致
                            'endColor' => [
                                'argb' => '54AE54'
                            ]
                        ]
                    ]);
              //合并单元格
              $event->sheet->getDelegate()->mergeCells('A1:B1');
    } ]; } }

    最重要的就是WithEvents接口了,但是我们先说说WithStrictNullComparison这个接口,继承了这个接口能让你丢失的0全部给你补回来哈哈哈。

    ShouldAutoSize接口让你的表格大小自适应,不是特别重要,但是用了会好点。

    接下来再来说说第一个接口。

    里面我找到最好用的还是垂直居中和水平居中的方法了。让表单瞬间好看很多,犹豫我们继承了自适应,所以一般也用不到设置列宽啊行高这类的。

    然后设置区域内单元格的字体、颜色、背景等。我喜欢把标题加个背景色,这样能让数据和标题有个明显的区分。看起来也比较舒服。

    具体看代码里的备注吧,还是比较清楚的。

    接下来说一声多表单导出的问题。

    直接上代码

    <?php
    
    namespace AppExports;
    
    use MaatwebsiteExcelConcernsWithMultipleSheets;
    
    class FlatAccountMultipleExport implements WithMultipleSheets
    {
        private $user;
        private $lang;
        private $request;
    
        public function __construct($user, $lang, $request)
        {
            $this->user = $user;
            $this->lang = $lang;
            $this->request = $request;
        }
    
        public function sheets(): array
        {
            $sheets = [
                new FlatAccountExport($this->user, $this->lang, $this->request),
                new LendingSubsidiaryExport($this->user, $this->lang, $this->request)
            ];
            return  $sheets;
        }
    }

    sheets方法里面返回的数组就是个多表单。

    接下来就是单个表单的事,都和上面的一样。

    本文属于个人原创,欢迎转载,转载请附链接:https://www.cnblogs.com/x-x-j/p/12118608.html

  • 相关阅读:
    Atcoder Grand Contest 003 题解
    Atcoder Grand Contest 002 题解
    Atcoder Grand Contest 001 题解
    网络流24题
    AGC005D ~K Perm Counting
    loj6089 小Y的背包计数问题
    CF932E Team Work
    组合数学相关
    SPOJ REPEATS
    [SDOI2008]Sandy的卡片
  • 原文地址:https://www.cnblogs.com/x-x-j/p/12118608.html
Copyright © 2020-2023  润新知