支持: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("请重试");
}
}

  

最新文章

  1. javascript数组查重方法总结
  2. LoadRunner11.0下载及安装链接~(By网络)
  3. 关于mvc、webapi中get、post、put、delete的参数
  4. 【JAVA版】Storm程序整合Kafka、Mongodb示例及部署
  5. 转载 SharePoint【Site Definition 系列】– 创建Content Type
  6. spring与axis2整合发布webservice
  7. Windows下C++多线程同步与互斥简单运用
  8. [LeetCode]题解(python):058-Length of Last Word
  9. [译]Java设计模式之解释器
  10. 24个JavaScript初学者最佳实践
  11. Linux监控体系
  12. react中需要用到【深度复制】的问题
  13. AndroidStudio 快捷键 Ctrl+Q查询过慢的问题
  14. Docker 私有仓库建立(加密和用户验证)
  15. Netty(一)——Netty入门程序
  16. iBtais 多重嵌套循环
  17. Laravel Providers——服务提供者的注册与启动源码解析
  18. 云笔记项目-Spring事务学习_测试准备
  19. Spring Boot(十六):使用 Jenkins 部署 Spring Boot
  20. Java并发程序设计(三) Java内存模型和线程安全

热门文章

  1. 51nod1127【尺取】
  2. bzoj 4504: K个串【大根堆+主席树】
  3. bzoj 4036: [HAOI2015]按位或【min-max容斥+FWT】
  4. bzoj 4403: 序列统计【lucas+组合数学】
  5. Adore
  6. 如何使用webstorm去操作git
  7. 黑客攻防技术宝典web实战篇:攻击其他用户习题
  8. scrapy 连接错误
  9. zabbix自定义item(v3.4)
  10. Python 教程资源