laravel-excel导入导出
安装 composer require maatwebsite/excel 注意3.0与2.0几乎完全不同的,文档也不同 3.1文档: https://laravel-excel.maatwebsite.nl/3.1/getting-started/ 1.导出 推荐导出文档: https://blog.csdn.net/beyond__devil/article/details/83008782 https://blog.csdn.net/u010324331/article/details/83658747 构造类 use App\Extensions\myapp\Models\Goods; //商品model use Maatwebsite\Excel\Concerns\FromCollection; //excel表单字段集 必备 use Maatwebsite\Excel\Concerns\WithHeadings; //excel标题行 class GoodsExport implements FromCollection, WithHeadings { public function __construct($post) {// 如果需要的话可以通过构造函数传递参数 $this->post = []; if(is_array($post) && count($post)>0) { $this->post = $post; } } public function collection() { // return Goods::select('goods_name','price','stock')->get();// 查询数据直接返回 } public function headings(): array { //表格列头标题 WithHeadings return array( '商品名', '售价', '库存'); } } 调用 实例化的时候可以通过构造函数传递参数, 用于数据库查询 use Excel; use App\Extensions\myapp\Controllers\Admin\Excel\GoodsExport; public function exportGoods(Request $request) { return Excel::download(new GoodsExport($request->all()), '商品导出表.xlsx');//直接下载 }
1.5 导出队列任务 针对需要导出大量数据的情况
使用方法分两种,隐式、显示。
1.直接创建队列任务 Excel::queue(new OrdersExport($request->all()), $ExportTask->filename, 'public'); 将存储到服务器 publc存储目录下。
2.隐式,OrdersExport()导出类中继承 use Illuminate\Contracts\Queue\ShouldQueue; 即可,正常使用Excel::store()存储到指定位置。
官文: https://docs.laravel-excel.com/3.1/exports/queued.html
可使用chain方法 增加最后执行任务,将在导出队列任务完全成功执行完成后调用。 Excel::queue()->chain([ new OrdersExportQueue($ExportTask->toArray()) ]);
2.导入 // 注意导入文件数据量可能过大,因此最好通过队列执行,每次导入一部分,通过标记跳过已导入的部分。。。导入同样可用queue加入队列任务,这里我自己写的方法,递归创建导入队列 构造类 use Maatwebsite\Excel\Concerns\ToCollection; use Illuminate\Support\Collection; use App\Extensions\myapp\Jobs\ProductImportQueue; // 队列 use App\Extensions\myapp\Models\Product; class ProductImport implements ToCollection { public $path; public function __construct($path) { $this->path = $path; } public function collection(Collection $rows) { // 缓存读取已导入数量 // 循环导入100条 // 若未导入完成,记录缓存,并重新创建队列 (或者重新执行队列?) // dispatch(new ProductImportQueue($this->path)); } } 调用 use Illuminate\Support\Facades\Storage; use App\Extensions\myapp\Controllers\Admin\Excel\ProductImport; use Excel; public function importProduct(Request $request) { $file = $request->file('goods_excel'); // 通过laravel的request获取文件 if ($file && $file->isValid()) { // 获取文件相关信息 $originalName = $file->getClientOriginalName(); // 文件原名 $ext = $file->getClientOriginalExtension(); // 扩展名 // $realPath = $file->getRealPath(); //临时文件的绝对路径 // $type = $file->getClientMimeType(); // image/jpeg if($ext!='xlsx' && $ext!='xls'){ return $this->responseAjax('fail','请上传excel文件'); } $filename = $originalName; if(Storage::disk('public')->exists('uploads/'.$filename)) { return $this->responseAjax('fail','文件已上传'); } // 上传文件 存于服务器 Storage::disk('public')->makeDirectory('uploads'); Storage::disk('public')->putFileAs('uploads',$file,$filename); //执行同步 $path = 'public/uploads/'.$filename; Excel::import(new ProductImport($path), $path); // use App\Extensions\myapp\Jobs\ProductImportQueue; // dispatch(new ProductImportQueue($path)); 加入队列 } }