laravel 數據導出


支持:php 7.0 以上

三種方案總結介紹:

   第一種:最簡單且不會有長久隱患。但不適合數據量多

   第二種:  適合中等數據量,不會有長久隱患。但導出時極占內存

  第三種:適合大量數據,不會占據大量內存。但響應時間長,且excel文件生成后需自己逐漸刪除,否則會導致生成的文件過多,會產生長久隱患

第一種方案:少量數據導出

1.下載 composer require maatwebsite/excel        (版本在3.0以上,建議直接最新版本)
2.注冊(app.php中)

   'providers' => [
    Maatwebsite\Excel\ExcelServiceProvider::class,
  ]
,
  'aliases' => [
    'Excel' => Maatwebsite\Excel\Facades\Excel::class,
  ]
3.提取出配置文件 php artisan vendor:publish

4.用法
  a.創建export類 例:php artisan make:export MembersExport
  b.在MembersExport 中繼承
      FromArray, //從數組中導出
      WithStrictNullComparison, //嚴格數據類型

  使用 Exportable trait類 //實現下載和保存

  並分別實現array():array 方法 和 title(): string 方法

  例:MembersExport中 的寫法

  

  namespace App\Exports;

  use Maatwebsite\Excel\Concerns\Exportable;
  use Maatwebsite\Excel\Concerns\FromArray;
  use Maatwebsite\Excel\Concerns\WithStrictNullComparison;
  use Maatwebsite\Excel\Concerns\WithTitle;

  class MembersExport implements FromArray,WithStrictNullComparison,WithTitle
  {
   use Exportable;
   protected $data=[];
   protected $sheetname='';
   public function __construct($data,$title)
   {
$this->data=$data;
$this->sheetname=$title;
   }

  public function array(): array
   {
   return $this->data;
  }
  //這是多頁腳使用的方法,該方案無需用到
   public function title(): string
   {
   return "sheet".$this->sheetname;
   }
  }

  c.控制器中使用
  $excelmode=new MembersExport($data,$title);
  return $excelmode->download($filename,\Maatwebsite\Excel\Excel::XLSX);
第二種方案:中量數據導出 (1000-10000)(原理:excel多腳頁)
  1.新建multyExport類 例: php artisan make:export MultyExport
  2.繼承WithMultipleSheets類
  3.類中添加一個新建腳頁的方法 addsheet($data,$sheetname,$exportmodel)
  例:
    

  namespace App\Exports;

  use Maatwebsite\Excel\Concerns\Exportable;
  use Maatwebsite\Excel\Concerns\WithMultipleSheets;

  class MutipleExport implements WithMultipleSheets
  {
  use Exportable;

  protected $sheetdata=[];

   public function sheets(): array
  {
   return $this->sheetdata;
   }

  public function addsheet($data,$title,$model){
  $this->sheetdata[]=new $model($data,$title);
  return $this;
  }
  }

  4.在 導出的類 中 如MemberExport 將該類繼承WithTitle接口類
    並實現方法 (第一種方案中已寫
    public function title(): string
    {
      return "sheet".$this->sheetname;
    }
  5.控制器中用法
    

//導出多腳頁實現頁面
public function exportmulty(Request $request){
$all=$request->except('_token','_method');
//dd($all);
$excelmodel=new MutipleExport();
$chunksize=config('excel.exports.chunk_size');
try{
$data=Members::where('status','=',1)->chunk($chunksize,function($list) use($excelmodel){
$key=date('YmdHis').mt_rand(10000,99999);
$list=json_decode(json_encode($list),true); //將集合轉化為數組
$excelmodel->addsheet($list,$key,'App\Exports\MembersExport'); //添加excel頁腳
});
$filename=date('Y_m_d_H_i_s').md5(date('YmdHis').mt_rand(10000,99999)).'.xlsx'; //隨機生成文件名
$excelmodel->store($filename,'excel',Excel::XLSX); //先保存為文件, 參數順序依次為 文件名稱和路徑  filesystems.php配置文件中自定義配置(參考public)  生成文件后綴
$filepath=storage_path('app/public/excel/'.$filename); //已經保存的文件名及路徑
if(file_exists($filepath)){
return response()->download($filepath,'ceshi.xlsx')->deleteFileAfterSend(true); //下載並刪除
}else{
return response("請重試");
}
}catch (\Exception $exception){
return response("請重試");
}
}


第三種方案:大量數據導出  (10000以上) (原理:保存為多個文件,壓縮后下載)
  1.下載zipper插件 composer require chumper/zipper
  2.注冊 'providers' => [
    \Chumper\Zipper\ZipperServiceProvider::class
  ],
  'aliases' => [
    'Zipper'=>\Chumper\Zipper\Facades\Zipper::class
  ]
  3.控制器中使用
   
    

//導出壓縮包實現頁面
public function exportzip(Request $request){
$all=$request->except('_token','_method');

$zip=storage_path('app/public/excel.zip'); //設定一個壓縮包
$zipper=Zipper::make($zip); //打開或生成設定的壓縮包
$chunksize=config('excel.exports.chunk_size');
try{
$data=Members::where('status','=',1)->chunk($chunksize,function($list) use($zipper){ //分批處理
$key=date('YmdHis').mt_rand(10000,99999);
$list=json_decode(json_encode($list),true);
$excelmodel=new MembersExport($list,$key);
$filename=md5(date('YmdHis').mt_rand(10000,99999)).'.xlsx';
$res=$excelmodel->store($filename,'excel',Excel::XLSX); //先保存為excel文件
if($res){
$zipper->add('storage/excel/'.$filename); //添加到壓縮包中
}else{
$excelmodel->store($filename,'excel',Excel::XLSX);
$zipper->add('storage/excel/'.$filename);
}
});
$zipper->close(); //關閉壓縮包
if(file_exists($zip)){
return response()->download($zip,'ceshi.zip')->deleteFileAfterSend(true); //下載后刪除
}else{
return response("請重試");
}
}catch (\Exception $exception){
return response("請重試");
}
}

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM