laravel Excel3.1インポートファイルのエクスポート

44540 ワード

Laravel:7.6 excel:3.1この文書は一部の操作にのみ関連しています.詳細はExcelの公式ドキュメントを参照してください.
  • Excel GitHub公式アドレス:https://github.com/maatwebsite/Laravel-Excel
  • Excel公式ドキュメントアドレス:https://docs.laravel-excel.com/3.1/getting-started/

  • インストール要件:
  • PHP: ^7.0
  • Laravel: ^5.5
  • PhpSpreadsheet: ^1.6
  • php_zip PHP拡張機能有効
  • php_xml PHP拡張機能有効
  • php_gd 2 PHP拡張
  • 有効
    Excel 3をインストールします.1クラスライブラリ
    composer require maatwebsite/excel
        3.1  
    composer require maatwebsite/excel ~3.1.0
    

    1.インポートの作成
    php artisan make:import CustomerImport --model=Customer
    

    実行すると、Appの下にImportフォルダが自動的に作成され、インポートファイルが自動的に生成されます.
    2.ファイルコードのインポート:
    <?php
    
    namespace App\Imports;
    
    use App\Model\Customer;
    use App\Model\Position;
    use Maatwebsite\Excel\Concerns\ToArray;
    use Maatwebsite\Excel\Concerns\WithBatchInserts;
    use Maatwebsite\Excel\Concerns\WithChunkReading;
    //use Maatwebsite\Excel\Concerns\WithHeadingRow;
    
    class CustomersImport implements ToArray,WithBatchInserts,WithChunkReading
    {
        /**
         *      
         *
         * @param array $array
         */
        public function array(array $array)
        {
            #       
            for ( $i = 1; $i <= count( $array ) -1; $i++ ) {
                if( !isset( $array[$i] ) ) {
                    continue;
                }
                $data[$i-1]['***'] = $array[$i][0];
                $data[$i-1]['***'] = $array[$i][4];
                $data[$i-1]['***'] = $array[$i][5];
                $data[$i-1]['***'] = $array[$i][6];
                #     '#'                  
                $data[$i-1]['***'] = str_replace( '#' , '-' , $array[$i][2] );
            }
    
            #                 
            $data = collect( $data );
    
            #       
            $data = $data->unique( '****' );
    
            $data = json_decode( json_encode( $data ) , 256 );
    
            #       
            $data = array_values( $data );
    
            $customer_data = Customer::getAllCustomer();
    
            $customer_data = json_decode( json_encode( $customer_data ) , 256 );
    
            #       
            for ( $j = 0; $j <= count( $customer_data ) -1; $j++ ) {
                foreach ( $data as $k => $v ) {
                    if( $data[$k]['***'] == $customer_data[$j]['***'] ) {
                        unset( $data[$k] );
                    }
                }
            }
    
            #       
            $res = Customer::insertCustomerData( $data );
    
            return $res;
        }
    
    
        /**
         *      
         *       (    )
         * @param array $row
         *
         * @return \Illuminate\Database\Eloquent\Model|null
         */
        public function model(array $row)
        {
    //        print_r( $row );exit;
            $data = Customer::getAllCustomer();
    
            $data = json_decode( json_encode( $data ) , 256 );
    
            #     
            $repeat = 0;
            foreach ( $data as $k => $v ) {
                if( $data[$k]['***'] == $row['****'] ) {
                    $repeat++;
                }
            }
    
            if( $repeat == 0 ) {
                $res = new Customer([
                    'name' => $row['***'],
                    'mobile' => $row['****'],
                    'wechat' => $row['****'],
                    'qq' => $row['****'],
                ]);
    
                return $res;
            }
        }
    
    
        /**
         *         
         *
         * @return int
         */
        public function batchSize(): int
        {
            return 1000;
        }
    
    
        /**
         *        
         *
         * @return int
         */
        public function chunkSize(): int
        {
            return 1000;
        }
    }
    
    

    3.コントローラ呼び出しのインポート
    #     
        public function importCustomerData( Request $request ) {
            #   
            $file = $request->file( 'file' );
    
            #        
            if( $file->getError() == 1 ) {
                return $this->fail( 400 , '    PHP        ' );
            } elseif ( $file->getError() == 2 ) {
                return $this->fail( 400 , '              ' );
            } elseif ( $file->getError() == 3 ) {
                return $this->fail( 400 , '       ,     ' );
            } elseif ( $file->getError() == 4 ) {
                return $this->fail( 400 , '       ' );
            } elseif ( $file->getError() == 6 ) {
                return $this->fail( 400 , '        ' );
            } elseif ( $file->getError() == 7 ) {
                return $this->fail( 400 , '      ' );
            }
    
            #         
            $path = $file->getRealPath();
    
            #      
            if( $file->getClientOriginalExtension() != 'xlsx' && $file->getClientOriginalExtension() != 'xls' ) {
                return $this->fail( 400 , '      ' );
            }
    
            Excel::import(new CustomersImport() , $path , null , \Maatwebsite\Excel\Excel::XLSX );
    
            return $this->success( '     ,             ' );
        }
    

    これでインポート機能が完了しました
    4.エクスポートの作成
    php artisan make:export CustomerExport --model=Customer
    

    5.ファイルコードのエクスポート:
    
    
    namespace App\Exports;
    
    use Maatwebsite\Excel\Concerns\FromCollection;
    use Maatwebsite\Excel\Concerns\WithEvents;
    use Maatwebsite\Excel\Concerns\WithHeadings;
    use Maatwebsite\Excel\Events\AfterSheet;
    use phpDocumentor\Reflection\Types\Collection;
    
    class CustomerExport implements FromCollection,WithHeadings,WithEvents
    {
        //       
        protected $data;
    
        public function __construct( array $data )
        {
            return $this->data = $data;
        }
    
    
        /**
         *     
         *
         * @return Collection
         */
        public function collection()
        {
            if (!empty($this->data)) {
                //           ,    
                foreach ($this->data as $key => $vo) {
                    //           excel       ,          " ",  :$str = $str . ' ';
                    $this->data[$key]['****'] = $vo['***'] . ' ';
                    $this->data[$key]['time'] = date( 'Y-m-d H:i:s' , $vo['time'] ) . ' ';
                }
            }
    
    //        print_r( $this->data );exit;
            return collect( $this->data );
        }
    
    
        /**
         *          ,     ,                     
         *
         * @return array
         */
        public function headings(): array
        {
            return [
                '  ',
                '   ',
                '  ',
                'QQ',
            ];
        }
    
    
        /**
         * registerEvents.
         *     
         * @return array
         */
        public function registerEvents(): array
        {
            return [
                //           
                AfterSheet::class => function (AfterSheet $event) {
                    //      
    //                $event->sheet->getDelegate()->setMergeCells(['A2:L2', 'B11:E11', 'A12:L12']);
                    //          
    //                $event->sheet->getDelegate()->getStyle('A2:L2')->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER);
    //                $event->sheet->getDelegate()->getStyle('A3:L3')->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER);
                    //      
                    $widths = ['A' => 10, 'B' => 15, 'C' => 30, 'D' => 12, 'E' => 14, 'F' => 14, 'G' => 14, 'H' => 10, 'I' => 18, 'J' => 14, 'K' => 10];
                    foreach ($widths as $k => $v) {
                        //      
                        $event->sheet->getDelegate()->getColumnDimension($k)->setWidth($v);
                    }
    
                },
            ];
        }
    }
    
    

    6.コントローラ呼び出しのエクスポート:
    #     
        public function exportCustomerData() {
            $data = Customer::getAllCustomer();
    
            $data = $this->jsonToArray( $data );
    
            if( empty( $data ) ) {
                return $this->fail( 404 , '     ' );
            }
    
            return Excel::download( new CustomerExport( $data ) , '  .xlsx' );
        }
    

    これでエクスポート機能が完了しました