安裝 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)); 加入隊列 } }