laravel-excel使用導出

46362 ワード

laravel-excel使用
  • 公式文書
  • compser[compserダウンロードアドレス](require maatwebsite/laravel-excel-light)
  • インストールに必要なPHP拡張とcompser依存拡張
  •   "require": {
        "ext-json": "*",
        "php": "^7.0",
        "phpoffice/phpspreadsheet": "^1.6",
        "illuminate/support": "5.5.*|5.6.*|5.7.*|5.8.*",
        "opis/closure": "^3.1"
      },
      "require-dev": {
        "phpunit/phpunit": "^8.0",
        "mockery/mockery": "^1.1",
        "orchestra/testbench": "^3.8",
        "orchestra/database": "^3.8",
        "predis/predis": "^1.1"
      }
    
    ここのlaravelはphpoffice/phpspreadsheet compserパッケージが必要ですので、それをインストールする必要があります.php拡張が必要です.
    "require": {
            "php": "^5.6|^7.0",
            "ext-ctype": "*",
            "ext-dom": "*",
            "ext-gd": "*",
            "ext-iconv": "*",
            "ext-fileinfo": "*",
            "ext-libxml": "*",
            "ext-mbstring": "*",
            "ext-SimpleXML": "*",
            "ext-xml": "*",
            "ext-xmlreader": "*",
            "ext-xmlwriter": "*",
            "ext-zip": "*",
            "ext-zlib": "*",
            "psr/simple-cache": "^1.0",
            "markbaker/complex": "^1.4",
            "markbaker/matrix": "^1.1"
        },
    
    エクスポート
  • は、クラスを作り出すために作成され、この特定の導出には、リード論理php artisan make:export LiYiExportの後にパラメータ--model=
  • を追加することができる.
  • セットで導出され、これはインターフェースuse Maatwebsite\Excel\Concerns\FromCollection;
  • を引き継ぐ必要がある.
    use Illuminate\Database\Eloquent\Collection;
    use Maatwebsite\Excel\Concerns\FromCollection;
    
    class LiYiExport implements FromCollection
    {
        public function collection()
        {
            // TODO: Implement collection() method.
            /*
             *    : model       all();
             * LiYiModel::all();
             */
    
            if (!true) {
                return $result = LiYiModel::all();
            }
            /**
             *    :          ,
             */
            $result = [
                [1,2,3],
                [4,5,6],
                [7,8,9]
            ];
    
            return new Collection($result);
        }
    }
    
    Collection類がここに見られます.彼はclass Collection extends BaseCollection implements QueueableCollectionで、class Collection implements ArrayAccess, Arrayable, Countable, IteratorAggregate, Jsonable, JsonSerializableから継承されています.Collectionの構造方法において:
        public function __construct($items = [])
        {
            $this->items = $this->getArrayableItems($items);
        }
        
        protected function getArrayableItems($items)
        {
            if (is_array($items)) {
                return $items;
            } elseif ($items instanceof self) {
                return $items->all();
            } elseif ($items instanceof Arrayable) {
                return $items->toArray();
            } elseif ($items instanceof Jsonable) {
                return json_decode($items->toJson(), true);
            } elseif ($items instanceof JsonSerializable) {
                return $items->jsonSerialize();
            } elseif ($items instanceof Traversable) {
                return iterator_to_array($items);
            }
    
            return (array) $items;
        }
    
  • 配列から導出され、これはインターフェースuse Maatwebsite\Excel\Concerns\FromArray;
  • を継承する必要がある.
    class LiYiExport implements FromArray
    {
        public function array(): array
        {
            $result = [
                 [1,2,3],
                 [4,5,6],
                 [7,8,9]
                    ];
        }
    }
    
  • laravelのormクエリデータから導出され、これはインターフェースuse Maatwebsite\Excel\Concerns\FromQuery;
  • を継承する必要がある.
    class LiYiExport implements FromQuery
    {
        public function query()
        {
            return LIYiModel::query()->select()->where()->orderBy();
        }
    }
    
    注意:query()方法では、orm方法のget()方法は絶対に使わないでください.その下の動作はchunk()法を使用する必要があります.つまり、導出を異なる小塊に分けて行うということです.chunk()法では、最初のパラメータは処理毎の数の大きさで、第二のパラメータは一つのクローズドです.
  • ディショナーによって導出され、これはインターフェースuse Maatwebsite\Excel\Concerns\FromIterator;
  • を引き継ぐ必要がある.
    class LiYiExport implements FromIterator
    {
        public function iterator(): Iterator
        {
            
        }
    }
    
  • は、外部にエクスポートを呼び出し、コントローラを作成し、外部からの呼び出しの方法を提供する.
  • は、ローカル
  • に導出される.
    
    /**
     * Notes:
     * File name:DownloadExcel
     * Create by: Jay.Li
     * Created on: 2019\6\18 0018 11:51
     */
    
    use Maatwebsite\Excel\Facades\Excel;
    
    class DownloadExcel
    {
        /**
         * Notes:      
         * Function Name: downloadWindows
         * User: Jay.Li
         * Date: 2019\6\18 0018
         * Time: 11:53
         */
        public function downloadWindows()
        {
            /**
             *    :     
             *    :     
             *    :      ,   null,    xslx  ,
             *    :       header      ,    
             */
            Excel::download(new LiYiExport(), 'test.csv','','');
        }
    }
    
    
  • は、ディスク
  • に導出される.
    
    /**
     * Notes:
     * File name:DownloadExcel
     * Create by: Jay.Li
     * Created on: 2019\6\18 0018 11:51
     */
    
    use Maatwebsite\Excel\Facades\Excel;
    
    class DownloadExcel
    {
        /**
         * Notes:      ,       
         * Function Name: downloadStore
         * User: Jay.Li
         * Date: 2019\6\18 0018
         * Time: 11:55
         */
        public function downloadStore()
        {
            /**
             *    :        
             *    :      
             *    :           ,    
             *    :       ,      null,   Excel::XLSX
             *    :        ,       
             *
             */
            Excel::store(new LiYiExport(), 'test.csv', 's3',Excel::XLSX,'');
        }
    }
    
  • はフォーマットを導出して、この拡張パケットの名前はlaravel-excelですが、エクセルだけではなく、多くのフォーマットのファイルをサポートしています.Maatwebsite\Excel\Excelファイルに定義があります.
  • class Excel implements Exporter, Importer
    {
        use RegistersCustomConcerns;
    
        const XLSX     = 'Xlsx';
    
        const CSV      = 'Csv';
    
        const TSV      = 'Csv';
    
        const ODS      = 'Ods';
    
        const XLS      = 'Xls';
    
        const SLK      = 'Slk';
    
        const XML      = 'Xml';
    
        const GNUMERIC = 'Gnumeric';
    
        const HTML     = 'Html';
    
        const MPDF     = 'Mpdf';
    
        const DOMPDF   = 'Dompdf';
    
        const TCPDF    = 'Tcpdf';
    }    
    
  • 自分の必要なタイトル行を設定します.これはインターフェースuse Maatwebsite\Excel\Concerns\WithHeadings;
  • を引き継ぐ必要があります.
    class LiYiExport implements FromQuery, WithHeadings
    {
        public function query()
        {
            return LIYiModel::query()->select()->where()->orderBy();
        }
        
        public function headings(): array
        {
            return [
                '   ',
                '   ',
                '   ',
            ];
        }
    }
    
    handdings()方法は1つの配列を返します.1次元配列でも良いし、2次元配列でもいいです.2次元配列は複数の行を返します.
  • エクスポートスタイルを設定します.これは継承インターフェースuse Maatwebsite\Excel\Concerns\WithEvents;use Maatwebsite\Excel\Events\AfterSheet;
  • を必要とします.
    class LiYiExport implements FromQuery, WithHeadings, AfterSheet
    {
        public function query()
        {
            return LIYiModel::query()->select()->where()->orderBy();
        }
        
        public function registerEvents(): array
        {
            return [
                AfterSheet::class => function(AfterSheet $event) {
                    //    sheet   
                    $workSheet = $event->sheet()->getDelegate();
                    //       16;
                    $cellRange = 'A1:W1';
                    $workSheet->getStyle($cellRange)->getFont()->getSize(16);
    
                    //         B2:G8     
                    $styleArray = [
                        'borders' => [
                            'outline' => [
                                'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THICK,
                                'color' => ['argb' => 'FFFF0000'],
                            ]
                        ]
                    ];
    
                    //     
                    $end = $workSheet->getCellCollection()->getHighestRow();
    
                    $cellRangeContent = 'A2:W'.$end;
                    //      
                    $workSheet->getStyle($cellRangeContent)->applyFromArray($styleArray);
    
                    //        
    
                    $arrayColumn = [
                        'B' => 30,
                        'D' => 60,
                        'G' => 90,
                    ];
                    foreach ($arrayColumn as $k => $item) {
                        //      ,      
                        $workSheet->getColumnDimension($k)->setWidth($item);
                    }
    
                    //      ,    
                    $workSheet->getStyle($cellRangeContent)->getAlignment()
                        ->setWrapText(true)->setVertical("center")
                        ->setHorizontal("center");
                }
            ];
        }
    }
    
    この中には2つの注意が必要です.register Events();この関数は1つの配列であり、2.キー値はMaatwebsite\Excel\Events\AfterSheetというクラスであり、クローズド関数依存注入use Maatwebsite\Excel\Events\AfterSheet;はその構成関数を通して構成されている.
        public function __construct(Sheet $sheet, $exportable)
        {
            $this->sheet      = $sheet;
            $this->exportable = $exportable;
        }
    
    インジェクション
        public function __construct(Worksheet $worksheet)
        {
            $this->worksheet            = $worksheet;
            $this->chunkSize            = config('excel.exports.chunk_size', 100);
            $this->temporaryFileFactory = app(TemporaryFileFactory::class);
        }
    
    github住所は皆さんの交流と学習を歓迎します.